Subversion Repositories Kolibri OS

Rev

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/.obj'
800
	     file_name rb 13+16+4+1	 ; '/sys/drivers/.obj'
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