Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 488 $
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
269 serge 529
           sub ecx, ebx
530
           xor eax, eax
531
           cld
532
           rep stosb
357 serge 533
           mov ebx, [file_size]
269 serge 534
           pop eax
188 serge 535
           ret
536
.cleanup:
537
           stdcall kernel_free, [file]
538
.fail:
539
           xor eax, eax
237 serge 540
           xor ebx, ebx
188 serge 541
           ret
542
endp
164 serge 543
 
188 serge 544
align 4
545
proc get_proc_ex stdcall, proc_name:dword, imports:dword
546
 
547
.look_up:
548
           mov edx, [imports]
198 serge 549
           test edx, edx
550
           jz .end
188 serge 551
           mov edx, [edx]
552
           test edx, edx
553
           jz .end
554
.next:
555
           mov eax, [edx]
164 serge 556
           test eax, eax
188 serge 557
           jz .next_table
164 serge 558
 
188 serge 559
           push edx
560
           stdcall strncmp, eax, [proc_name], 16
561
           pop edx
562
           test eax, eax
563
           jz .ok
164 serge 564
 
188 serge 565
           add edx,8
566
           jmp .next
567
.next_table:
568
           add [imports], 4
569
           jmp .look_up
570
.ok:
571
           mov eax, [edx+4]
572
           ret
573
.end:
574
           xor eax, eax
575
           ret
576
endp
164 serge 577
 
188 serge 578
align 4
579
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
580
                      sym_count:dword, strings:dword, imports:dword
581
           locals
582
             retval dd ?
583
           endl
164 serge 584
 
188 serge 585
           mov edi, [symbols]
586
           mov [retval], 1
587
.fix:
588
           movzx ebx, [edi+CSYM.SectionNumber]
589
           test ebx, ebx
590
           jnz .internal
591
           mov eax, dword [edi+CSYM.Name]
592
           test eax, eax
593
           jnz @F
164 serge 594
 
188 serge 595
           mov edi, [edi+4]
596
           add edi, [strings]
597
@@:
598
           push edi
599
           stdcall get_proc_ex, edi,[imports]
600
           pop edi
164 serge 601
 
188 serge 602
           xor ebx, ebx
603
           test eax, eax
604
           jnz @F
164 serge 605
 
188 serge 606
           mov esi, msg_unresolved
607
           call sys_msg_board_str
608
           mov esi, edi
609
           call sys_msg_board_str
610
           mov esi, msg_CR
611
           call sys_msg_board_str
164 serge 612
 
188 serge 613
           mov [retval],0
614
@@:
615
           mov edi, [symbols]
616
           mov [edi+CSYM.Value], eax
617
           jmp .next
618
.internal:
619
           dec ebx
620
           shl ebx, 3
621
           lea ebx, [ebx+ebx*4]
622
           add ebx, [sec]
623
 
624
           mov eax, [ebx+CFS.VirtualAddress]
625
           add [edi+CSYM.Value], eax
626
.next:
627
           add edi, CSYM_SIZE
628
           mov [symbols], edi
629
           dec [sym_count]
630
           jnz .fix
631
           mov eax, [retval]
632
           ret
164 serge 633
endp
634
 
635
align 4
188 serge 636
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
164 serge 637
	   locals
188 serge 638
             n_sec     dd ?
164 serge 639
	   endl
640
 
188 serge 641
           mov eax, [coff]
642
           movzx ebx, [eax+CFH.nSections]
643
           mov [n_sec], ebx
644
.fix_sec:
645
           mov esi, [sec]
164 serge 646
	   mov edi, [esi+CFS.PtrReloc]
188 serge 647
           add edi, [coff]
164 serge 648
 
188 serge 649
           movzx ecx, [esi+CFS.NumReloc]
650
           test ecx, ecx
651
           jz .next
652
.next_reloc:
164 serge 653
	   mov ebx, [edi+CRELOC.SymIndex]
654
	   add ebx,ebx
655
	   lea ebx,[ebx+ebx*8]
188 serge 656
           add ebx, [sym]
164 serge 657
 
188 serge 658
           mov edx, [ebx+CSYM.Value]
164 serge 659
 
188 serge 660
           cmp [edi+CRELOC.Type], 6
661
           je .dir_32
164 serge 662
 
188 serge 663
           cmp [edi+CRELOC.Type], 20
664
           jne .next_reloc
665
.rel_32:
164 serge 666
	   mov eax, [edi+CRELOC.VirtualAddress]
188 serge 667
           add eax, [esi+CFS.VirtualAddress]
668
           sub edx, eax
669
           sub edx, 4
670
           jmp .fix
671
.dir_32:
672
	   mov eax, [edi+CRELOC.VirtualAddress]
673
           add eax, [esi+CFS.VirtualAddress]
674
.fix:
675
           add [eax], edx
676
           add edi, 10
677
           dec ecx
678
           jnz .next_reloc
679
.next:
206 serge 680
           add [sec], COFF_SECTION_SIZE
188 serge 681
           dec [n_sec]
682
           jnz .fix_sec
164 serge 683
.exit:
684
	   ret
685
endp
686
 
188 serge 687
align 4
346 diamond 688
proc load_driver stdcall, driver_name:dword
188 serge 689
           locals
690
             coff      dd ?
691
             sym       dd ?
692
             strings   dd ?
693
             img_size  dd ?
694
             img_base  dd ?
695
             start     dd ?
696
 
697
             exports   dd ?   ;fake exports table
698
                       dd ?
346 diamond 699
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
188 serge 700
           endl
701
 
465 serge 702
           lea     edx, [file_name]
488 spraid 703
           mov     dword [edx], '%sys'
704
           mov     dword [edx+4], '%/dr'
465 serge 705
           mov     dword [edx+8], 'iver'
706
           mov     word [edx+12], 's/'
707
           mov     esi, [driver_name]
708
           lea     edi, [edx+14]
709
           mov     ecx, 16
346 diamond 710
@@:
465 serge 711
           lodsb
712
           test    al, al
713
           jz      @f
714
           stosb
715
           loop    @b
346 diamond 716
@@:
465 serge 717
           mov     dword [edi], '.obj'
718
           mov     byte [edi+4], 0
346 diamond 719
           stdcall load_file, edx
214 serge 720
 
188 serge 721
           test eax, eax
227 serge 722
           jz .exit
188 serge 723
 
724
           mov [coff], eax
725
 
726
           movzx ecx, [eax+CFH.nSections]
727
           xor ebx, ebx
728
 
729
           lea edx, [eax+20]
730
@@:
731
           add ebx, [edx+CFS.SizeOfRawData]
732
           add ebx, 15
733
           and ebx, not 15
206 serge 734
           add edx, COFF_SECTION_SIZE
188 serge 735
           dec ecx
736
           jnz @B
737
           mov [img_size], ebx
738
 
739
           stdcall kernel_alloc, ebx
740
           test eax, eax
741
           jz .fail
742
           mov [img_base], eax
743
 
744
           mov edi, eax
745
           xor eax, eax
746
           mov ecx, [img_size]
747
           add ecx, 4095
748
           and ecx, not 4095
749
           shr ecx, 2
750
           cld
751
           rep stosd
752
 
753
           mov edx, [coff]
754
           movzx ebx, [edx+CFH.nSections]
755
           mov edi, [img_base]
756
           lea eax, [edx+20]
757
@@:
758
           mov [eax+CFS.VirtualAddress], edi
759
           mov esi, [eax+CFS.PtrRawData]
760
           test esi, esi
761
           jnz .copy
762
           add edi, [eax+CFS.SizeOfRawData]
763
           jmp .next
764
.copy:
765
           add esi, edx
766
           mov ecx, [eax+CFS.SizeOfRawData]
767
           cld
768
           rep movsb
769
.next:
770
           add edi, 15
771
           and edi, not 15
206 serge 772
           add eax, COFF_SECTION_SIZE
188 serge 773
           dec ebx
774
           jnz @B
775
 
776
           mov ebx, [edx+CFH.pSymTable]
777
           add ebx, edx
778
           mov [sym], ebx
779
           mov ecx, [edx+CFH.nSymbols]
780
           add ecx,ecx
781
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
782
           add ecx, [sym]
783
           mov [strings], ecx
784
 
785
           lea ebx, [exports]
786
           mov dword [ebx], kernel_export
787
           mov dword [ebx+4], 0
788
           lea eax, [edx+20]
789
 
790
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
791
                                     [strings], ebx
792
           test eax, eax
227 serge 793
           jz .link_fail
188 serge 794
 
795
           mov ebx, [coff]
796
           add ebx, 20
797
           stdcall fix_coff_relocs, [coff], ebx, [sym]
798
 
799
           mov ebx, [coff]
227 serge 800
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
801
           test eax, eax
802
           jz .link_fail
803
 
804
           mov eax, [eax]
805
           shr eax, 16
806
           cmp eax, DRV_COMPAT
807
           jb .ver_fail
808
 
809
           cmp eax, DRV_CURRENT
810
           ja .ver_fail
811
 
812
           mov ebx, [coff]
188 serge 813
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
814
           mov [start], eax
815
 
816
           stdcall kernel_free, [coff]
817
 
818
           mov ebx, [start]
214 serge 819
           stdcall ebx, DRV_ENTRY
188 serge 820
           test eax, eax
821
           jnz .ok
822
 
823
           stdcall kernel_free, [img_base]
824
           xor eax, eax
825
           ret
826
.ok:
827
           mov ebx, [img_base]
828
           mov [eax+SRV.base], ebx
214 serge 829
           mov ecx, [start]
830
           mov [eax+SRV.entry], ecx
188 serge 831
           ret
227 serge 832
 
833
.ver_fail:
834
           mov esi, msg_CR
835
           call sys_msg_board_str
346 diamond 836
           mov esi, [driver_name]
227 serge 837
           call sys_msg_board_str
838
           mov esi, msg_CR
839
           call sys_msg_board_str
840
           mov esi, msg_version
841
           call sys_msg_board_str
842
           mov esi, msg_www
843
           call sys_msg_board_str
844
           jmp .cleanup
845
 
846
.link_fail:
847
           mov esi, msg_module
848
           call sys_msg_board_str
346 diamond 849
           mov esi, [driver_name]
227 serge 850
           call sys_msg_board_str
851
           mov esi, msg_CR
852
           call sys_msg_board_str
853
.cleanup:
854
           stdcall kernel_free,[img_base]
188 serge 855
.fail:
227 serge 856
           stdcall kernel_free, [coff]
857
.exit:
188 serge 858
           xor eax, eax
859
           ret
164 serge 860
endp
861
 
198 serge 862
align 4
863
proc load_library stdcall, file_name:dword
864
           locals
865
             coff      dd ?
866
             sym       dd ?
867
             strings   dd ?
868
             img_size  dd ?
869
             img_base  dd ?
870
             exports   dd ?
871
           endl
872
 
873
           cli
874
 
875
           stdcall load_file, [file_name]
876
           test eax, eax
877
           jz .fail
878
 
879
           mov [coff], eax
880
           movzx ecx, [eax+CFH.nSections]
881
           xor ebx, ebx
882
 
883
           lea edx, [eax+20]
884
@@:
885
           add ebx, [edx+CFS.SizeOfRawData]
886
           add ebx, 15
887
           and ebx, not 15
206 serge 888
           add edx, COFF_SECTION_SIZE
198 serge 889
           dec ecx
890
           jnz @B
891
           mov [img_size], ebx
892
 
893
           call init_heap
894
           stdcall user_alloc, [img_size]
895
 
896
           test eax, eax
897
           jz .fail
898
           mov [img_base], eax
899
 
900
           mov edx, [coff]
901
           movzx ebx, [edx+CFH.nSections]
902
           mov edi, [img_base]
903
           lea eax, [edx+20]
904
@@:
905
           mov [eax+CFS.VirtualAddress], edi
906
           mov esi, [eax+CFS.PtrRawData]
907
           test esi, esi
908
           jnz .copy
909
           add edi, [eax+CFS.SizeOfRawData]
910
           jmp .next
911
.copy:
912
           add esi, edx
465 serge 913
    ;       add edi, new_app_base
198 serge 914
           mov ecx, [eax+CFS.SizeOfRawData]
915
           cld
916
           rep movsb
917
.next:
465 serge 918
           add edi, 15 ;-new_app_base
919
           and edi, -16
206 serge 920
           add eax, COFF_SECTION_SIZE
198 serge 921
           dec ebx
922
           jnz @B
923
 
924
           mov ebx, [edx+CFH.pSymTable]
925
           add ebx, edx
926
           mov [sym], ebx
927
           mov ecx, [edx+CFH.nSymbols]
928
           add ecx,ecx
929
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
930
           add ecx, [sym]
931
           mov [strings], ecx
932
 
933
           lea eax, [edx+20]
934
 
935
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
936
                                     [strings], dword 0
937
           test eax, eax
938
           jnz @F
939
 
940
@@:
941
           mov edx, [coff]
942
           movzx ebx, [edx+CFH.nSections]
943
           mov edi, new_app_base
944
           lea eax, [edx+20]
945
@@:
946
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
206 serge 947
           add eax, COFF_SECTION_SIZE
198 serge 948
           dec ebx
949
           jnz @B
950
 
951
           add edx, 20
952
           stdcall fix_coff_relocs, [coff], edx, [sym]
953
 
954
           mov ebx, [coff]
955
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
956
           mov [exports], eax
957
 
958
           stdcall kernel_free, [coff]
959
           mov eax, [exports]
960
           ret
961
.fail:
962
           xor eax, eax
963
           ret
964
endp
965
 
214 serge 966
align 4
967
proc stop_all_services
278 serge 968
 
969
           mov edx, [srv.fd]
214 serge 970
.next:
278 serge 971
           cmp edx,  srv.fd-SRV_FD_OFFSET
972
           je .done
973
           cmp [edx+SRV.magic], ' SRV'
227 serge 974
           jne .next
278 serge 975
           cmp [edx+SRV.size], SRV_SIZE
227 serge 976
           jne .next
278 serge 977
           mov ebx, [edx+SRV.entry]
978
           mov edx, [edx+SRV.fd]
979
           push edx
214 serge 980
           stdcall ebx, dword -1
278 serge 981
           pop edx
214 serge 982
           jmp .next
278 serge 983
.done:
984
           ret
214 serge 985
endp
198 serge 986
 
281 serge 987
; param
291 serge 988
;  eax= size
989
;  ebx= pid
214 serge 990
 
281 serge 991
align 4
992
create_kernel_object:
993
 
994
           push ebx
995
           call malloc
996
           pop ebx
997
           test eax, eax
998
           jz .fail
999
 
465 serge 1000
           mov ecx,[current_slot]
1001
           add ecx, APP_OBJ_OFFSET
281 serge 1002
 
345 serge 1003
           pushfd
1004
           cli
281 serge 1005
           mov edx, [ecx+APPOBJ.fd]
1006
           mov [eax+APPOBJ.fd], edx
1007
           mov [eax+APPOBJ.bk], ecx
1008
           mov [eax+APPOBJ.pid], ebx
1009
 
1010
           mov [ecx+APPOBJ.fd], eax
1011
           mov [edx+APPOBJ.bk], eax
345 serge 1012
           popfd
281 serge 1013
.fail:
1014
           ret
1015
 
1016
; param
1017
;  eax= object
1018
 
1019
align 4
1020
destroy_kernel_object:
1021
 
345 serge 1022
           pushfd
1023
           cli
281 serge 1024
           mov ebx, [eax+APPOBJ.fd]
1025
           mov ecx, [eax+APPOBJ.bk]
1026
           mov [ebx+APPOBJ.bk], ecx
1027
           mov [ecx+APPOBJ.fd], ebx
345 serge 1028
           popfd
281 serge 1029
 
1030
           xor edx, edx        ;clear common header
1031
           mov [eax], edx
1032
           mov [eax+4], edx
1033
           mov [eax+8], edx
1034
           mov [eax+12], edx
1035
           mov [eax+16], edx
1036
 
1037
           call free           ;release object memory
1038
           ret
1039
 
1040
 
164 serge 1041
 
465 serge 1042
if 0
164 serge 1043
 
465 serge 1044
irq:
188 serge 1045
 
465 serge 1046
.irq0:
1047
           pusfd
1048
           pushad
1049
           push IRQ_0
1050
           jmp .master
1051
.irq_1:
1052
           pusfd
1053
           pushad
1054
           push IRQ_1
1055
           jmp .master
1056
 
1057
.master:
1058
           mov ax, app_data
1059
           mov ds, eax
1060
           mov es, eax
1061
           mov ebx, [esp+4]  ;IRQ_xx
1062
           mov eax, [irq_handlers+ebx+4]
1063
           call intr_handler
1064
           mov ecx, [esp+4]
1065
           cmp [irq_actids+ecx*4], 0
1066
           je @F
1067
           in al, 0x21
1068
           bts eax, ecx
1069
           out 0x21, al
1070
           mov al, 0x20
1071
           out 0x20, al
1072
           jmp .restart
1073
 
1074
.slave:
1075
           mov ax, app_data
1076
           mov ds, eax
1077
           mov es, eax
1078
           mov ebx, [esp+4]  ;IRQ_xx
1079
           mov eax, [irq_handlers+ebx+4]
1080
           call intr_handler
1081
           mov ecx, [esp+4]
1082
           sub ecx, 8
1083
           cmp [irq_actids+ecx*4], 0
1084
           je @F
1085
           in al, 0xA1
1086
           bts eax, ecx
1087
           out 0xA1, al
1088
           mov al, 0x20
1089
           out 0xA0, al
1090
           out 0x20, al
1091
.restart:
1092
           mov ebx, [next_slot]
1093
           test ebx, ebx
1094
           jz @F
1095
           mov [next_task],0
1096
           mov esi, [prev_slot]
1097
           call do_change_task
1098
           add esp, 4
1099
           iretd
1100
 
1101
end if
1102