1,3 → 1,169 |
struc EVENT |
{ .code rd 1 |
rd 5 |
.next rd 1 ;+24 |
.prev rd 1 ;+28 |
} |
EVENT_SIZE equ 32 |
|
virtual at 0 |
EVENT EVENT |
end virtual |
|
align 4 |
init_events: |
stdcall kernel_alloc, 1024*EVENT_SIZE |
mov [events], eax |
xor eax, eax |
not eax |
mov edi, event_map |
mov [event_start], edi |
mov ecx, 128/4 |
cld |
rep stosd |
mov [event_end], edi |
ret |
|
align 4 |
proc alloc_event |
|
pushfd |
cli |
mov ebx, [event_start] |
mov ecx, [event_end] |
.l1: |
bsf eax,[ebx] |
jnz .found |
add ebx,4 |
cmp ebx, ecx |
jb .l1 |
popfd |
xor eax,eax |
ret |
.found: |
btr [ebx], eax |
mov [event_start],ebx |
sub ebx, event_map |
shl ebx, 3 |
add eax,ebx |
shl eax,5 |
add eax, [events] |
popfd |
xor ebx, ebx |
mov [eax+EVENT.next], ebx |
mov [eax+EVENT.prev], ebx |
ret |
endp |
|
align 4 |
free_event: |
pushfd |
cli |
sub eax, [events] |
shr eax, 5 |
mov ebx, event_map |
bts [ebx], eax |
shr eax, 3 |
and eax, not 3 |
add eax, ebx |
cmp [event_start], eax |
ja @f |
popfd |
ret |
@@: |
mov [event_start], eax |
popfd |
ret |
|
align 4 |
proc send_event stdcall pid:dword, event:dword |
locals |
slot dd ? |
endl |
|
mov eax, [pid] |
call pid_to_slot |
test eax, eax |
jz .fail |
|
shl eax, 8 |
cmp [PROC_BASE+eax+APPDATA.ev_count], 32 |
ja .fail |
|
mov [slot], eax |
call alloc_event |
test eax, eax |
jz .fail |
|
mov edi, eax |
mov ecx, 6 |
mov esi, [event] |
cld |
rep movsd |
|
mov esi, eax |
mov eax, [slot] |
mov edi, [PROC_BASE+eax+APPDATA.ev_last] |
mov [esi+EVENT.prev], edi |
test edi, edi |
jz .set_last |
mov [edi+EVENT.next], esi |
.set_last: |
mov edx, [PROC_BASE+eax+APPDATA.ev_first] |
test edx, edx |
jnz @F |
mov [PROC_BASE+eax+APPDATA.ev_first], esi |
@@: |
mov [PROC_BASE+eax+APPDATA.ev_last], esi |
inc [PROC_BASE+eax+APPDATA.ev_count] |
or [PROC_BASE+eax+APPDATA.event_mask], EVENT_EXTENDED |
.fail: |
ret |
endp |
|
align 4 |
proc get_event_ex stdcall, p_ev:dword, timeout:dword |
|
; push eax |
; push edx |
; mov edx, 0x400 ;bocsh |
; mov al,0xff ;bocsh |
; out dx, al ;bocsh |
; pop edx |
; pop eax |
|
.wait: |
mov ebx,[CURRENT_TASK] |
shl ebx,8 |
cmp [PROC_BASE+ebx+APPDATA.ev_count], 0 |
je .switch |
|
mov esi, [PROC_BASE+ebx+APPDATA.ev_first] |
mov edx, [esi+EVENT.next] |
mov [PROC_BASE+ebx+APPDATA.ev_first], edx |
test edx, edx |
jnz @F |
mov [PROC_BASE+ebx+APPDATA.ev_last], edx |
and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED |
@@: |
mov [edx+EVENT.prev], 0 |
dec [PROC_BASE+ebx+APPDATA.ev_count] |
|
mov eax, esi |
and dword [esi], 0xFF00FFFF |
mov edi, [p_ev] |
mov ecx, 6 |
cld |
rep movsd |
call free_event |
ret |
.switch: |
mov eax, [0x3010] |
mov [eax+TASKDATA.state], byte 5 |
call change_task |
jmp .wait |
endp |
|
sys_getevent: |
|
call get_event_for_app |
6,7 → 172,6 |
|
|
align 4 |
|
sys_wait_event_timeout: |
|
mov ebx,[timer_ticks] |
46,7 → 211,6 |
mov [esp+36],eax |
ret |
|
|
get_event_for_app: |
|
pushad |
164,17 → 328,27 |
no_stack_event: |
|
test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG |
jz no_debug_event |
jz .test_ext |
mov eax, [0x3000] |
shl eax, 8 |
test byte [eax+0x80000+APPDATA.event_mask+1], byte 1 |
jz no_debug_event |
jz .test_ext |
and byte [eax+0x80000+APPDATA.event_mask+1], not 1 |
popad |
mov eax, 9 |
ret |
no_debug_event: |
|
.test_ext: |
mov eax, [0x3000] |
shl eax, 8 |
test dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED |
jz .test_IRQ |
mov eax, 10 |
ret |
|
.test_IRQ: |
|
|
cmp dword [edi+TASKDATA.event_mask], 0xFFFF |
jbe no_events |
|
213,3 → 387,4 |
ret |
|
|
|