Subversion Repositories Kolibri OS

Rev

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