Subversion Repositories Kolibri OS

Rev

Rev 672 | Rev 709 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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