Rev 115 | Rev 230 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 115 | Rev 227 | ||
---|---|---|---|
Line -... | Line 1... | ||
- | 1 | struc EVENT |
|
- | 2 | { .code rd 1 |
|
- | 3 | rd 5 |
|
- | 4 | .next rd 1 ;+24 |
|
- | 5 | .prev rd 1 ;+28 |
|
- | 6 | } |
|
- | 7 | EVENT_SIZE equ 32 |
|
- | 8 | ||
- | 9 | virtual at 0 |
|
- | 10 | EVENT EVENT |
|
- | 11 | end virtual |
|
- | 12 | ||
- | 13 | align 4 |
|
- | 14 | init_events: |
|
- | 15 | stdcall kernel_alloc, 1024*EVENT_SIZE |
|
- | 16 | mov [events], eax |
|
- | 17 | xor eax, eax |
|
- | 18 | not eax |
|
- | 19 | mov edi, event_map |
|
- | 20 | mov [event_start], edi |
|
- | 21 | mov ecx, 128/4 |
|
- | 22 | cld |
|
- | 23 | rep stosd |
|
- | 24 | mov [event_end], edi |
|
- | 25 | ret |
|
- | 26 | ||
- | 27 | align 4 |
|
- | 28 | proc alloc_event |
|
- | 29 | ||
- | 30 | pushfd |
|
- | 31 | cli |
|
- | 32 | mov ebx, [event_start] |
|
- | 33 | mov ecx, [event_end] |
|
- | 34 | .l1: |
|
- | 35 | bsf eax,[ebx] |
|
- | 36 | jnz .found |
|
- | 37 | add ebx,4 |
|
- | 38 | cmp ebx, ecx |
|
- | 39 | jb .l1 |
|
- | 40 | popfd |
|
- | 41 | xor eax,eax |
|
- | 42 | ret |
|
- | 43 | .found: |
|
- | 44 | btr [ebx], eax |
|
- | 45 | mov [event_start],ebx |
|
- | 46 | sub ebx, event_map |
|
- | 47 | shl ebx, 3 |
|
- | 48 | add eax,ebx |
|
- | 49 | shl eax,5 |
|
- | 50 | add eax, [events] |
|
- | 51 | popfd |
|
- | 52 | xor ebx, ebx |
|
- | 53 | mov [eax+EVENT.next], ebx |
|
- | 54 | mov [eax+EVENT.prev], ebx |
|
- | 55 | ret |
|
- | 56 | endp |
|
- | 57 | ||
- | 58 | align 4 |
|
- | 59 | free_event: |
|
- | 60 | pushfd |
|
- | 61 | cli |
|
- | 62 | sub eax, [events] |
|
- | 63 | shr eax, 5 |
|
- | 64 | mov ebx, event_map |
|
- | 65 | bts [ebx], eax |
|
- | 66 | shr eax, 3 |
|
- | 67 | and eax, not 3 |
|
- | 68 | add eax, ebx |
|
- | 69 | cmp [event_start], eax |
|
- | 70 | ja @f |
|
- | 71 | popfd |
|
- | 72 | ret |
|
- | 73 | @@: |
|
- | 74 | mov [event_start], eax |
|
- | 75 | popfd |
|
- | 76 | ret |
|
- | 77 | ||
- | 78 | align 4 |
|
- | 79 | proc send_event stdcall pid:dword, event:dword |
|
- | 80 | locals |
|
- | 81 | slot dd ? |
|
- | 82 | endl |
|
- | 83 | ||
- | 84 | mov eax, [pid] |
|
- | 85 | call pid_to_slot |
|
- | 86 | test eax, eax |
|
- | 87 | jz .fail |
|
- | 88 | ||
- | 89 | shl eax, 8 |
|
- | 90 | cmp [PROC_BASE+eax+APPDATA.ev_count], 32 |
|
- | 91 | ja .fail |
|
- | 92 | ||
- | 93 | mov [slot], eax |
|
- | 94 | call alloc_event |
|
- | 95 | test eax, eax |
|
- | 96 | jz .fail |
|
- | 97 | ||
- | 98 | mov edi, eax |
|
- | 99 | mov ecx, 6 |
|
- | 100 | mov esi, [event] |
|
- | 101 | cld |
|
- | 102 | rep movsd |
|
- | 103 | ||
- | 104 | mov esi, eax |
|
- | 105 | mov eax, [slot] |
|
- | 106 | mov edi, [PROC_BASE+eax+APPDATA.ev_last] |
|
- | 107 | mov [esi+EVENT.prev], edi |
|
- | 108 | test edi, edi |
|
- | 109 | jz .set_last |
|
- | 110 | mov [edi+EVENT.next], esi |
|
- | 111 | .set_last: |
|
- | 112 | mov edx, [PROC_BASE+eax+APPDATA.ev_first] |
|
- | 113 | test edx, edx |
|
- | 114 | jnz @F |
|
- | 115 | mov [PROC_BASE+eax+APPDATA.ev_first], esi |
|
- | 116 | @@: |
|
- | 117 | mov [PROC_BASE+eax+APPDATA.ev_last], esi |
|
- | 118 | inc [PROC_BASE+eax+APPDATA.ev_count] |
|
- | 119 | or [PROC_BASE+eax+APPDATA.event_mask], EVENT_EXTENDED |
|
- | 120 | .fail: |
|
- | 121 | ret |
|
- | 122 | endp |
|
- | 123 | ||
- | 124 | align 4 |
|
- | 125 | proc get_event_ex stdcall, p_ev:dword, timeout:dword |
|
- | 126 | ||
- | 127 | ; push eax |
|
- | 128 | ; push edx |
|
- | 129 | ; mov edx, 0x400 ;bocsh |
|
- | 130 | ; mov al,0xff ;bocsh |
|
- | 131 | ; out dx, al ;bocsh |
|
- | 132 | ; pop edx |
|
- | 133 | ; pop eax |
|
- | 134 | ||
- | 135 | .wait: |
|
- | 136 | mov ebx,[CURRENT_TASK] |
|
- | 137 | shl ebx,8 |
|
- | 138 | cmp [PROC_BASE+ebx+APPDATA.ev_count], 0 |
|
- | 139 | je .switch |
|
- | 140 | ||
- | 141 | mov esi, [PROC_BASE+ebx+APPDATA.ev_first] |
|
- | 142 | mov edx, [esi+EVENT.next] |
|
- | 143 | mov [PROC_BASE+ebx+APPDATA.ev_first], edx |
|
- | 144 | test edx, edx |
|
- | 145 | jnz @F |
|
- | 146 | mov [PROC_BASE+ebx+APPDATA.ev_last], edx |
|
- | 147 | and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED |
|
- | 148 | @@: |
|
- | 149 | mov [edx+EVENT.prev], 0 |
|
- | 150 | dec [PROC_BASE+ebx+APPDATA.ev_count] |
|
- | 151 | ||
- | 152 | mov eax, esi |
|
- | 153 | and dword [esi], 0xFF00FFFF |
|
- | 154 | mov edi, [p_ev] |
|
- | 155 | mov ecx, 6 |
|
- | 156 | cld |
|
- | 157 | rep movsd |
|
- | 158 | call free_event |
|
- | 159 | ret |
|
- | 160 | .switch: |
|
- | 161 | mov eax, [0x3010] |
|
- | 162 | mov [eax+TASKDATA.state], byte 5 |
|
- | 163 | call change_task |
|
- | 164 | jmp .wait |
|
- | 165 | endp |
|
- | 166 | ||
1 | sys_getevent: |
167 | sys_getevent: |
Line 2... | Line 168... | ||
2 | 168 | ||
3 | call get_event_for_app |
169 | call get_event_for_app |
4 | mov [esp+36],eax |
170 | mov [esp+36],eax |
Line 5... | Line 171... | ||
5 | ret |
171 | ret |
6 | - | ||
7 | 172 | ||
Line 8... | Line 173... | ||
8 | align 4 |
173 | |
9 | 174 | align 4 |
|
10 | sys_wait_event_timeout: |
175 | sys_wait_event_timeout: |
Line 44... | Line 209... | ||
44 | 209 | ||
45 | eventoccur: |
210 | eventoccur: |
46 | mov [esp+36],eax |
211 | mov [esp+36],eax |
Line 47... | Line -... | ||
47 | ret |
- | |
48 | 212 | ret |
|
Line 49... | Line 213... | ||
49 | 213 | ||
Line 50... | Line 214... | ||
50 | get_event_for_app: |
214 | get_event_for_app: |
Line 162... | Line 326... | ||
162 | mov eax,8 |
326 | mov eax,8 |
163 | ret |
327 | ret |
164 | no_stack_event: |
328 | no_stack_event: |
Line 165... | Line 329... | ||
165 | 329 | ||
166 | test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG |
330 | test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG |
167 | jz no_debug_event |
331 | jz .test_ext |
168 | mov eax, [0x3000] |
332 | mov eax, [0x3000] |
169 | shl eax, 8 |
333 | shl eax, 8 |
170 | test byte [eax+0x80000+APPDATA.event_mask+1], byte 1 |
334 | test byte [eax+0x80000+APPDATA.event_mask+1], byte 1 |
171 | jz no_debug_event |
335 | jz .test_ext |
172 | and byte [eax+0x80000+APPDATA.event_mask+1], not 1 |
336 | and byte [eax+0x80000+APPDATA.event_mask+1], not 1 |
173 | popad |
337 | popad |
174 | mov eax, 9 |
338 | mov eax, 9 |
- | 339 | ret |
|
- | 340 | ||
- | 341 | .test_ext: |
|
175 | ret |
342 | mov eax, [0x3000] |
- | 343 | shl eax, 8 |
|
- | 344 | test dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED |
|
- | 345 | jz .test_IRQ |
|
- | 346 | mov eax, 10 |
|
- | 347 | ret |
|
- | 348 | ||
- | 349 | .test_IRQ: |
|
Line 176... | Line 350... | ||
176 | no_debug_event: |
350 | |
177 | 351 | ||
Line 178... | Line 352... | ||
178 | cmp dword [edi+TASKDATA.event_mask], 0xFFFF |
352 | cmp dword [edi+TASKDATA.event_mask], 0xFFFF |
Line 211... | Line 385... | ||
211 | popad |
385 | popad |
212 | xor eax, eax |
386 | xor eax, eax |
213 | ret |
387 | ret |
Line -... | Line 388... | ||
- | 388 |