Rev 837 | Rev 864 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 837 | Rev 840 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 819 $ |
8 | $Revision: 840 $ |
9 | 9 | ||
10 | 10 | ||
11 | DRV_COMPAT equ 5 ;minimal required drivers version |
11 | DRV_COMPAT equ 5 ;minimal required drivers version |
12 | DRV_CURRENT equ 5 ;current drivers model version |
12 | DRV_CURRENT equ 5 ;current drivers model version |
13 | 13 | ||
14 | DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT |
14 | DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT |
15 | PID_KERNEL equ 1 ;os_idle thread |
15 | PID_KERNEL equ 1 ;os_idle thread |
16 | 16 | ||
17 | align 4 |
17 | align 4 |
18 | proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword |
18 | proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword |
19 | 19 | ||
20 | mov ebx, [irq] ;irq num |
20 | mov ebx, [irq] ;irq num |
21 | test ebx, ebx |
21 | test ebx, ebx |
22 | jz .err |
22 | jz .err |
23 | cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's |
23 | cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's |
24 | ja .err |
24 | ja .err |
25 | mov eax, [handler] |
25 | mov eax, [handler] |
26 | test eax, eax |
26 | test eax, eax |
27 | jz .err |
27 | jz .err |
28 | cmp [irq_owner + 4 * ebx], 0 |
28 | cmp [irq_owner + 4 * ebx], 0 |
29 | je @f |
29 | je @f |
30 | 30 | ||
31 | mov ecx, [irq_rights + 4 * ebx] ; Rights : 0 - full access, 1 - read only, 2 - forbidden |
31 | mov ecx, [irq_rights + 4 * ebx] ; Rights : 0 - full access, 1 - read only, 2 - forbidden |
32 | test ecx, ecx |
32 | test ecx, ecx |
33 | jnz .err |
33 | jnz .err |
34 | 34 | ||
35 | @@: |
35 | @@: |
36 | mov [irq_tab+ebx*4], eax |
36 | mov [irq_tab+ebx*4], eax |
37 | 37 | ||
38 | mov eax, [access_rights] |
38 | mov eax, [access_rights] |
39 | mov [irq_rights + 4 * ebx], eax |
39 | mov [irq_rights + 4 * ebx], eax |
40 | 40 | ||
41 | mov [irq_owner + 4 * ebx], PID_KERNEL ; all handlers belong to a kernel |
41 | mov [irq_owner + 4 * ebx], PID_KERNEL ; all handlers belong to a kernel |
42 | 42 | ||
43 | stdcall enable_irq, [irq] |
43 | stdcall enable_irq, [irq] |
44 | mov eax, 1 |
44 | mov eax, 1 |
45 | ret |
45 | ret |
46 | .err: |
46 | .err: |
47 | xor eax, eax |
47 | xor eax, eax |
48 | ret |
48 | ret |
49 | endp |
49 | endp |
50 | 50 | ||
51 | uglobal |
51 | uglobal |
52 | 52 | ||
53 | irq_rights rd 16 |
53 | irq_rights rd 16 |
54 | 54 | ||
55 | endg |
55 | endg |
56 | 56 | ||
57 | proc get_int_handler stdcall, irq:dword |
57 | proc get_int_handler stdcall, irq:dword |
58 | 58 | ||
59 | mov eax, [irq] |
59 | mov eax, [irq] |
60 | 60 | ||
61 | cmp [irq_rights + 4 * eax], dword 1 |
61 | cmp [irq_rights + 4 * eax], dword 1 |
62 | ja .err |
62 | ja .err |
63 | 63 | ||
64 | mov eax, [irq_tab + 4 * eax] |
64 | mov eax, [irq_tab + 4 * eax] |
65 | ret |
65 | ret |
66 | 66 | ||
67 | .err: |
67 | .err: |
68 | xor eax, eax |
68 | xor eax, eax |
69 | ret |
69 | ret |
70 | 70 | ||
71 | endp |
71 | endp |
72 | 72 | ||
73 | align 4 |
73 | align 4 |
74 | proc detach_int_handler |
74 | proc detach_int_handler |
75 | 75 | ||
76 | ret |
76 | ret |
77 | endp |
77 | endp |
78 | 78 | ||
79 | align 4 |
79 | align 4 |
80 | proc enable_irq stdcall, irq_line:dword |
80 | proc enable_irq stdcall, irq_line:dword |
81 | mov ebx, [irq_line] |
81 | mov ebx, [irq_line] |
82 | mov edx, 0x21 |
82 | mov edx, 0x21 |
83 | cmp ebx, 8 |
83 | cmp ebx, 8 |
84 | jb @F |
84 | jb @F |
85 | mov edx, 0xA1 |
85 | mov edx, 0xA1 |
86 | sub ebx,8 |
86 | sub ebx,8 |
87 | @@: |
87 | @@: |
88 | in al,dx |
88 | in al,dx |
89 | btr eax, ebx |
89 | btr eax, ebx |
90 | out dx, al |
90 | out dx, al |
91 | ret |
91 | ret |
92 | endp |
92 | endp |
93 | 93 | ||
94 | align 16 |
94 | align 16 |
95 | ;; proc irq_serv |
95 | ;; proc irq_serv |
96 | 96 | ||
97 | irq_serv: |
97 | irq_serv: |
98 | 98 | ||
99 | .irq_1: |
99 | .irq_1: |
100 | push 1 |
100 | push 1 |
101 | jmp .main |
101 | jmp .main |
102 | align 4 |
102 | align 4 |
103 | .irq_2: |
103 | .irq_2: |
104 | push 2 |
104 | push 2 |
105 | jmp .main |
105 | jmp .main |
106 | align 4 |
106 | align 4 |
107 | .irq_3: |
107 | .irq_3: |
108 | push 3 |
108 | push 3 |
109 | jmp .main |
109 | jmp .main |
110 | align 4 |
110 | align 4 |
111 | .irq_4: |
111 | .irq_4: |
112 | push 4 |
112 | push 4 |
113 | jmp .main |
113 | jmp .main |
114 | align 4 |
114 | align 4 |
115 | .irq_5: |
115 | .irq_5: |
116 | push 5 |
116 | push 5 |
117 | jmp .main |
117 | jmp .main |
118 | align 4 |
118 | align 4 |
119 | .irq_6: |
119 | .irq_6: |
120 | push 6 |
120 | push 6 |
121 | jmp .main |
121 | jmp .main |
122 | align 4 |
122 | align 4 |
123 | .irq_7: |
123 | .irq_7: |
124 | push 7 |
124 | push 7 |
125 | jmp .main |
125 | jmp .main |
126 | align 4 |
126 | align 4 |
127 | .irq_8: |
127 | .irq_8: |
128 | push 8 |
128 | push 8 |
129 | jmp .main |
129 | jmp .main |
130 | align 4 |
130 | align 4 |
131 | .irq_9: |
131 | .irq_9: |
132 | push 9 |
132 | push 9 |
133 | jmp .main |
133 | jmp .main |
134 | align 4 |
134 | align 4 |
135 | .irq_10: |
135 | .irq_10: |
136 | push 10 |
136 | push 10 |
137 | jmp .main |
137 | jmp .main |
138 | align 4 |
138 | align 4 |
139 | .irq_11: |
139 | .irq_11: |
140 | push 11 |
140 | push 11 |
141 | jmp .main |
141 | jmp .main |
142 | align 4 |
142 | align 4 |
143 | .irq_12: |
143 | .irq_12: |
144 | push 12 |
144 | push 12 |
145 | jmp .main |
145 | jmp .main |
146 | align 4 |
146 | align 4 |
147 | .irq_13: |
147 | .irq_13: |
148 | push 13 |
148 | push 13 |
149 | jmp .main |
149 | jmp .main |
150 | align 4 |
150 | align 4 |
151 | .irq_14: |
151 | .irq_14: |
152 | push 14 |
152 | push 14 |
153 | jmp .main |
153 | jmp .main |
154 | align 4 |
154 | align 4 |
155 | .irq_15: |
155 | .irq_15: |
156 | push 15 |
156 | push 15 |
157 | jmp .main |
157 | jmp .main |
158 | 158 | ||
159 | align 16 |
159 | align 16 |
160 | .main: |
160 | .main: |
161 | save_ring3_context |
161 | save_ring3_context |
162 | mov eax, [esp + 32] |
162 | mov eax, [esp + 32] |
163 | mov bx, app_data ;os_data |
163 | mov bx, app_data ;os_data |
164 | mov ds, bx |
164 | mov ds, bx |
165 | mov es, bx |
165 | mov es, bx |
166 | 166 | ||
167 | cmp [v86_irqhooks+eax*8], 0 |
167 | cmp [v86_irqhooks+eax*8], 0 |
168 | jnz v86_irq |
168 | jnz v86_irq |
169 | 169 | ||
170 | mov ebx, [irq_tab+eax*4] |
170 | mov ebx, [irq_tab+eax*4] |
171 | test ebx, ebx |
171 | test ebx, ebx |
172 | jz .exit |
172 | jz .exit |
173 | 173 | ||
174 | call ebx |
174 | call ebx |
175 | mov [check_idle_semaphore],5 |
175 | mov [check_idle_semaphore],5 |
176 | 176 | ||
177 | .exit: |
177 | .exit: |
178 | 178 | ||
179 | cmp dword [esp + 32], 8 |
179 | cmp dword [esp + 32], 8 |
180 | mov al, 0x20 |
180 | mov al, 0x20 |
181 | jb @f |
181 | jb @f |
182 | out 0xa0, al |
182 | out 0xa0, al |
183 | @@: |
183 | @@: |
184 | out 0x20, al |
184 | out 0x20, al |
185 | 185 | ||
186 | restore_ring3_context |
186 | restore_ring3_context |
187 | add esp, 4 |
187 | add esp, 4 |
188 | 188 | ||
189 | iret |
189 | iret |
190 | 190 | ||
191 | align 4 |
191 | align 4 |
192 | proc get_notify stdcall, p_ev:dword |
192 | proc get_notify stdcall, p_ev:dword |
193 | 193 | ||
194 | .wait: |
194 | .wait: |
195 | mov ebx,[current_slot] |
195 | mov ebx,[current_slot] |
196 | test dword [ebx+APPDATA.event_mask],EVENT_NOTIFY |
196 | test dword [ebx+APPDATA.event_mask],EVENT_NOTIFY |
197 | jz @f |
197 | jz @f |
198 | and dword [ebx+APPDATA.event_mask], not EVENT_NOTIFY |
198 | and dword [ebx+APPDATA.event_mask], not EVENT_NOTIFY |
199 | mov edi, [p_ev] |
199 | mov edi, [p_ev] |
200 | mov dword [edi], EV_INTR |
200 | mov dword [edi], EV_INTR |
201 | mov eax, [ebx+APPDATA.event] |
201 | mov eax, [ebx+APPDATA.event] |
202 | mov dword [edi+4], eax |
202 | mov dword [edi+4], eax |
203 | ret |
203 | ret |
204 | @@: |
204 | @@: |
205 | call change_task |
205 | call change_task |
206 | jmp .wait |
206 | jmp .wait |
207 | endp |
207 | endp |
208 | 208 | ||
209 | align 4 |
209 | align 4 |
210 | proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword |
210 | proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword |
211 | push ebx |
211 | push ebx |
212 | xor eax, eax |
212 | xor eax, eax |
213 | xor ebx, ebx |
213 | xor ebx, ebx |
214 | mov ah, byte [bus] |
214 | mov ah, byte [bus] |
215 | mov al, 6 |
215 | mov al, 6 |
216 | mov bh, byte [devfn] |
216 | mov bh, byte [devfn] |
217 | mov bl, byte [reg] |
217 | mov bl, byte [reg] |
218 | call pci_read_reg |
218 | call pci_read_reg |
219 | pop ebx |
219 | pop ebx |
220 | ret |
220 | ret |
221 | endp |
221 | endp |
222 | 222 | ||
223 | align 4 |
223 | align 4 |
224 | proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword |
224 | proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword |
225 | push ebx |
225 | push ebx |
226 | xor eax, eax |
226 | xor eax, eax |
227 | xor ebx, ebx |
227 | xor ebx, ebx |
228 | mov ah, byte [bus] |
228 | mov ah, byte [bus] |
229 | mov al, 5 |
229 | mov al, 5 |
230 | mov bh, byte [devfn] |
230 | mov bh, byte [devfn] |
231 | mov bl, byte [reg] |
231 | mov bl, byte [reg] |
232 | call pci_read_reg |
232 | call pci_read_reg |
233 | pop ebx |
233 | pop ebx |
234 | ret |
234 | ret |
235 | endp |
235 | endp |
236 | 236 | ||
237 | align 4 |
237 | align 4 |
238 | proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword |
238 | proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword |
239 | push ebx |
239 | push ebx |
240 | xor eax, eax |
240 | xor eax, eax |
241 | xor ebx, ebx |
241 | xor ebx, ebx |
242 | mov ah, byte [bus] |
242 | mov ah, byte [bus] |
243 | mov al, 4 |
243 | mov al, 4 |
244 | mov bh, byte [devfn] |
244 | mov bh, byte [devfn] |
245 | mov bl, byte [reg] |
245 | mov bl, byte [reg] |
246 | call pci_read_reg |
246 | call pci_read_reg |
247 | pop ebx |
247 | pop ebx |
248 | ret |
248 | ret |
249 | endp |
249 | endp |
250 | 250 | ||
251 | align 4 |
251 | align 4 |
252 | proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
252 | proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
253 | push ebx |
253 | push ebx |
254 | xor eax, eax |
254 | xor eax, eax |
255 | xor ebx, ebx |
255 | xor ebx, ebx |
256 | mov ah, byte [bus] |
256 | mov ah, byte [bus] |
257 | mov al, 8 |
257 | mov al, 8 |
258 | mov bh, byte [devfn] |
258 | mov bh, byte [devfn] |
259 | mov bl, byte [reg] |
259 | mov bl, byte [reg] |
260 | mov ecx, [val] |
260 | mov ecx, [val] |
261 | call pci_write_reg |
261 | call pci_write_reg |
262 | pop ebx |
262 | pop ebx |
263 | ret |
263 | ret |
264 | endp |
264 | endp |
265 | 265 | ||
266 | align 4 |
266 | align 4 |
267 | proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
267 | proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
268 | push ebx |
268 | push ebx |
269 | xor eax, eax |
269 | xor eax, eax |
270 | xor ebx, ebx |
270 | xor ebx, ebx |
271 | mov ah, byte [bus] |
271 | mov ah, byte [bus] |
272 | mov al, 9 |
272 | mov al, 9 |
273 | mov bh, byte [devfn] |
273 | mov bh, byte [devfn] |
274 | mov bl, byte [reg] |
274 | mov bl, byte [reg] |
275 | mov ecx, [val] |
275 | mov ecx, [val] |
276 | call pci_write_reg |
276 | call pci_write_reg |
277 | pop ebx |
277 | pop ebx |
278 | ret |
278 | ret |
279 | endp |
279 | endp |
280 | 280 | ||
281 | align 4 |
281 | align 4 |
282 | proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
282 | proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
283 | push ebx |
283 | push ebx |
284 | xor eax, eax |
284 | xor eax, eax |
285 | xor ebx, ebx |
285 | xor ebx, ebx |
286 | mov ah, byte [bus] |
286 | mov ah, byte [bus] |
287 | mov al, 10 |
287 | mov al, 10 |
288 | mov bh, byte [devfn] |
288 | mov bh, byte [devfn] |
289 | mov bl, byte [reg] |
289 | mov bl, byte [reg] |
290 | mov ecx, [val] |
290 | mov ecx, [val] |
291 | call pci_write_reg |
291 | call pci_write_reg |
292 | pop ebx |
292 | pop ebx |
293 | ret |
293 | ret |
294 | endp |
294 | endp |
295 | 295 | ||
296 | handle equ IOCTL.handle |
296 | handle equ IOCTL.handle |
297 | io_code equ IOCTL.io_code |
297 | io_code equ IOCTL.io_code |
298 | input equ IOCTL.input |
298 | input equ IOCTL.input |
299 | inp_size equ IOCTL.inp_size |
299 | inp_size equ IOCTL.inp_size |
300 | output equ IOCTL.output |
300 | output equ IOCTL.output |
301 | out_size equ IOCTL.out_size |
301 | out_size equ IOCTL.out_size |
302 | 302 | ||
303 | 303 | ||
304 | align 4 |
304 | align 4 |
305 | proc srv_handler stdcall, ioctl:dword |
305 | proc srv_handler stdcall, ioctl:dword |
306 | mov esi, [ioctl] |
306 | mov esi, [ioctl] |
307 | test esi, esi |
307 | test esi, esi |
308 | jz .err |
308 | jz .err |
309 | 309 | ||
310 | mov edi, [esi+handle] |
310 | mov edi, [esi+handle] |
311 | cmp [edi+SRV.magic], ' SRV' |
311 | cmp [edi+SRV.magic], ' SRV' |
312 | jne .fail |
312 | jne .fail |
313 | 313 | ||
314 | cmp [edi+SRV.size], SRV_SIZE |
314 | cmp [edi+SRV.size], SRV_SIZE |
315 | jne .fail |
315 | jne .fail |
316 | 316 | ||
317 | stdcall [edi+SRV.srv_proc], esi |
317 | stdcall [edi+SRV.srv_proc], esi |
318 | ret |
318 | ret |
319 | .fail: |
319 | .fail: |
320 | xor eax, eax |
320 | xor eax, eax |
321 | not eax |
321 | not eax |
322 | mov [esi+output], eax |
322 | mov [esi+output], eax |
323 | mov [esi+out_size], 4 |
323 | mov [esi+out_size], 4 |
324 | ret |
324 | ret |
325 | .err: |
325 | .err: |
326 | xor eax, eax |
326 | xor eax, eax |
327 | not eax |
327 | not eax |
328 | ret |
328 | ret |
329 | endp |
329 | endp |
330 | 330 | ||
331 | ; param |
331 | ; param |
332 | ; ebx= io_control |
332 | ; ebx= io_control |
333 | ; |
333 | ; |
334 | ; retval |
334 | ; retval |
335 | ; eax= error code |
335 | ; eax= error code |
336 | 336 | ||
337 | align 4 |
337 | align 4 |
338 | srv_handlerEx: |
338 | srv_handlerEx: |
339 | cmp ebx, OS_BASE |
339 | cmp ebx, OS_BASE |
340 | jae .fail |
340 | jae .fail |
341 | 341 | ||
342 | mov eax, [ebx+handle] |
342 | mov eax, [ebx+handle] |
343 | cmp [eax+SRV.magic], ' SRV' |
343 | cmp [eax+SRV.magic], ' SRV' |
344 | jne .fail |
344 | jne .fail |
345 | 345 | ||
346 | cmp [eax+SRV.size], SRV_SIZE |
346 | cmp [eax+SRV.size], SRV_SIZE |
347 | jne .fail |
347 | jne .fail |
348 | 348 | ||
349 | stdcall [eax+SRV.srv_proc], ebx |
349 | stdcall [eax+SRV.srv_proc], ebx |
350 | ret |
350 | ret |
351 | .fail: |
351 | .fail: |
352 | or eax, -1 |
352 | or eax, -1 |
353 | ret |
353 | ret |
354 | 354 | ||
355 | restore handle |
355 | restore handle |
356 | restore io_code |
356 | restore io_code |
357 | restore input |
357 | restore input |
358 | restore inp_size |
358 | restore inp_size |
359 | restore output |
359 | restore output |
360 | restore out_size |
360 | restore out_size |
361 | 361 | ||
362 | align 4 |
362 | align 4 |
363 | proc get_service stdcall, sz_name:dword |
363 | proc get_service stdcall, sz_name:dword |
364 | mov eax, [sz_name] |
364 | mov eax, [sz_name] |
365 | test eax, eax |
365 | test eax, eax |
366 | jnz @F |
366 | jnz @F |
367 | ret |
367 | ret |
368 | @@: |
368 | @@: |
369 | mov edx, [srv.fd] |
369 | mov edx, [srv.fd] |
370 | @@: |
370 | @@: |
371 | cmp edx, srv.fd-SRV_FD_OFFSET |
371 | cmp edx, srv.fd-SRV_FD_OFFSET |
372 | je .not_load |
372 | je .not_load |
373 | 373 | ||
374 | stdcall strncmp, edx, [sz_name], 16 |
374 | stdcall strncmp, edx, [sz_name], 16 |
375 | test eax, eax |
375 | test eax, eax |
376 | je .ok |
376 | je .ok |
377 | 377 | ||
378 | mov edx, [edx+SRV.fd] |
378 | mov edx, [edx+SRV.fd] |
379 | jmp @B |
379 | jmp @B |
380 | .not_load: |
380 | .not_load: |
381 | pop ebp |
381 | pop ebp |
382 | jmp load_driver |
382 | jmp load_driver |
383 | .ok: |
383 | .ok: |
384 | mov eax, edx |
384 | mov eax, edx |
385 | ret |
385 | ret |
386 | endp |
386 | endp |
387 | 387 | ||
388 | align 4 |
388 | align 4 |
389 | proc reg_service stdcall, name:dword, handler:dword |
389 | proc reg_service stdcall, name:dword, handler:dword |
390 | 390 | ||
391 | push ebx |
391 | push ebx |
392 | 392 | ||
393 | xor eax, eax |
393 | xor eax, eax |
394 | 394 | ||
395 | cmp [name], eax |
395 | cmp [name], eax |
396 | je .fail |
396 | je .fail |
397 | 397 | ||
398 | cmp [handler], eax |
398 | cmp [handler], eax |
399 | je .fail |
399 | je .fail |
400 | 400 | ||
401 | mov eax, SRV_SIZE |
401 | mov eax, SRV_SIZE |
402 | call malloc ;call alloc_service |
402 | call malloc ;call alloc_service |
403 | test eax, eax |
403 | test eax, eax |
404 | jz .fail |
404 | jz .fail |
405 | 405 | ||
406 | push esi |
406 | push esi |
407 | push edi |
407 | push edi |
408 | mov edi, eax |
408 | mov edi, eax |
409 | mov esi, [name] |
409 | mov esi, [name] |
410 | mov ecx, 16/4 |
410 | mov ecx, 16/4 |
411 | rep movsd |
411 | rep movsd |
412 | pop edi |
412 | pop edi |
413 | pop esi |
413 | pop esi |
414 | 414 | ||
415 | mov [eax+SRV.magic], ' SRV' |
415 | mov [eax+SRV.magic], ' SRV' |
416 | mov [eax+SRV.size], SRV_SIZE |
416 | mov [eax+SRV.size], SRV_SIZE |
417 | 417 | ||
418 | mov ebx, srv.fd-SRV_FD_OFFSET |
418 | mov ebx, srv.fd-SRV_FD_OFFSET |
419 | mov edx, [ebx+SRV.fd] |
419 | mov edx, [ebx+SRV.fd] |
420 | mov [eax+SRV.fd], edx |
420 | mov [eax+SRV.fd], edx |
421 | mov [eax+SRV.bk], ebx |
421 | mov [eax+SRV.bk], ebx |
422 | mov [ebx+SRV.fd], eax |
422 | mov [ebx+SRV.fd], eax |
423 | mov [edx+SRV.bk], eax |
423 | mov [edx+SRV.bk], eax |
424 | 424 | ||
425 | mov ecx, [handler] |
425 | mov ecx, [handler] |
426 | mov [eax+SRV.srv_proc], ecx |
426 | mov [eax+SRV.srv_proc], ecx |
427 | pop ebx |
427 | pop ebx |
428 | ret |
428 | ret |
429 | .fail: |
429 | .fail: |
430 | xor eax, eax |
430 | xor eax, eax |
431 | pop ebx |
431 | pop ebx |
432 | ret |
432 | ret |
433 | endp |
433 | endp |
434 | 434 | ||
435 | align 4 |
435 | align 4 |
436 | proc get_proc stdcall, exp:dword, sz_name:dword |
436 | proc get_proc stdcall, exp:dword, sz_name:dword |
437 | 437 | ||
438 | mov edx, [exp] |
438 | mov edx, [exp] |
439 | .next: |
439 | .next: |
440 | mov eax, [edx] |
440 | mov eax, [edx] |
441 | test eax, eax |
441 | test eax, eax |
442 | jz .end |
442 | jz .end |
443 | 443 | ||
444 | push edx |
444 | push edx |
445 | stdcall strncmp, eax, [sz_name], 16 |
445 | stdcall strncmp, eax, [sz_name], 16 |
446 | pop edx |
446 | pop edx |
447 | test eax, eax |
447 | test eax, eax |
448 | jz .ok |
448 | jz .ok |
449 | 449 | ||
450 | add edx,8 |
450 | add edx,8 |
451 | jmp .next |
451 | jmp .next |
452 | .ok: |
452 | .ok: |
453 | mov eax, [edx+4] |
453 | mov eax, [edx+4] |
454 | .end: |
454 | .end: |
455 | ret |
455 | ret |
456 | endp |
456 | endp |
457 | 457 | ||
458 | align 4 |
458 | align 4 |
459 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
459 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
460 | 460 | ||
461 | @@: |
461 | @@: |
462 | stdcall strncmp, [pSym], [sz_sym], 8 |
462 | stdcall strncmp, [pSym], [sz_sym], 8 |
463 | test eax,eax |
463 | test eax,eax |
464 | jz .ok |
464 | jz .ok |
465 | add [pSym], 18 |
465 | add [pSym], 18 |
466 | dec [count] |
466 | dec [count] |
467 | jnz @b |
467 | jnz @b |
468 | xor eax, eax |
468 | xor eax, eax |
469 | ret |
469 | ret |
470 | .ok: |
470 | .ok: |
471 | mov ebx, [pSym] |
471 | mov ebx, [pSym] |
472 | mov eax, [ebx+8] |
472 | mov eax, [ebx+8] |
473 | ret |
473 | ret |
474 | endp |
474 | endp |
475 | 475 | ||
476 | align 4 |
476 | align 4 |
477 | proc get_curr_task |
477 | proc get_curr_task |
478 | mov eax,[CURRENT_TASK] |
478 | mov eax,[CURRENT_TASK] |
479 | shl eax, 8 |
479 | shl eax, 8 |
480 | ret |
480 | ret |
481 | endp |
481 | endp |
482 | 482 | ||
483 | align 4 |
483 | align 4 |
484 | proc get_fileinfo stdcall, file_name:dword, info:dword |
484 | proc get_fileinfo stdcall, file_name:dword, info:dword |
485 | locals |
485 | locals |
486 | cmd dd ? |
486 | cmd dd ? |
487 | offset dd ? |
487 | offset dd ? |
488 | dd ? |
488 | dd ? |
489 | count dd ? |
489 | count dd ? |
490 | buff dd ? |
490 | buff dd ? |
491 | db ? |
491 | db ? |
492 | name dd ? |
492 | name dd ? |
493 | endl |
493 | endl |
494 | 494 | ||
495 | xor eax, eax |
495 | xor eax, eax |
496 | mov ebx, [file_name] |
496 | mov ebx, [file_name] |
497 | mov ecx, [info] |
497 | mov ecx, [info] |
498 | 498 | ||
499 | mov [cmd], 5 |
499 | mov [cmd], 5 |
500 | mov [offset], eax |
500 | mov [offset], eax |
501 | mov [offset+4], eax |
501 | mov [offset+4], eax |
502 | mov [count], eax |
502 | mov [count], eax |
503 | mov [buff], ecx |
503 | mov [buff], ecx |
504 | mov byte [buff+4], al |
504 | mov byte [buff+4], al |
505 | mov [name], ebx |
505 | mov [name], ebx |
506 | 506 | ||
507 | mov eax, 70 |
507 | mov eax, 70 |
508 | lea ebx, [cmd] |
508 | lea ebx, [cmd] |
509 | int 0x40 |
509 | int 0x40 |
510 | ret |
510 | ret |
511 | endp |
511 | endp |
512 | 512 | ||
513 | align 4 |
513 | align 4 |
514 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
514 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
515 | bytes:dword |
515 | bytes:dword |
516 | locals |
516 | locals |
517 | cmd dd ? |
517 | cmd dd ? |
518 | offset dd ? |
518 | offset dd ? |
519 | dd ? |
519 | dd ? |
520 | count dd ? |
520 | count dd ? |
521 | buff dd ? |
521 | buff dd ? |
522 | db ? |
522 | db ? |
523 | name dd ? |
523 | name dd ? |
524 | endl |
524 | endl |
525 | 525 | ||
526 | xor eax, eax |
526 | xor eax, eax |
527 | mov ebx, [file_name] |
527 | mov ebx, [file_name] |
528 | mov ecx, [off] |
528 | mov ecx, [off] |
529 | mov edx, [bytes] |
529 | mov edx, [bytes] |
530 | mov esi, [buffer] |
530 | mov esi, [buffer] |
531 | 531 | ||
532 | mov [cmd], eax |
532 | mov [cmd], eax |
533 | mov [offset], ecx |
533 | mov [offset], ecx |
534 | mov [offset+4], eax |
534 | mov [offset+4], eax |
535 | mov [count], edx |
535 | mov [count], edx |
536 | mov [buff], esi |
536 | mov [buff], esi |
537 | mov byte [buff+4], al |
537 | mov byte [buff+4], al |
538 | mov [name], ebx |
538 | mov [name], ebx |
539 | 539 | ||
540 | pushad |
540 | pushad |
541 | push eax |
541 | push eax |
542 | lea eax, [cmd] |
542 | lea eax, [cmd] |
543 | call file_system_lfn |
543 | call file_system_lfn |
544 | pop eax |
544 | pop eax |
545 | popad |
545 | popad |
546 | ret |
546 | ret |
547 | endp |
547 | endp |
548 | 548 | ||
549 | ; description |
549 | ; description |
550 | ; allocate kernel memory and loads the specified file |
550 | ; allocate kernel memory and loads the specified file |
551 | ; |
551 | ; |
552 | ; param |
552 | ; param |
553 | ; file_name= full path to file |
553 | ; file_name= full path to file |
554 | ; |
554 | ; |
555 | ; retval |
555 | ; retval |
556 | ; eax= file image in kernel memory |
556 | ; eax= file image in kernel memory |
557 | ; ebx= size of file |
557 | ; ebx= size of file |
558 | ; |
558 | ; |
559 | ; warging |
559 | ; warging |
560 | ; You mast call kernel_free() to delete each file |
560 | ; You mast call kernel_free() to delete each file |
561 | ; loaded by the load_file() function |
561 | ; loaded by the load_file() function |
562 | 562 | ||
563 | align 4 |
563 | align 4 |
564 | proc load_file stdcall, file_name:dword |
564 | proc load_file stdcall, file_name:dword |
565 | locals |
565 | locals |
566 | attr dd ? |
566 | attr dd ? |
567 | flags dd ? |
567 | flags dd ? |
568 | cr_time dd ? |
568 | cr_time dd ? |
569 | cr_date dd ? |
569 | cr_date dd ? |
570 | acc_time dd ? |
570 | acc_time dd ? |
571 | acc_date dd ? |
571 | acc_date dd ? |
572 | mod_time dd ? |
572 | mod_time dd ? |
573 | mod_date dd ? |
573 | mod_date dd ? |
574 | file_size dd ? |
574 | file_size dd ? |
575 | 575 | ||
576 | file dd ? |
576 | file dd ? |
577 | file2 dd ? |
577 | file2 dd ? |
578 | endl |
578 | endl |
579 | 579 | ||
580 | push esi |
580 | push esi |
581 | push edi |
581 | push edi |
582 | 582 | ||
583 | lea eax, [attr] |
583 | lea eax, [attr] |
584 | stdcall get_fileinfo, [file_name], eax |
584 | stdcall get_fileinfo, [file_name], eax |
585 | test eax, eax |
585 | test eax, eax |
586 | jnz .fail |
586 | jnz .fail |
587 | 587 | ||
588 | mov eax, [file_size] |
588 | mov eax, [file_size] |
589 | cmp eax, 1024*1024*16 |
589 | cmp eax, 1024*1024*16 |
590 | ja .fail |
590 | ja .fail |
591 | 591 | ||
592 | stdcall kernel_alloc, [file_size] |
592 | stdcall kernel_alloc, [file_size] |
593 | mov [file], eax |
593 | mov [file], eax |
594 | 594 | ||
595 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
595 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
596 | cmp ebx, [file_size] |
596 | cmp ebx, [file_size] |
597 | jne .cleanup |
597 | jne .cleanup |
598 | 598 | ||
599 | mov eax, [file] |
599 | mov eax, [file] |
600 | cmp dword [eax], 0x4B43504B |
600 | cmp dword [eax], 0x4B43504B |
601 | jne .exit |
601 | jne .exit |
602 | mov ebx, [eax+4] |
602 | mov ebx, [eax+4] |
603 | mov [file_size], ebx |
603 | mov [file_size], ebx |
604 | stdcall kernel_alloc, ebx |
604 | stdcall kernel_alloc, ebx |
605 | 605 | ||
606 | test eax, eax |
606 | test eax, eax |
607 | jz .cleanup |
607 | jz .cleanup |
608 | 608 | ||
609 | mov [file2], eax |
609 | mov [file2], eax |
610 | stdcall unpack, [file], eax |
610 | stdcall unpack, [file], eax |
611 | stdcall kernel_free, [file] |
611 | stdcall kernel_free, [file] |
612 | mov eax, [file2] |
612 | mov eax, [file2] |
613 | mov ebx, [file_size] |
613 | mov ebx, [file_size] |
614 | .exit: |
614 | .exit: |
615 | push eax |
615 | push eax |
616 | lea edi, [eax+ebx] ;cleanup remain space |
616 | lea edi, [eax+ebx] ;cleanup remain space |
617 | mov ecx, 4096 ;from file end |
617 | mov ecx, 4096 ;from file end |
618 | and ebx, 4095 |
618 | and ebx, 4095 |
619 | jz @f |
619 | jz @f |
620 | sub ecx, ebx |
620 | sub ecx, ebx |
621 | xor eax, eax |
621 | xor eax, eax |
622 | cld |
622 | cld |
623 | rep stosb |
623 | rep stosb |
624 | @@: |
624 | @@: |
625 | mov ebx, [file_size] |
625 | mov ebx, [file_size] |
626 | pop eax |
626 | pop eax |
627 | pop edi |
627 | pop edi |
628 | pop esi |
628 | pop esi |
629 | ret |
629 | ret |
630 | .cleanup: |
630 | .cleanup: |
631 | stdcall kernel_free, [file] |
631 | stdcall kernel_free, [file] |
632 | .fail: |
632 | .fail: |
633 | xor eax, eax |
633 | xor eax, eax |
634 | xor ebx, ebx |
634 | xor ebx, ebx |
635 | pop edi |
635 | pop edi |
636 | pop esi |
636 | pop esi |
637 | ret |
637 | ret |
638 | endp |
638 | endp |
639 | 639 | ||
640 | align 4 |
640 | align 4 |
641 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
641 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
642 | 642 | ||
643 | .look_up: |
643 | .look_up: |
644 | mov edx, [imports] |
644 | mov edx, [imports] |
645 | test edx, edx |
645 | test edx, edx |
646 | jz .end |
646 | jz .end |
647 | mov edx, [edx] |
647 | mov edx, [edx] |
648 | test edx, edx |
648 | test edx, edx |
649 | jz .end |
649 | jz .end |
650 | .next: |
650 | .next: |
651 | mov eax, [edx] |
651 | mov eax, [edx] |
652 | test eax, eax |
652 | test eax, eax |
653 | jz .next_table |
653 | jz .next_table |
654 | 654 | ||
655 | push edx |
655 | push edx |
656 | stdcall strncmp, eax, [proc_name], 16 |
656 | stdcall strncmp, eax, [proc_name], 16 |
657 | pop edx |
657 | pop edx |
658 | test eax, eax |
658 | test eax, eax |
659 | jz .ok |
659 | jz .ok |
660 | 660 | ||
661 | add edx,8 |
661 | add edx,8 |
662 | jmp .next |
662 | jmp .next |
663 | .next_table: |
663 | .next_table: |
664 | add [imports], 4 |
664 | add [imports], 4 |
665 | jmp .look_up |
665 | jmp .look_up |
666 | .ok: |
666 | .ok: |
667 | mov eax, [edx+4] |
667 | mov eax, [edx+4] |
668 | ret |
668 | ret |
669 | .end: |
669 | .end: |
670 | xor eax, eax |
670 | xor eax, eax |
671 | ret |
671 | ret |
672 | endp |
672 | endp |
673 | 673 | ||
674 | align 4 |
674 | align 4 |
675 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
675 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
676 | sym_count:dword, strings:dword, imports:dword |
676 | sym_count:dword, strings:dword, imports:dword |
677 | locals |
677 | locals |
678 | retval dd ? |
678 | retval dd ? |
679 | endl |
679 | endl |
680 | 680 | ||
681 | mov edi, [symbols] |
681 | mov edi, [symbols] |
682 | mov [retval], 1 |
682 | mov [retval], 1 |
683 | .fix: |
683 | .fix: |
684 | movzx ebx, [edi+CSYM.SectionNumber] |
684 | movzx ebx, [edi+CSYM.SectionNumber] |
685 | test ebx, ebx |
685 | test ebx, ebx |
686 | jnz .internal |
686 | jnz .internal |
687 | mov eax, dword [edi+CSYM.Name] |
687 | mov eax, dword [edi+CSYM.Name] |
688 | test eax, eax |
688 | test eax, eax |
689 | jnz @F |
689 | jnz @F |
690 | 690 | ||
691 | mov edi, [edi+4] |
691 | mov edi, [edi+4] |
692 | add edi, [strings] |
692 | add edi, [strings] |
693 | @@: |
693 | @@: |
694 | push edi |
694 | push edi |
695 | stdcall get_proc_ex, edi,[imports] |
695 | stdcall get_proc_ex, edi,[imports] |
696 | pop edi |
696 | pop edi |
697 | 697 | ||
698 | xor ebx, ebx |
698 | xor ebx, ebx |
699 | test eax, eax |
699 | test eax, eax |
700 | jnz @F |
700 | jnz @F |
701 | 701 | ||
702 | mov esi, msg_unresolved |
702 | mov esi, msg_unresolved |
703 | call sys_msg_board_str |
703 | call sys_msg_board_str |
704 | mov esi, edi |
704 | mov esi, edi |
705 | call sys_msg_board_str |
705 | call sys_msg_board_str |
706 | mov esi, msg_CR |
706 | mov esi, msg_CR |
707 | call sys_msg_board_str |
707 | call sys_msg_board_str |
708 | 708 | ||
709 | mov [retval],0 |
709 | mov [retval],0 |
710 | @@: |
710 | @@: |
711 | mov edi, [symbols] |
711 | mov edi, [symbols] |
712 | mov [edi+CSYM.Value], eax |
712 | mov [edi+CSYM.Value], eax |
713 | jmp .next |
713 | jmp .next |
714 | .internal: |
714 | .internal: |
715 | cmp bx, -1 |
715 | cmp bx, -1 |
716 | je .next |
716 | je .next |
717 | cmp bx, -2 |
717 | cmp bx, -2 |
718 | je .next |
718 | je .next |
719 | 719 | ||
720 | dec ebx |
720 | dec ebx |
721 | shl ebx, 3 |
721 | shl ebx, 3 |
722 | lea ebx, [ebx+ebx*4] |
722 | lea ebx, [ebx+ebx*4] |
723 | add ebx, [sec] |
723 | add ebx, [sec] |
724 | 724 | ||
725 | mov eax, [ebx+CFS.VirtualAddress] |
725 | mov eax, [ebx+CFS.VirtualAddress] |
726 | add [edi+CSYM.Value], eax |
726 | add [edi+CSYM.Value], eax |
727 | .next: |
727 | .next: |
728 | add edi, CSYM_SIZE |
728 | add edi, CSYM_SIZE |
729 | mov [symbols], edi |
729 | mov [symbols], edi |
730 | dec [sym_count] |
730 | dec [sym_count] |
731 | jnz .fix |
731 | jnz .fix |
732 | mov eax, [retval] |
732 | mov eax, [retval] |
733 | ret |
733 | ret |
734 | endp |
734 | endp |
735 | 735 | ||
736 | align 4 |
736 | align 4 |
737 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
737 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
738 | locals |
738 | locals |
739 | n_sec dd ? |
739 | n_sec dd ? |
740 | endl |
740 | endl |
741 | 741 | ||
742 | mov eax, [coff] |
742 | mov eax, [coff] |
743 | movzx ebx, [eax+CFH.nSections] |
743 | movzx ebx, [eax+CFH.nSections] |
744 | mov [n_sec], ebx |
744 | mov [n_sec], ebx |
745 | .fix_sec: |
745 | .fix_sec: |
746 | mov esi, [sec] |
746 | mov esi, [sec] |
747 | mov edi, [esi+CFS.PtrReloc] |
747 | mov edi, [esi+CFS.PtrReloc] |
748 | add edi, [coff] |
748 | add edi, [coff] |
749 | 749 | ||
750 | movzx ecx, [esi+CFS.NumReloc] |
750 | movzx ecx, [esi+CFS.NumReloc] |
751 | test ecx, ecx |
751 | test ecx, ecx |
752 | jz .next |
752 | jz .next |
753 | .next_reloc: |
753 | .next_reloc: |
754 | mov ebx, [edi+CRELOC.SymIndex] |
754 | mov ebx, [edi+CRELOC.SymIndex] |
755 | add ebx,ebx |
755 | add ebx,ebx |
756 | lea ebx,[ebx+ebx*8] |
756 | lea ebx,[ebx+ebx*8] |
757 | add ebx, [sym] |
757 | add ebx, [sym] |
758 | 758 | ||
759 | mov edx, [ebx+CSYM.Value] |
759 | mov edx, [ebx+CSYM.Value] |
760 | 760 | ||
761 | cmp [edi+CRELOC.Type], 6 |
761 | cmp [edi+CRELOC.Type], 6 |
762 | je .dir_32 |
762 | je .dir_32 |
763 | 763 | ||
764 | cmp [edi+CRELOC.Type], 20 |
764 | cmp [edi+CRELOC.Type], 20 |
765 | jne .next_reloc |
765 | jne .next_reloc |
766 | .rel_32: |
766 | .rel_32: |
767 | mov eax, [edi+CRELOC.VirtualAddress] |
767 | mov eax, [edi+CRELOC.VirtualAddress] |
768 | add eax, [esi+CFS.VirtualAddress] |
768 | add eax, [esi+CFS.VirtualAddress] |
769 | sub edx, eax |
769 | sub edx, eax |
770 | sub edx, 4 |
770 | sub edx, 4 |
771 | jmp .fix |
771 | jmp .fix |
772 | .dir_32: |
772 | .dir_32: |
773 | mov eax, [edi+CRELOC.VirtualAddress] |
773 | mov eax, [edi+CRELOC.VirtualAddress] |
774 | add eax, [esi+CFS.VirtualAddress] |
774 | add eax, [esi+CFS.VirtualAddress] |
775 | .fix: |
775 | .fix: |
776 | add [eax], edx |
776 | add [eax], edx |
777 | add edi, 10 |
777 | add edi, 10 |
778 | dec ecx |
778 | dec ecx |
779 | jnz .next_reloc |
779 | jnz .next_reloc |
780 | .next: |
780 | .next: |
781 | add [sec], COFF_SECTION_SIZE |
781 | add [sec], COFF_SECTION_SIZE |
782 | dec [n_sec] |
782 | dec [n_sec] |
783 | jnz .fix_sec |
783 | jnz .fix_sec |
784 | .exit: |
784 | .exit: |
785 | ret |
785 | ret |
786 | endp |
786 | endp |
787 | 787 | ||
788 | align 4 |
788 | align 4 |
789 | proc load_driver stdcall, driver_name:dword |
789 | proc load_driver stdcall, driver_name:dword |
790 | locals |
790 | locals |
791 | coff dd ? |
791 | coff dd ? |
792 | sym dd ? |
792 | sym dd ? |
793 | strings dd ? |
793 | strings dd ? |
794 | img_size dd ? |
794 | img_size dd ? |
795 | img_base dd ? |
795 | img_base dd ? |
796 | start dd ? |
796 | start dd ? |
797 | 797 | ||
798 | exports dd ? ;fake exports table |
798 | exports dd ? ;fake exports table |
799 | dd ? |
799 | dd ? |
800 | file_name rb 13+16+4+1 ; '/sys/drivers/ |
800 | file_name rb 13+16+4+1 ; '/sys/drivers/ |
801 | endl |
801 | endl |
802 | 802 | ||
803 | lea edx, [file_name] |
803 | lea edx, [file_name] |
804 | mov dword [edx], '/sys' |
804 | mov dword [edx], '/sys' |
805 | mov dword [edx+4], '/dri' |
805 | mov dword [edx+4], '/dri' |
806 | mov dword [edx+8], 'vers' |
806 | mov dword [edx+8], 'vers' |
807 | mov byte [edx+12], '/' |
807 | mov byte [edx+12], '/' |
808 | mov esi, [driver_name] |
808 | mov esi, [driver_name] |
809 | lea edi, [edx+13] |
809 | lea edi, [edx+13] |
810 | mov ecx, 16 |
810 | mov ecx, 16 |
811 | @@: |
811 | @@: |
812 | lodsb |
812 | lodsb |
813 | test al, al |
813 | test al, al |
814 | jz @f |
814 | jz @f |
815 | stosb |
815 | stosb |
816 | loop @b |
816 | loop @b |
817 | @@: |
817 | @@: |
818 | mov dword [edi], '.obj' |
818 | mov dword [edi], '.obj' |
819 | mov byte [edi+4], 0 |
819 | mov byte [edi+4], 0 |
820 | stdcall load_file, edx |
820 | stdcall load_file, edx |
821 | 821 | ||
822 | test eax, eax |
822 | test eax, eax |
823 | jz .exit |
823 | jz .exit |
824 | 824 | ||
825 | mov [coff], eax |
825 | mov [coff], eax |
826 | 826 | ||
827 | movzx ecx, [eax+CFH.nSections] |
827 | movzx ecx, [eax+CFH.nSections] |
828 | xor ebx, ebx |
828 | xor ebx, ebx |
829 | 829 | ||
830 | lea edx, [eax+20] |
830 | lea edx, [eax+20] |
831 | @@: |
831 | @@: |
832 | add ebx, [edx+CFS.SizeOfRawData] |
832 | add ebx, [edx+CFS.SizeOfRawData] |
833 | add ebx, 15 |
833 | add ebx, 15 |
834 | and ebx, not 15 |
834 | and ebx, not 15 |
835 | add edx, COFF_SECTION_SIZE |
835 | add edx, COFF_SECTION_SIZE |
836 | dec ecx |
836 | dec ecx |
837 | jnz @B |
837 | jnz @B |
838 | mov [img_size], ebx |
838 | mov [img_size], ebx |
839 | 839 | ||
840 | stdcall kernel_alloc, ebx |
840 | stdcall kernel_alloc, ebx |
841 | test eax, eax |
841 | test eax, eax |
842 | jz .fail |
842 | jz .fail |
843 | mov [img_base], eax |
843 | mov [img_base], eax |
844 | 844 | ||
845 | mov edi, eax |
845 | mov edi, eax |
846 | xor eax, eax |
846 | xor eax, eax |
847 | mov ecx, [img_size] |
847 | mov ecx, [img_size] |
848 | add ecx, 4095 |
848 | add ecx, 4095 |
849 | and ecx, not 4095 |
849 | and ecx, not 4095 |
850 | shr ecx, 2 |
850 | shr ecx, 2 |
851 | cld |
851 | cld |
852 | rep stosd |
852 | rep stosd |
853 | 853 | ||
854 | mov edx, [coff] |
854 | mov edx, [coff] |
855 | movzx ebx, [edx+CFH.nSections] |
855 | movzx ebx, [edx+CFH.nSections] |
856 | mov edi, [img_base] |
856 | mov edi, [img_base] |
857 | lea eax, [edx+20] |
857 | lea eax, [edx+20] |
858 | @@: |
858 | @@: |
859 | mov [eax+CFS.VirtualAddress], edi |
859 | mov [eax+CFS.VirtualAddress], edi |
860 | mov esi, [eax+CFS.PtrRawData] |
860 | mov esi, [eax+CFS.PtrRawData] |
861 | test esi, esi |
861 | test esi, esi |
862 | jnz .copy |
862 | jnz .copy |
863 | add edi, [eax+CFS.SizeOfRawData] |
863 | add edi, [eax+CFS.SizeOfRawData] |
864 | jmp .next |
864 | jmp .next |
865 | .copy: |
865 | .copy: |
866 | add esi, edx |
866 | add esi, edx |
867 | mov ecx, [eax+CFS.SizeOfRawData] |
867 | mov ecx, [eax+CFS.SizeOfRawData] |
868 | cld |
868 | cld |
869 | rep movsb |
869 | rep movsb |
870 | .next: |
870 | .next: |
871 | add edi, 15 |
871 | add edi, 15 |
872 | and edi, not 15 |
872 | and edi, not 15 |
873 | add eax, COFF_SECTION_SIZE |
873 | add eax, COFF_SECTION_SIZE |
874 | dec ebx |
874 | dec ebx |
875 | jnz @B |
875 | jnz @B |
876 | 876 | ||
877 | mov ebx, [edx+CFH.pSymTable] |
877 | mov ebx, [edx+CFH.pSymTable] |
878 | add ebx, edx |
878 | add ebx, edx |
879 | mov [sym], ebx |
879 | mov [sym], ebx |
880 | mov ecx, [edx+CFH.nSymbols] |
880 | mov ecx, [edx+CFH.nSymbols] |
881 | add ecx,ecx |
881 | add ecx,ecx |
882 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
882 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
883 | add ecx, [sym] |
883 | add ecx, [sym] |
884 | mov [strings], ecx |
884 | mov [strings], ecx |
885 | 885 | ||
886 | lea ebx, [exports] |
886 | lea ebx, [exports] |
887 | mov dword [ebx], kernel_export |
887 | mov dword [ebx], kernel_export |
888 | mov dword [ebx+4], 0 |
888 | mov dword [ebx+4], 0 |
889 | lea eax, [edx+20] |
889 | lea eax, [edx+20] |
890 | 890 | ||
891 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
891 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
892 | [strings], ebx |
892 | [strings], ebx |
893 | test eax, eax |
893 | test eax, eax |
894 | jz .link_fail |
894 | jz .link_fail |
895 | 895 | ||
896 | mov ebx, [coff] |
896 | mov ebx, [coff] |
897 | add ebx, 20 |
897 | add ebx, 20 |
898 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
898 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
899 | 899 | ||
900 | mov ebx, [coff] |
900 | mov ebx, [coff] |
901 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion |
901 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion |
902 | test eax, eax |
902 | test eax, eax |
903 | jz .link_fail |
903 | jz .link_fail |
904 | 904 | ||
905 | mov eax, [eax] |
905 | mov eax, [eax] |
906 | shr eax, 16 |
906 | shr eax, 16 |
907 | cmp eax, DRV_COMPAT |
907 | cmp eax, DRV_COMPAT |
908 | jb .ver_fail |
908 | jb .ver_fail |
909 | 909 | ||
910 | cmp eax, DRV_CURRENT |
910 | cmp eax, DRV_CURRENT |
911 | ja .ver_fail |
911 | ja .ver_fail |
912 | 912 | ||
913 | mov ebx, [coff] |
913 | mov ebx, [coff] |
914 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
914 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
915 | mov [start], eax |
915 | mov [start], eax |
916 | 916 | ||
917 | stdcall kernel_free, [coff] |
917 | stdcall kernel_free, [coff] |
918 | 918 | ||
919 | mov ebx, [start] |
919 | mov ebx, [start] |
920 | stdcall ebx, DRV_ENTRY |
920 | stdcall ebx, DRV_ENTRY |
921 | test eax, eax |
921 | test eax, eax |
922 | jnz .ok |
922 | jnz .ok |
923 | 923 | ||
924 | stdcall kernel_free, [img_base] |
924 | stdcall kernel_free, [img_base] |
925 | xor eax, eax |
925 | xor eax, eax |
926 | ret |
926 | ret |
927 | .ok: |
927 | .ok: |
928 | mov ebx, [img_base] |
928 | mov ebx, [img_base] |
929 | mov [eax+SRV.base], ebx |
929 | mov [eax+SRV.base], ebx |
930 | mov ecx, [start] |
930 | mov ecx, [start] |
931 | mov [eax+SRV.entry], ecx |
931 | mov [eax+SRV.entry], ecx |
932 | ret |
932 | ret |
933 | 933 | ||
934 | .ver_fail: |
934 | .ver_fail: |
935 | mov esi, msg_CR |
935 | mov esi, msg_CR |
936 | call sys_msg_board_str |
936 | call sys_msg_board_str |
937 | mov esi, [driver_name] |
937 | mov esi, [driver_name] |
938 | call sys_msg_board_str |
938 | call sys_msg_board_str |
939 | mov esi, msg_CR |
939 | mov esi, msg_CR |
940 | call sys_msg_board_str |
940 | call sys_msg_board_str |
941 | mov esi, msg_version |
941 | mov esi, msg_version |
942 | call sys_msg_board_str |
942 | call sys_msg_board_str |
943 | mov esi, msg_www |
943 | mov esi, msg_www |
944 | call sys_msg_board_str |
944 | call sys_msg_board_str |
945 | jmp .cleanup |
945 | jmp .cleanup |
946 | 946 | ||
947 | .link_fail: |
947 | .link_fail: |
948 | mov esi, msg_module |
948 | mov esi, msg_module |
949 | call sys_msg_board_str |
949 | call sys_msg_board_str |
950 | mov esi, [driver_name] |
950 | mov esi, [driver_name] |
951 | call sys_msg_board_str |
951 | call sys_msg_board_str |
952 | mov esi, msg_CR |
952 | mov esi, msg_CR |
953 | call sys_msg_board_str |
953 | call sys_msg_board_str |
954 | .cleanup: |
954 | .cleanup: |
955 | stdcall kernel_free,[img_base] |
955 | stdcall kernel_free,[img_base] |
956 | .fail: |
956 | .fail: |
957 | stdcall kernel_free, [coff] |
957 | stdcall kernel_free, [coff] |
958 | .exit: |
958 | .exit: |
959 | xor eax, eax |
959 | xor eax, eax |
960 | ret |
960 | ret |
961 | endp |
961 | endp |
962 | 962 | ||
963 | align 4 |
963 | align 4 |
964 | proc load_library stdcall, file_name:dword |
964 | proc load_library stdcall, file_name:dword |
965 | locals |
965 | locals |
966 | coff dd ? |
966 | coff dd ? |
967 | sym dd ? |
967 | sym dd ? |
968 | strings dd ? |
968 | strings dd ? |
969 | img_size dd ? |
969 | img_size dd ? |
970 | img_base dd ? |
970 | img_base dd ? |
971 | exports dd ? |
971 | exports dd ? |
972 | endl |
972 | endl |
973 | 973 | ||
974 | cli |
974 | cli |
975 | 975 | ||
976 | stdcall load_file, [file_name] |
976 | stdcall load_file, [file_name] |
977 | test eax, eax |
977 | test eax, eax |
978 | jz .fail |
978 | jz .fail |
979 | 979 | ||
980 | mov [coff], eax |
980 | mov [coff], eax |
981 | movzx ecx, [eax+CFH.nSections] |
981 | movzx ecx, [eax+CFH.nSections] |
982 | xor ebx, ebx |
982 | xor ebx, ebx |
983 | 983 | ||
984 | lea edx, [eax+20] |
984 | lea edx, [eax+20] |
985 | @@: |
985 | @@: |
986 | add ebx, [edx+CFS.SizeOfRawData] |
986 | add ebx, [edx+CFS.SizeOfRawData] |
987 | add ebx, 15 |
987 | add ebx, 15 |
988 | and ebx, not 15 |
988 | and ebx, not 15 |
989 | add edx, COFF_SECTION_SIZE |
989 | add edx, COFF_SECTION_SIZE |
990 | dec ecx |
990 | dec ecx |
991 | jnz @B |
991 | jnz @B |
992 | mov [img_size], ebx |
992 | mov [img_size], ebx |
993 | 993 | ||
994 | call init_heap |
994 | call init_heap |
995 | stdcall user_alloc, [img_size] |
995 | stdcall user_alloc, [img_size] |
996 | 996 | ||
997 | test eax, eax |
997 | test eax, eax |
998 | jz .fail |
998 | jz .fail |
999 | mov [img_base], eax |
999 | mov [img_base], eax |
1000 | 1000 | ||
1001 | mov edx, [coff] |
1001 | mov edx, [coff] |
1002 | movzx ebx, [edx+CFH.nSections] |
1002 | movzx ebx, [edx+CFH.nSections] |
1003 | mov edi, [img_base] |
1003 | mov edi, [img_base] |
1004 | lea eax, [edx+20] |
1004 | lea eax, [edx+20] |
1005 | @@: |
1005 | @@: |
1006 | mov [eax+CFS.VirtualAddress], edi |
1006 | mov [eax+CFS.VirtualAddress], edi |
1007 | mov esi, [eax+CFS.PtrRawData] |
1007 | mov esi, [eax+CFS.PtrRawData] |
1008 | test esi, esi |
1008 | test esi, esi |
1009 | jnz .copy |
1009 | jnz .copy |
1010 | add edi, [eax+CFS.SizeOfRawData] |
1010 | add edi, [eax+CFS.SizeOfRawData] |
1011 | jmp .next |
1011 | jmp .next |
1012 | .copy: |
1012 | .copy: |
1013 | add esi, edx |
1013 | add esi, edx |
1014 | ; add edi, new_app_base |
1014 | ; add edi, new_app_base |
1015 | mov ecx, [eax+CFS.SizeOfRawData] |
1015 | mov ecx, [eax+CFS.SizeOfRawData] |
1016 | cld |
1016 | cld |
1017 | rep movsb |
1017 | rep movsb |
1018 | .next: |
1018 | .next: |
1019 | add edi, 15 ;-new_app_base |
1019 | add edi, 15 ;-new_app_base |
1020 | and edi, -16 |
1020 | and edi, -16 |
1021 | add eax, COFF_SECTION_SIZE |
1021 | add eax, COFF_SECTION_SIZE |
1022 | dec ebx |
1022 | dec ebx |
1023 | jnz @B |
1023 | jnz @B |
1024 | 1024 | ||
1025 | mov ebx, [edx+CFH.pSymTable] |
1025 | mov ebx, [edx+CFH.pSymTable] |
1026 | add ebx, edx |
1026 | add ebx, edx |
1027 | mov [sym], ebx |
1027 | mov [sym], ebx |
1028 | mov ecx, [edx+CFH.nSymbols] |
1028 | mov ecx, [edx+CFH.nSymbols] |
1029 | add ecx,ecx |
1029 | add ecx,ecx |
1030 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
1030 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
1031 | add ecx, [sym] |
1031 | add ecx, [sym] |
1032 | mov [strings], ecx |
1032 | mov [strings], ecx |
1033 | 1033 | ||
1034 | lea eax, [edx+20] |
1034 | lea eax, [edx+20] |
1035 | 1035 | ||
1036 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
1036 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
1037 | [strings], dword 0 |
1037 | [strings], dword 0 |
1038 | test eax, eax |
1038 | test eax, eax |
1039 | jnz @F |
1039 | jnz @F |
1040 | 1040 | ||
1041 | @@: |
1041 | @@: |
1042 | mov edx, [coff] |
1042 | mov edx, [coff] |
- | 1043 | ||
1043 | movzx ebx, [edx+CFH.nSections] |
1044 | ; movzx ebx, [edx+CFH.nSections] |
1044 | mov edi, new_app_base |
1045 | ; xor edi, edi |
1045 | lea eax, [edx+20] |
1046 | ; lea eax, [edx+20] |
1046 | @@: |
1047 | ;@@: |
1047 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
1048 | ; add [eax+CFS.VirtualAddress], edi ;patch user space offset |
1048 | add eax, COFF_SECTION_SIZE |
1049 | ; add eax, COFF_SECTION_SIZE |
1049 | dec ebx |
1050 | ; dec ebx |
1050 | jnz @B |
1051 | ; jnz @B |
1051 | 1052 | ||
1052 | add edx, 20 |
1053 | add edx, 20 |
1053 | stdcall fix_coff_relocs, [coff], edx, [sym] |
1054 | stdcall fix_coff_relocs, [coff], edx, [sym] |
1054 | 1055 | ||
1055 | mov ebx, [coff] |
1056 | mov ebx, [coff] |
1056 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
1057 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
1057 | mov [exports], eax |
1058 | mov [exports], eax |
1058 | 1059 | ||
1059 | stdcall kernel_free, [coff] |
1060 | stdcall kernel_free, [coff] |
1060 | mov eax, [exports] |
1061 | mov eax, [exports] |
1061 | ret |
1062 | ret |
1062 | .fail: |
1063 | .fail: |
1063 | xor eax, eax |
1064 | xor eax, eax |
1064 | ret |
1065 | ret |
1065 | endp |
1066 | endp |
1066 | 1067 | ||
1067 | align 4 |
1068 | align 4 |
1068 | proc stop_all_services |
1069 | proc stop_all_services |
1069 | 1070 | ||
1070 | mov edx, [srv.fd] |
1071 | mov edx, [srv.fd] |
1071 | .next: |
1072 | .next: |
1072 | cmp edx, srv.fd-SRV_FD_OFFSET |
1073 | cmp edx, srv.fd-SRV_FD_OFFSET |
1073 | je .done |
1074 | je .done |
1074 | cmp [edx+SRV.magic], ' SRV' |
1075 | cmp [edx+SRV.magic], ' SRV' |
1075 | jne .next |
1076 | jne .next |
1076 | cmp [edx+SRV.size], SRV_SIZE |
1077 | cmp [edx+SRV.size], SRV_SIZE |
1077 | jne .next |
1078 | jne .next |
1078 | 1079 | ||
1079 | mov ebx, [edx+SRV.entry] |
1080 | mov ebx, [edx+SRV.entry] |
1080 | mov edx, [edx+SRV.fd] |
1081 | mov edx, [edx+SRV.fd] |
1081 | test ebx, ebx |
1082 | test ebx, ebx |
1082 | jz .next |
1083 | jz .next |
1083 | 1084 | ||
1084 | push edx |
1085 | push edx |
1085 | stdcall ebx, dword -1 |
1086 | stdcall ebx, dword -1 |
1086 | pop edx |
1087 | pop edx |
1087 | jmp .next |
1088 | jmp .next |
1088 | .done: |
1089 | .done: |
1089 | ret |
1090 | ret |
1090 | endp |
1091 | endp |
1091 | 1092 | ||
1092 | ; param |
1093 | ; param |
1093 | ; eax= size |
1094 | ; eax= size |
1094 | ; ebx= pid |
1095 | ; ebx= pid |
1095 | 1096 | ||
1096 | align 4 |
1097 | align 4 |
1097 | create_kernel_object: |
1098 | create_kernel_object: |
1098 | 1099 | ||
1099 | push ebx |
1100 | push ebx |
1100 | call malloc |
1101 | call malloc |
1101 | pop ebx |
1102 | pop ebx |
1102 | test eax, eax |
1103 | test eax, eax |
1103 | jz .fail |
1104 | jz .fail |
1104 | 1105 | ||
1105 | mov ecx,[current_slot] |
1106 | mov ecx,[current_slot] |
1106 | add ecx, APP_OBJ_OFFSET |
1107 | add ecx, APP_OBJ_OFFSET |
1107 | 1108 | ||
1108 | pushfd |
1109 | pushfd |
1109 | cli |
1110 | cli |
1110 | mov edx, [ecx+APPOBJ.fd] |
1111 | mov edx, [ecx+APPOBJ.fd] |
1111 | mov [eax+APPOBJ.fd], edx |
1112 | mov [eax+APPOBJ.fd], edx |
1112 | mov [eax+APPOBJ.bk], ecx |
1113 | mov [eax+APPOBJ.bk], ecx |
1113 | mov [eax+APPOBJ.pid], ebx |
1114 | mov [eax+APPOBJ.pid], ebx |
1114 | 1115 | ||
1115 | mov [ecx+APPOBJ.fd], eax |
1116 | mov [ecx+APPOBJ.fd], eax |
1116 | mov [edx+APPOBJ.bk], eax |
1117 | mov [edx+APPOBJ.bk], eax |
1117 | popfd |
1118 | popfd |
1118 | .fail: |
1119 | .fail: |
1119 | ret |
1120 | ret |
1120 | 1121 | ||
1121 | ; param |
1122 | ; param |
1122 | ; eax= object |
1123 | ; eax= object |
1123 | 1124 | ||
1124 | align 4 |
1125 | align 4 |
1125 | destroy_kernel_object: |
1126 | destroy_kernel_object: |
1126 | 1127 | ||
1127 | pushfd |
1128 | pushfd |
1128 | cli |
1129 | cli |
1129 | mov ebx, [eax+APPOBJ.fd] |
1130 | mov ebx, [eax+APPOBJ.fd] |
1130 | mov ecx, [eax+APPOBJ.bk] |
1131 | mov ecx, [eax+APPOBJ.bk] |
1131 | mov [ebx+APPOBJ.bk], ecx |
1132 | mov [ebx+APPOBJ.bk], ecx |
1132 | mov [ecx+APPOBJ.fd], ebx |
1133 | mov [ecx+APPOBJ.fd], ebx |
1133 | popfd |
1134 | popfd |
1134 | 1135 | ||
1135 | xor edx, edx ;clear common header |
1136 | xor edx, edx ;clear common header |
1136 | mov [eax], edx |
1137 | mov [eax], edx |
1137 | mov [eax+4], edx |
1138 | mov [eax+4], edx |
1138 | mov [eax+8], edx |
1139 | mov [eax+8], edx |
1139 | mov [eax+12], edx |
1140 | mov [eax+12], edx |
1140 | mov [eax+16], edx |
1141 | mov [eax+16], edx |
1141 | 1142 | ||
1142 | call free ;release object memory |
1143 | call free ;release object memory |
1143 | ret |
1144 | ret |
1144 | 1145 | ||
1145 | 1146 | ||
1146 | 1147 | ||
1147 | if 0 |
1148 | if 0 |
1148 | 1149 | ||
1149 | irq: |
1150 | irq: |
1150 | 1151 | ||
1151 | .irq0: |
1152 | .irq0: |
1152 | pusfd |
1153 | pusfd |
1153 | pushad |
1154 | pushad |
1154 | push IRQ_0 |
1155 | push IRQ_0 |
1155 | jmp .master |
1156 | jmp .master |
1156 | .irq_1: |
1157 | .irq_1: |
1157 | pusfd |
1158 | pusfd |
1158 | pushad |
1159 | pushad |
1159 | push IRQ_1 |
1160 | push IRQ_1 |
1160 | jmp .master |
1161 | jmp .master |
1161 | 1162 | ||
1162 | .master: |
1163 | .master: |
1163 | mov ax, app_data |
1164 | mov ax, app_data |
1164 | mov ds, eax |
1165 | mov ds, eax |
1165 | mov es, eax |
1166 | mov es, eax |
1166 | mov ebx, [esp+4] ;IRQ_xx |
1167 | mov ebx, [esp+4] ;IRQ_xx |
1167 | mov eax, [irq_handlers+ebx+4] |
1168 | mov eax, [irq_handlers+ebx+4] |
1168 | call intr_handler |
1169 | call intr_handler |
1169 | mov ecx, [esp+4] |
1170 | mov ecx, [esp+4] |
1170 | cmp [irq_actids+ecx*4], 0 |
1171 | cmp [irq_actids+ecx*4], 0 |
1171 | je @F |
1172 | je @F |
1172 | in al, 0x21 |
1173 | in al, 0x21 |
1173 | bts eax, ecx |
1174 | bts eax, ecx |
1174 | out 0x21, al |
1175 | out 0x21, al |
1175 | mov al, 0x20 |
1176 | mov al, 0x20 |
1176 | out 0x20, al |
1177 | out 0x20, al |
1177 | jmp .restart |
1178 | jmp .restart |
1178 | 1179 | ||
1179 | .slave: |
1180 | .slave: |
1180 | mov ax, app_data |
1181 | mov ax, app_data |
1181 | mov ds, eax |
1182 | mov ds, eax |
1182 | mov es, eax |
1183 | mov es, eax |
1183 | mov ebx, [esp+4] ;IRQ_xx |
1184 | mov ebx, [esp+4] ;IRQ_xx |
1184 | mov eax, [irq_handlers+ebx+4] |
1185 | mov eax, [irq_handlers+ebx+4] |
1185 | call intr_handler |
1186 | call intr_handler |
1186 | mov ecx, [esp+4] |
1187 | mov ecx, [esp+4] |
1187 | sub ecx, 8 |
1188 | sub ecx, 8 |
1188 | cmp [irq_actids+ecx*4], 0 |
1189 | cmp [irq_actids+ecx*4], 0 |
1189 | je @F |
1190 | je @F |
1190 | in al, 0xA1 |
1191 | in al, 0xA1 |
1191 | bts eax, ecx |
1192 | bts eax, ecx |
1192 | out 0xA1, al |
1193 | out 0xA1, al |
1193 | mov al, 0x20 |
1194 | mov al, 0x20 |
1194 | out 0xA0, al |
1195 | out 0xA0, al |
1195 | out 0x20, al |
1196 | out 0x20, al |
1196 | .restart: |
1197 | .restart: |
1197 | mov ebx, [next_slot] |
1198 | mov ebx, [next_slot] |
1198 | test ebx, ebx |
1199 | test ebx, ebx |
1199 | jz @F |
1200 | jz @F |
1200 | mov [next_task],0 |
1201 | mov [next_task],0 |
1201 | mov esi, [prev_slot] |
1202 | mov esi, [prev_slot] |
1202 | call do_change_task |
1203 | call do_change_task |
1203 | add esp, 4 |
1204 | add esp, 4 |
1204 | iretd |
1205 | iretd |
1205 | 1206 | ||
1206 | end if |
1207 | end if |