Subversion Repositories Kolibri OS

Rev

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

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