Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 429 $
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
 
429 serge 455
           pushad
456
           push eax
457
           lea eax, [cmd]
458
           sub eax, new_app_base
459
           call file_system_lfn
460
           pop eax
461
           popad
188 serge 462
           ret
463
endp
464
 
363 serge 465
; description
466
;  allocate kernel memory and loads the specified file
467
;
468
; param
469
;  file_name= full path to file
470
;
471
; retval
472
;  eax= file image in kernel memory
473
;  ebx= size of file
474
;
475
; warging
476
;  You mast call kernel_free() to delete each file
477
;  loaded by the load_file() function
478
 
188 serge 479
align 4
480
proc load_file stdcall, file_name:dword
481
           locals
482
             attr       dd ?
483
             flags      dd ?
484
             cr_time    dd ?
485
             cr_date    dd ?
486
             acc_time   dd ?
487
             acc_date   dd ?
488
             mod_time   dd ?
489
             mod_date   dd ?
490
             file_size  dd ?
491
 
492
             file       dd ?
211 serge 493
             file2      dd ?
188 serge 494
           endl
495
 
496
           lea eax, [attr]
497
           stdcall get_fileinfo, [file_name], eax
164 serge 498
           test eax, eax
188 serge 499
           jnz .fail
164 serge 500
 
206 serge 501
           mov eax, [file_size]
237 serge 502
           cmp eax, 1024*1024*16
503
           ja .fail
206 serge 504
 
188 serge 505
           stdcall kernel_alloc, [file_size]
506
           mov [file], eax
164 serge 507
 
188 serge 508
           stdcall read_file, [file_name], eax, dword 0, [file_size]
509
           cmp ebx, [file_size]
510
           jne .cleanup
211 serge 511
 
188 serge 512
           mov eax, [file]
211 serge 513
           cmp dword [eax], 0x4B43504B
514
           jne .exit
237 serge 515
           mov ebx, [eax+4]
516
           mov [file_size], ebx
517
           stdcall kernel_alloc, ebx
211 serge 518
 
519
           test eax, eax
520
           jz .cleanup
521
 
522
           mov [file2], eax
523
           stdcall unpack, [file], eax
524
           stdcall kernel_free, [file]
525
           mov eax, [file2]
237 serge 526
           mov ebx, [file_size]
211 serge 527
.exit:
269 serge 528
           push eax
529
           lea edi, [eax+ebx]     ;cleanup remain space
357 serge 530
           mov ecx, 4096          ;from file end
531
           and ebx, 4095
269 serge 532
           sub ecx, ebx
533
           xor eax, eax
534
           cld
535
           rep stosb
357 serge 536
           mov ebx, [file_size]
269 serge 537
           pop eax
188 serge 538
           ret
539
.cleanup:
540
           stdcall kernel_free, [file]
541
.fail:
542
           xor eax, eax
237 serge 543
           xor ebx, ebx
188 serge 544
           ret
545
endp
164 serge 546
 
188 serge 547
align 4
548
proc get_proc_ex stdcall, proc_name:dword, imports:dword
549
 
550
.look_up:
551
           mov edx, [imports]
198 serge 552
           test edx, edx
553
           jz .end
188 serge 554
           mov edx, [edx]
555
           test edx, edx
556
           jz .end
557
.next:
558
           mov eax, [edx]
164 serge 559
           test eax, eax
188 serge 560
           jz .next_table
164 serge 561
 
188 serge 562
           push edx
563
           stdcall strncmp, eax, [proc_name], 16
564
           pop edx
565
           test eax, eax
566
           jz .ok
164 serge 567
 
188 serge 568
           add edx,8
569
           jmp .next
570
.next_table:
571
           add [imports], 4
572
           jmp .look_up
573
.ok:
574
           mov eax, [edx+4]
575
           ret
576
.end:
577
           xor eax, eax
578
           ret
579
endp
164 serge 580
 
188 serge 581
align 4
582
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
583
                      sym_count:dword, strings:dword, imports:dword
584
           locals
585
             retval dd ?
586
           endl
164 serge 587
 
188 serge 588
           mov edi, [symbols]
589
           mov [retval], 1
590
.fix:
591
           movzx ebx, [edi+CSYM.SectionNumber]
592
           test ebx, ebx
593
           jnz .internal
594
           mov eax, dword [edi+CSYM.Name]
595
           test eax, eax
596
           jnz @F
164 serge 597
 
188 serge 598
           mov edi, [edi+4]
599
           add edi, [strings]
600
@@:
601
           push edi
602
           stdcall get_proc_ex, edi,[imports]
603
           pop edi
164 serge 604
 
188 serge 605
           xor ebx, ebx
606
           test eax, eax
607
           jnz @F
164 serge 608
 
188 serge 609
           mov esi, msg_unresolved
610
           call sys_msg_board_str
611
           mov esi, edi
612
           call sys_msg_board_str
613
           mov esi, msg_CR
614
           call sys_msg_board_str
164 serge 615
 
188 serge 616
           mov [retval],0
617
@@:
618
           mov edi, [symbols]
619
           mov [edi+CSYM.Value], eax
620
           jmp .next
621
.internal:
622
           dec ebx
623
           shl ebx, 3
624
           lea ebx, [ebx+ebx*4]
625
           add ebx, [sec]
626
 
627
           mov eax, [ebx+CFS.VirtualAddress]
628
           add [edi+CSYM.Value], eax
629
.next:
630
           add edi, CSYM_SIZE
631
           mov [symbols], edi
632
           dec [sym_count]
633
           jnz .fix
634
           mov eax, [retval]
635
           ret
164 serge 636
endp
637
 
638
align 4
188 serge 639
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
164 serge 640
	   locals
188 serge 641
             n_sec     dd ?
164 serge 642
	   endl
643
 
188 serge 644
           mov eax, [coff]
645
           movzx ebx, [eax+CFH.nSections]
646
           mov [n_sec], ebx
647
.fix_sec:
648
           mov esi, [sec]
164 serge 649
	   mov edi, [esi+CFS.PtrReloc]
188 serge 650
           add edi, [coff]
164 serge 651
 
188 serge 652
           movzx ecx, [esi+CFS.NumReloc]
653
           test ecx, ecx
654
           jz .next
655
.next_reloc:
164 serge 656
	   mov ebx, [edi+CRELOC.SymIndex]
657
	   add ebx,ebx
658
	   lea ebx,[ebx+ebx*8]
188 serge 659
           add ebx, [sym]
164 serge 660
 
188 serge 661
           mov edx, [ebx+CSYM.Value]
164 serge 662
 
188 serge 663
           cmp [edi+CRELOC.Type], 6
664
           je .dir_32
164 serge 665
 
188 serge 666
           cmp [edi+CRELOC.Type], 20
667
           jne .next_reloc
668
.rel_32:
164 serge 669
	   mov eax, [edi+CRELOC.VirtualAddress]
188 serge 670
           add eax, [esi+CFS.VirtualAddress]
671
           sub edx, eax
672
           sub edx, 4
673
           jmp .fix
674
.dir_32:
675
	   mov eax, [edi+CRELOC.VirtualAddress]
676
           add eax, [esi+CFS.VirtualAddress]
677
.fix:
678
           add [eax], edx
679
           add edi, 10
680
           dec ecx
681
           jnz .next_reloc
682
.next:
206 serge 683
           add [sec], COFF_SECTION_SIZE
188 serge 684
           dec [n_sec]
685
           jnz .fix_sec
164 serge 686
.exit:
687
	   ret
688
endp
689
 
188 serge 690
align 4
346 diamond 691
proc load_driver stdcall, driver_name:dword
188 serge 692
           locals
693
             coff      dd ?
694
             sym       dd ?
695
             strings   dd ?
696
             img_size  dd ?
697
             img_base  dd ?
698
             start     dd ?
699
 
700
             exports   dd ?   ;fake exports table
701
                       dd ?
346 diamond 702
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
188 serge 703
           endl
704
 
346 diamond 705
        lea     edx, [file_name]
706
        mov     dword [edx], '/rd/'
707
        mov     dword [edx+4], '1/dr'
708
        mov     dword [edx+8], 'iver'
709
        mov     word [edx+12], 's/'
710
        mov     esi, [driver_name]
711
        lea     edi, [edx+14]
712
        mov     ecx, 16
713
@@:
714
        lodsb
715
        test    al, al
716
        jz      @f
717
        stosb
718
        loop    @b
719
@@:
720
        mov     dword [edi], '.obj'
721
        mov     byte [edi+4], 0
722
           stdcall load_file, edx
214 serge 723
 
188 serge 724
           test eax, eax
227 serge 725
           jz .exit
188 serge 726
 
727
           mov [coff], eax
728
 
729
           movzx ecx, [eax+CFH.nSections]
730
           xor ebx, ebx
731
 
732
           lea edx, [eax+20]
733
@@:
734
           add ebx, [edx+CFS.SizeOfRawData]
735
           add ebx, 15
736
           and ebx, not 15
206 serge 737
           add edx, COFF_SECTION_SIZE
188 serge 738
           dec ecx
739
           jnz @B
740
           mov [img_size], ebx
741
 
742
           stdcall kernel_alloc, ebx
743
           test eax, eax
744
           jz .fail
745
           mov [img_base], eax
746
 
747
           mov edi, eax
748
           xor eax, eax
749
           mov ecx, [img_size]
750
           add ecx, 4095
751
           and ecx, not 4095
752
           shr ecx, 2
753
           cld
754
           rep stosd
755
 
756
           mov edx, [coff]
757
           movzx ebx, [edx+CFH.nSections]
758
           mov edi, [img_base]
759
           lea eax, [edx+20]
760
@@:
761
           mov [eax+CFS.VirtualAddress], edi
762
           mov esi, [eax+CFS.PtrRawData]
763
           test esi, esi
764
           jnz .copy
765
           add edi, [eax+CFS.SizeOfRawData]
766
           jmp .next
767
.copy:
768
           add esi, edx
769
           mov ecx, [eax+CFS.SizeOfRawData]
770
           cld
771
           rep movsb
772
.next:
773
           add edi, 15
774
           and edi, not 15
206 serge 775
           add eax, COFF_SECTION_SIZE
188 serge 776
           dec ebx
777
           jnz @B
778
 
779
           mov ebx, [edx+CFH.pSymTable]
780
           add ebx, edx
781
           mov [sym], ebx
782
           mov ecx, [edx+CFH.nSymbols]
783
           add ecx,ecx
784
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
785
           add ecx, [sym]
786
           mov [strings], ecx
787
 
788
           lea ebx, [exports]
789
           mov dword [ebx], kernel_export
790
           mov dword [ebx+4], 0
791
           lea eax, [edx+20]
792
 
793
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
794
                                     [strings], ebx
795
           test eax, eax
227 serge 796
           jz .link_fail
188 serge 797
 
798
           mov ebx, [coff]
799
           add ebx, 20
800
           stdcall fix_coff_relocs, [coff], ebx, [sym]
801
 
802
           mov ebx, [coff]
227 serge 803
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
804
           test eax, eax
805
           jz .link_fail
806
 
807
           mov eax, [eax]
808
           shr eax, 16
809
           cmp eax, DRV_COMPAT
810
           jb .ver_fail
811
 
812
           cmp eax, DRV_CURRENT
813
           ja .ver_fail
814
 
815
           mov ebx, [coff]
188 serge 816
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
817
           mov [start], eax
818
 
819
           stdcall kernel_free, [coff]
820
 
821
           mov ebx, [start]
214 serge 822
           stdcall ebx, DRV_ENTRY
188 serge 823
           test eax, eax
824
           jnz .ok
825
 
826
           stdcall kernel_free, [img_base]
827
           xor eax, eax
828
           ret
829
.ok:
830
           mov ebx, [img_base]
831
           mov [eax+SRV.base], ebx
214 serge 832
           mov ecx, [start]
833
           mov [eax+SRV.entry], ecx
188 serge 834
           ret
227 serge 835
 
836
.ver_fail:
837
           mov esi, msg_CR
838
           call sys_msg_board_str
346 diamond 839
           mov esi, [driver_name]
227 serge 840
           call sys_msg_board_str
841
           mov esi, msg_CR
842
           call sys_msg_board_str
843
           mov esi, msg_version
844
           call sys_msg_board_str
845
           mov esi, msg_www
846
           call sys_msg_board_str
847
           jmp .cleanup
848
 
849
.link_fail:
850
           mov esi, msg_module
851
           call sys_msg_board_str
346 diamond 852
           mov esi, [driver_name]
227 serge 853
           call sys_msg_board_str
854
           mov esi, msg_CR
855
           call sys_msg_board_str
856
.cleanup:
857
           stdcall kernel_free,[img_base]
188 serge 858
.fail:
227 serge 859
           stdcall kernel_free, [coff]
860
.exit:
188 serge 861
           xor eax, eax
862
           ret
164 serge 863
endp
864
 
198 serge 865
align 4
866
proc load_library stdcall, file_name:dword
867
           locals
868
             coff      dd ?
869
             sym       dd ?
870
             strings   dd ?
871
             img_size  dd ?
872
             img_base  dd ?
873
             exports   dd ?
874
           endl
875
 
876
           cli
877
 
878
           stdcall load_file, [file_name]
879
           test eax, eax
880
           jz .fail
881
 
882
           mov [coff], eax
883
           movzx ecx, [eax+CFH.nSections]
884
           xor ebx, ebx
885
 
886
           lea edx, [eax+20]
887
@@:
888
           add ebx, [edx+CFS.SizeOfRawData]
889
           add ebx, 15
890
           and ebx, not 15
206 serge 891
           add edx, COFF_SECTION_SIZE
198 serge 892
           dec ecx
893
           jnz @B
894
           mov [img_size], ebx
895
 
896
           call init_heap
897
           stdcall user_alloc, [img_size]
898
 
899
           test eax, eax
900
           jz .fail
901
           mov [img_base], eax
902
 
903
           mov edx, [coff]
904
           movzx ebx, [edx+CFH.nSections]
905
           mov edi, [img_base]
906
           lea eax, [edx+20]
907
@@:
908
           mov [eax+CFS.VirtualAddress], edi
909
           mov esi, [eax+CFS.PtrRawData]
910
           test esi, esi
911
           jnz .copy
912
           add edi, [eax+CFS.SizeOfRawData]
913
           jmp .next
914
.copy:
915
           add esi, edx
916
           add edi, new_app_base
917
           mov ecx, [eax+CFS.SizeOfRawData]
918
           cld
919
           rep movsb
920
.next:
921
           add edi, 15-new_app_base
922
           and edi, not 15
206 serge 923
           add eax, COFF_SECTION_SIZE
198 serge 924
           dec ebx
925
           jnz @B
926
 
927
           mov ebx, [edx+CFH.pSymTable]
928
           add ebx, edx
929
           mov [sym], ebx
930
           mov ecx, [edx+CFH.nSymbols]
931
           add ecx,ecx
932
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
933
           add ecx, [sym]
934
           mov [strings], ecx
935
 
936
           lea eax, [edx+20]
937
 
938
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
939
                                     [strings], dword 0
940
           test eax, eax
941
           jnz @F
942
 
943
@@:
944
           mov edx, [coff]
945
           movzx ebx, [edx+CFH.nSections]
946
           mov edi, new_app_base
947
           lea eax, [edx+20]
948
@@:
949
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
206 serge 950
           add eax, COFF_SECTION_SIZE
198 serge 951
           dec ebx
952
           jnz @B
953
 
954
           add edx, 20
955
           stdcall fix_coff_relocs, [coff], edx, [sym]
956
 
957
           mov ebx, [coff]
958
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
959
           mov [exports], eax
960
 
961
           stdcall kernel_free, [coff]
962
           mov eax, [exports]
963
           ret
964
.fail:
965
           xor eax, eax
966
           ret
967
endp
968
 
214 serge 969
align 4
970
proc stop_all_services
278 serge 971
 
972
           mov edx, [srv.fd]
214 serge 973
.next:
278 serge 974
           cmp edx,  srv.fd-SRV_FD_OFFSET
975
           je .done
976
           cmp [edx+SRV.magic], ' SRV'
227 serge 977
           jne .next
278 serge 978
           cmp [edx+SRV.size], SRV_SIZE
227 serge 979
           jne .next
278 serge 980
           mov ebx, [edx+SRV.entry]
981
           mov edx, [edx+SRV.fd]
982
           push edx
214 serge 983
           stdcall ebx, dword -1
278 serge 984
           pop edx
214 serge 985
           jmp .next
278 serge 986
.done:
987
           ret
214 serge 988
endp
198 serge 989
 
281 serge 990
; param
291 serge 991
;  eax= size
992
;  ebx= pid
214 serge 993
 
281 serge 994
align 4
995
create_kernel_object:
996
 
997
           push ebx
998
           call malloc
999
           pop ebx
1000
           test eax, eax
1001
           jz .fail
1002
 
1003
           mov ecx,[CURRENT_TASK]
1004
           shl ecx,8
380 serge 1005
           add ecx, SLOT_BASE+APP_OBJ_OFFSET
281 serge 1006
 
345 serge 1007
           pushfd
1008
           cli
281 serge 1009
           mov edx, [ecx+APPOBJ.fd]
1010
           mov [eax+APPOBJ.fd], edx
1011
           mov [eax+APPOBJ.bk], ecx
1012
           mov [eax+APPOBJ.pid], ebx
1013
 
1014
           mov [ecx+APPOBJ.fd], eax
1015
           mov [edx+APPOBJ.bk], eax
345 serge 1016
           popfd
281 serge 1017
.fail:
1018
           ret
1019
 
1020
; param
1021
;  eax= object
1022
 
1023
align 4
1024
destroy_kernel_object:
1025
 
345 serge 1026
           pushfd
1027
           cli
281 serge 1028
           mov ebx, [eax+APPOBJ.fd]
1029
           mov ecx, [eax+APPOBJ.bk]
1030
           mov [ebx+APPOBJ.bk], ecx
1031
           mov [ecx+APPOBJ.fd], ebx
345 serge 1032
           popfd
281 serge 1033
 
1034
           xor edx, edx        ;clear common header
1035
           mov [eax], edx
1036
           mov [eax+4], edx
1037
           mov [eax+8], edx
1038
           mov [eax+12], edx
1039
           mov [eax+16], edx
1040
 
1041
           call free           ;release object memory
1042
           ret
1043
 
1044
 
346 diamond 1045
;szSound        db 'SOUND',0
1046
;szInfinity     db 'INFINITY',0
1047
szHwMouse      db 'ATI2D',0
164 serge 1048
 
1049
szSTART        db 'START',0
1050
szEXPORTS      db 'EXPORTS',0
1051
szIMPORTS      db 'IMPORTS',0
1052
 
188 serge 1053
msg_unresolved db 'unresolved ',0
1054
msg_module     db 'in module ',0
227 serge 1055
msg_version    db 'incompatible driver version',13,10,0
1056
msg_www        db 'please visit www.kolibrios.org',13,10,0
188 serge 1057
msg_CR         db  13,10,0
1058
 
214 serge 1059
align 4
227 serge 1060
create_cursor    dd 0
214 serge 1061
set_hw_cursor    dd 0
221 serge 1062
hw_restore       dd 0