Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 425 $
164 serge 2
 
227 serge 3
DRV_ENTRY    equ  1
4
DRV_EXIT     equ -1
378 serge 5
DRV_COMPAT   equ  4  ;minimal required drivers version
6
DRV_CURRENT  equ  4  ;current drivers model version
214 serge 7
 
227 serge 8
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
9
 
164 serge 10
align 4
11
proc attach_int_handler stdcall, irq:dword, handler:dword
12
 
13
	 mov ebx, [irq]        ;irq num
14
	 test ebx, ebx
15
	 jz .err
16
	 mov eax, [handler]
17
	 test eax, eax
18
	 jz .err
19
	 mov [irq_tab+ebx*4], eax
20
         stdcall enable_irq, [irq]
21
	 ret
22
.err:
23
	 xor eax, eax
24
	 ret
25
endp
26
 
27
align 4
28
proc  detach_int_handler
29
 
30
	   ret
31
endp
32
 
33
align 4
34
proc enable_irq stdcall, irq_line:dword
35
           mov ebx, [irq_line]
36
           mov edx, 0x21
37
           cmp ebx, 8
38
           jb @F
39
           mov edx, 0xA1
40
           sub ebx,8
41
@@:
42
           in al,dx
43
           btr eax, ebx
44
           out dx, al
45
           ret
46
endp
47
 
48
align 16
49
;; proc irq_serv
50
 
51
irq_serv:
52
 
53
.irq_1:
54
	   push eax
55
	   mov eax, 1
56
	   jmp .main
57
align 4
58
.irq_2:
59
	   push eax
60
	   mov eax, 2
61
	   jmp .main
62
align 4
63
.irq_3:
64
	   push eax
65
	   mov eax, 3
66
	   jmp .main
67
align 4
68
.irq_4:
69
	   push eax
70
	   mov eax, 4
71
	   jmp .main
72
align 4
73
.irq_5:
74
	   push eax
75
	   mov eax, 5
76
	   jmp .main
77
align 4
78
.irq_6:
79
	   push eax
80
	   mov eax, 6
81
	   jmp .main
82
align 4
83
.irq_7:
84
	   push eax
85
	   mov eax, 7
86
	   jmp .main
87
align 4
88
.irq_8:
89
	   push eax
90
	   mov eax, 8
91
	   jmp .main
92
align 4
93
.irq_9:
94
	   push eax
95
	   mov eax, 9
96
	   jmp .main
97
align 4
98
.irq_10:
99
	   push eax
100
	   mov eax, 10
101
	   jmp .main
102
align 4
103
.irq_11:
104
	   push eax
105
	   mov eax, 11
106
	   jmp .main
107
align 4
108
.irq_12:
109
	   push eax
110
	   mov eax, 12
111
	   jmp .main
112
align 4
113
.irq_13:
114
	   push eax
115
	   mov eax, 13
116
	   jmp .main
117
align 4
118
.irq_14:
119
	   push eax
120
	   mov eax, 14
121
	   jmp .main
122
align 4
123
.irq_15:
124
	   push eax
125
	   mov eax, 15
126
	   jmp .main
127
 
128
align 16
129
.main:
130
	   save_ring3_context
131
	   mov	 bx, os_data
132
	   mov	 ds, bx
133
	   mov	 es, bx
134
 
135
	   mov ebx, [irq_tab+eax*4]
136
	   test ebx, ebx
137
	   jz .exit
138
 
139
           call ebx
140
 
141
.exit:
142
	   restore_ring3_context
143
 
144
           cmp eax, 8
145
	   mov al, 0x20
146
           jb @f
147
	   out 0xa0, al
148
@@:
149
           out 0x20, al
150
 
151
           pop eax
152
	   iret
153
 
154
align 4
155
proc get_notify stdcall, p_ev:dword
156
 
157
.wait:
158
           mov ebx,[CURRENT_TASK]
159
           shl ebx,8
380 serge 160
           test dword [ebx+SLOT_BASE+0xA8],EVENT_NOTIFY
164 serge 161
	   jz @f
380 serge 162
           and dword [ebx+SLOT_BASE+0xA8], not EVENT_NOTIFY
164 serge 163
	   mov edi, [p_ev]
164
	   mov dword [edi], EV_INTR
380 serge 165
           mov eax, [ebx+SLOT_BASE+APPDATA.event]
164 serge 166
	   mov dword [edi+4], eax
167
	   ret
168
@@:
169
	   call change_task
170
	   jmp .wait
171
endp
172
 
173
align 4
174
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
175
	   xor eax, eax
176
	   xor ebx, ebx
177
	   mov ah, byte [bus]
178
           mov al, 6
179
	   mov bh, byte [devfn]
180
	   mov bl, byte [reg]
181
	   call pci_read_reg
182
	   ret
183
endp
184
 
185
align 4
186
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
187
	   xor eax, eax
188
	   xor ebx, ebx
189
	   mov ah, byte [bus]
190
           mov al, 4
191
	   mov bh, byte [devfn]
192
	   mov bl, byte [reg]
193
	   call pci_read_reg
194
	   ret
195
endp
196
 
197
align 4
198
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
199
	   xor eax, eax
200
	   xor ebx, ebx
201
	   mov ah, byte [bus]
202
           mov al, 8
203
	   mov bh, byte [devfn]
204
	   mov bl, byte [reg]
205
           mov ecx, [val]
206
           call pci_write_reg
207
	   ret
208
endp
209
 
210
handle     equ  IOCTL.handle
211
io_code    equ  IOCTL.io_code
212
input      equ  IOCTL.input
213
inp_size   equ  IOCTL.inp_size
214
output     equ  IOCTL.output
215
out_size   equ  IOCTL.out_size
216
 
217
 
218
align 4
219
proc srv_handler stdcall, ioctl:dword
220
           mov esi, [ioctl]
221
           test esi, esi
222
           jz .err
223
 
224
           mov edi, [esi+handle]
225
           cmp [edi+SRV.magic], ' SRV'
226
	   jne .fail
227
 
228
           cmp [edi+SRV.size], SRV_SIZE
229
	   jne .fail
230
 
231
           stdcall [edi+SRV.srv_proc], esi
232
           ret
233
.fail:
234
           xor eax, eax
235
           not eax
236
           mov [esi+output], eax
237
           mov [esi+out_size], 4
238
           ret
239
.err:
240
           xor eax, eax
241
           not eax
242
           ret
243
endp
244
 
377 serge 245
; param
246
;  ebx= io_control
247
;
248
; retval
249
;  eax= error code
250
 
164 serge 251
align 4
377 serge 252
srv_handlerEx:
253
           test ebx, ebx
254
           jz .fail
255
           add ebx, new_app_base
164 serge 256
 
377 serge 257
           mov eax, [ebx+handle]
258
           cmp [eax+SRV.magic], ' SRV'
164 serge 259
	   jne .fail
260
 
377 serge 261
           cmp [eax+SRV.size], SRV_SIZE
164 serge 262
	   jne .fail
263
 
377 serge 264
           add [ebx+input], new_app_base
265
           add [ebx+output], new_app_base
164 serge 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]
407
           sub ebx, new_app_base
408
           mov ecx, [info]
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]
421
           sub ebx, new_app_base
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]
444
           sub ebx, new_app_base
445
           sub esi, new_app_base
164 serge 446
 
188 serge 447
           mov [cmd], eax
448
           mov [offset], ecx
449
           mov [offset+4], eax
450
           mov [count], edx
451
           mov [buff], esi
452
           mov byte [buff+4], al
453
           mov [name], ebx
454
 
455
           mov eax, 70
456
           lea ebx, [cmd]
457
           sub ebx, new_app_base
458
           int 0x40
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
 
346 diamond 702
        lea     edx, [file_name]
703
        mov     dword [edx], '/rd/'
704
        mov     dword [edx+4], '1/dr'
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
710
@@:
711
        lodsb
712
        test    al, al
713
        jz      @f
714
        stosb
715
        loop    @b
716
@@:
717
        mov     dword [edi], '.obj'
718
        mov     byte [edi+4], 0
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
913
           add edi, new_app_base
914
           mov ecx, [eax+CFS.SizeOfRawData]
915
           cld
916
           rep movsb
917
.next:
918
           add edi, 15-new_app_base
919
           and edi, not 15
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
 
1000
           mov ecx,[CURRENT_TASK]
1001
           shl ecx,8
380 serge 1002
           add ecx, SLOT_BASE+APP_OBJ_OFFSET
281 serge 1003
 
345 serge 1004
           pushfd
1005
           cli
281 serge 1006
           mov edx, [ecx+APPOBJ.fd]
1007
           mov [eax+APPOBJ.fd], edx
1008
           mov [eax+APPOBJ.bk], ecx
1009
           mov [eax+APPOBJ.pid], ebx
1010
 
1011
           mov [ecx+APPOBJ.fd], eax
1012
           mov [edx+APPOBJ.bk], eax
345 serge 1013
           popfd
281 serge 1014
.fail:
1015
           ret
1016
 
1017
; param
1018
;  eax= object
1019
 
1020
align 4
1021
destroy_kernel_object:
1022
 
345 serge 1023
           pushfd
1024
           cli
281 serge 1025
           mov ebx, [eax+APPOBJ.fd]
1026
           mov ecx, [eax+APPOBJ.bk]
1027
           mov [ebx+APPOBJ.bk], ecx
1028
           mov [ecx+APPOBJ.fd], ebx
345 serge 1029
           popfd
281 serge 1030
 
1031
           xor edx, edx        ;clear common header
1032
           mov [eax], edx
1033
           mov [eax+4], edx
1034
           mov [eax+8], edx
1035
           mov [eax+12], edx
1036
           mov [eax+16], edx
1037
 
1038
           call free           ;release object memory
1039
           ret
1040
 
1041
 
346 diamond 1042
;szSound        db 'SOUND',0
1043
;szInfinity     db 'INFINITY',0
1044
szHwMouse      db 'ATI2D',0
164 serge 1045
 
1046
szSTART        db 'START',0
1047
szEXPORTS      db 'EXPORTS',0
1048
szIMPORTS      db 'IMPORTS',0
1049
 
188 serge 1050
msg_unresolved db 'unresolved ',0
1051
msg_module     db 'in module ',0
227 serge 1052
msg_version    db 'incompatible driver version',13,10,0
1053
msg_www        db 'please visit www.kolibrios.org',13,10,0
188 serge 1054
msg_CR         db  13,10,0
1055
 
214 serge 1056
align 4
227 serge 1057
create_cursor    dd 0
214 serge 1058
set_hw_cursor    dd 0
221 serge 1059
hw_restore       dd 0