Subversion Repositories Kolibri OS

Rev

Rev 774 | Rev 802 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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