Subversion Repositories Kolibri OS

Rev

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

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