Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
164 serge 1
;
2
;   This file is part of the Infinity sound AC97 driver.
3
;   (C) copyright Serge 2006
4
;   email: infinity_sound@mail.ru
5
;
6
;   This program is free software; you can redistribute it and/or modify
7
;   it under the terms of the GNU General Public License as published by
8
;   the Free Software Foundation; either version 2 of the License, or
9
;   (at your option) any later version.
10
;
11
;   This program is distributed in the hope that it will be useful,
12
;   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
;   GNU General Public License for more details.
15
 
16
align 4
17
proc attach_int_handler stdcall, irq:dword, handler:dword
18
 
19
	 mov ebx, [irq]        ;irq num
20
	 test ebx, ebx
21
	 jz .err
22
	 mov eax, [handler]
23
	 test eax, eax
24
	 jz .err
25
	 mov [irq_tab+ebx*4], eax
26
         stdcall enable_irq, [irq]
27
	 ret
28
.err:
29
	 xor eax, eax
30
	 ret
31
endp
32
 
33
align 4
34
proc  detach_int_handler
35
 
36
	   ret
37
endp
38
 
39
align 4
40
proc enable_irq stdcall, irq_line:dword
41
           mov ebx, [irq_line]
42
           mov edx, 0x21
43
           cmp ebx, 8
44
           jb @F
45
           mov edx, 0xA1
46
           sub ebx,8
47
@@:
48
           in al,dx
49
           btr eax, ebx
50
           out dx, al
51
           ret
52
endp
53
 
54
align 16
55
;; proc irq_serv
56
 
57
irq_serv:
58
 
59
.irq_1:
60
	   push eax
61
	   mov eax, 1
62
	   jmp .main
63
align 4
64
.irq_2:
65
	   push eax
66
	   mov eax, 2
67
	   jmp .main
68
align 4
69
.irq_3:
70
	   push eax
71
	   mov eax, 3
72
	   jmp .main
73
align 4
74
.irq_4:
75
	   push eax
76
	   mov eax, 4
77
	   jmp .main
78
align 4
79
.irq_5:
80
	   push eax
81
	   mov eax, 5
82
	   jmp .main
83
align 4
84
.irq_6:
85
	   push eax
86
	   mov eax, 6
87
	   jmp .main
88
align 4
89
.irq_7:
90
	   push eax
91
	   mov eax, 7
92
	   jmp .main
93
align 4
94
.irq_8:
95
	   push eax
96
	   mov eax, 8
97
	   jmp .main
98
align 4
99
.irq_9:
100
	   push eax
101
	   mov eax, 9
102
	   jmp .main
103
align 4
104
.irq_10:
105
	   push eax
106
	   mov eax, 10
107
	   jmp .main
108
align 4
109
.irq_11:
110
	   push eax
111
	   mov eax, 11
112
	   jmp .main
113
align 4
114
.irq_12:
115
	   push eax
116
	   mov eax, 12
117
	   jmp .main
118
align 4
119
.irq_13:
120
	   push eax
121
	   mov eax, 13
122
	   jmp .main
123
align 4
124
.irq_14:
125
	   push eax
126
	   mov eax, 14
127
	   jmp .main
128
align 4
129
.irq_15:
130
	   push eax
131
	   mov eax, 15
132
	   jmp .main
133
 
134
align 16
135
.main:
136
	   save_ring3_context
137
	   mov	 bx, os_data
138
	   mov	 ds, bx
139
	   mov	 es, bx
140
 
141
	   mov ebx, [irq_tab+eax*4]
142
	   test ebx, ebx
143
	   jz .exit
144
 
145
           call ebx
146
 
147
.exit:
148
	   restore_ring3_context
149
 
150
           cmp eax, 8
151
	   mov al, 0x20
152
           jb @f
153
	   out 0xa0, al
154
@@:
155
           out 0x20, al
156
 
157
           pop eax
158
	   iret
159
 
160
align 4
161
proc get_notify stdcall, p_ev:dword
162
 
163
.wait:
164
           mov ebx,[CURRENT_TASK]
165
           shl ebx,8
166
           test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
167
	   jz @f
168
           and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
169
	   mov edi, [p_ev]
170
	   mov dword [edi], EV_INTR
171
           mov eax, [ebx+PROC_BASE+APPDATA.event]
172
	   mov dword [edi+4], eax
173
	   ret
174
@@:
175
	   call change_task
176
	   jmp .wait
177
endp
178
 
179
align 4
180
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
181
	   xor eax, eax
182
	   xor ebx, ebx
183
	   mov ah, byte [bus]
184
           mov al, 6
185
	   mov bh, byte [devfn]
186
	   mov bl, byte [reg]
187
	   call pci_read_reg
188
	   ret
189
endp
190
 
191
align 4
192
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
193
	   xor eax, eax
194
	   xor ebx, ebx
195
	   mov ah, byte [bus]
196
           mov al, 4
197
	   mov bh, byte [devfn]
198
	   mov bl, byte [reg]
199
	   call pci_read_reg
200
	   ret
201
endp
202
 
203
align 4
204
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
205
	   xor eax, eax
206
	   xor ebx, ebx
207
	   mov ah, byte [bus]
208
           mov al, 8
209
	   mov bh, byte [devfn]
210
	   mov bl, byte [reg]
211
           mov ecx, [val]
212
           call pci_write_reg
213
	   ret
214
endp
215
 
216
handle     equ  IOCTL.handle
217
io_code    equ  IOCTL.io_code
218
input      equ  IOCTL.input
219
inp_size   equ  IOCTL.inp_size
220
output     equ  IOCTL.output
221
out_size   equ  IOCTL.out_size
222
 
223
 
224
align 4
225
proc srv_handler stdcall, ioctl:dword
226
           mov esi, [ioctl]
227
           test esi, esi
228
           jz .err
229
 
230
           mov edi, [esi+handle]
231
           cmp [edi+SRV.magic], ' SRV'
232
	   jne .fail
233
 
234
           cmp [edi+SRV.size], SRV_SIZE
235
	   jne .fail
236
 
237
           stdcall [edi+SRV.srv_proc], esi
238
           ret
239
.fail:
240
           xor eax, eax
241
           not eax
242
           mov [esi+output], eax
243
           mov [esi+out_size], 4
244
           ret
245
.err:
246
           xor eax, eax
247
           not eax
248
           ret
249
endp
250
 
251
align 4
252
proc srv_handlerEx stdcall, ioctl:dword
253
           mov esi, [ioctl]
254
           test esi, esi
255
           jz .err
256
           add esi, new_app_base
257
 
258
           mov edi, [esi+handle]
259
           cmp [edi+SRV.magic], ' SRV'
260
	   jne .fail
261
 
262
           cmp [edi+SRV.size], SRV_SIZE
263
	   jne .fail
264
 
265
           add [esi+input], new_app_base
266
           add [esi+output], new_app_base
267
 
268
           stdcall [edi+SRV.srv_proc], esi
269
           ret
270
.fail:
271
           xor eax, eax
272
           not eax
273
           mov [esi+output], eax
274
           mov [esi+out_size], 4
275
           ret
276
.err:
277
           xor eax, eax
278
           not eax
279
           ret
280
endp
281
 
282
restore  handle
283
restore  io_code
284
restore  input
285
restore  inp_size
286
restore  output
287
restore  out_size
288
 
289
align 4
290
proc get_service stdcall, sz_name:dword
291
	   locals
292
	     srv_ptr  dd ?
293
	     counter  dd ?
188 serge 294
           endl
164 serge 295
 
188 serge 296
           mov eax, [sz_name]
297
           test eax, eax
298
           jnz @F
299
           ret
164 serge 300
@@:
188 serge 301
           mov [srv_ptr], srv_tab
302
           mov [counter], 16
303
@@:
304
           stdcall strncmp, [srv_ptr], [sz_name], 16
305
           test eax, eax
306
           je .ok
164 serge 307
 
188 serge 308
           add [srv_ptr], SRV_SIZE
309
           dec [counter]
310
           jnz @B
164 serge 311
.not_load:
312
           stdcall find_service, [sz_name]
313
           test eax, eax
188 serge 314
           jnz @F
315
           ret
164 serge 316
@@:
188 serge 317
           stdcall load_driver, eax
318
           ret
164 serge 319
.ok:
188 serge 320
           mov eax, [srv_ptr]
321
           ret
164 serge 322
endp
323
 
324
align 4
325
proc find_service stdcall ,sz_name:dword
326
 
327
	   mov eax, [sz_name]
328
	   test eax, eax
329
	   jz .fail
330
 
331
           mov esi, services
332
@@:
333
           mov eax, [esi]
334
           test eax, eax
335
           jz .fail
336
           push esi
337
           stdcall strncmp, eax, [sz_name], 16
338
           pop esi
339
           test eax, eax
340
           je .ok
341
 
342
           add esi, 8
343
           jmp @B
344
.ok:
345
           mov eax, [esi+4]
346
           ret
347
.fail:
348
           xor eax, eax
349
           ret
350
endp
351
 
352
align 4
353
proc reg_service stdcall, sz_name:dword, handler:dword
354
	   locals
355
	     srv dd ?
356
	   endl
357
 
358
	   mov eax, [sz_name]
359
	   test eax, eax
360
	   jz .fail
361
 
362
	   mov ebx, [handler]
363
	   test ebx, ebx
364
	   jz .fail
365
 
366
	   call alloc_service
367
	   test eax, eax
368
	   jz .fail
369
 
370
	   mov [srv], eax
371
	   mov edi, eax
372
	   mov esi, [sz_name]
373
	   mov ecx, 16
374
	   rep movsb
375
 
376
	   mov edi, eax
377
	   mov [edi+SRV.magic], ' SRV'
378
	   mov [edi+SRV.size], SRV_SIZE
379
	   mov ebx, [handler]
380
	   mov [edi+SRV.srv_proc], ebx
381
           mov eax, [srv]
382
	   ret
383
.fail:
384
	   xor eax, eax
385
	   ret
386
endp
387
 
388
align 4
389
proc get_proc stdcall, exp:dword, sz_name:dword
390
 
391
           mov edx, [exp]
392
.next:
393
           mov eax, [edx]
394
           test eax, eax
395
           jz .end
396
 
397
           push edx
398
           stdcall strncmp, eax, [sz_name], 16
399
           pop edx
400
           test eax, eax
401
           jz .ok
402
 
403
           add edx,8
404
           jmp .next
405
.ok:
406
           mov eax, [edx+4]
407
.end:
408
           ret
409
endp
410
 
411
align 4
412
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
413
 
414
@@:
415
	   stdcall strncmp, [pSym], [sz_sym], 8
416
	   test eax,eax
417
	   jz .ok
418
	   add [pSym], 18
419
	   dec [count]
420
	   jnz @b
421
	   xor eax, eax
422
	   ret
423
.ok:
424
	   mov ebx, [pSym]
425
	   mov eax, [ebx+8]
426
	   ret
427
endp
428
 
429
align 4
188 serge 430
proc get_curr_task
431
           mov eax,[CURRENT_TASK]
432
           shl eax, 8
433
           ret
434
endp
164 serge 435
 
188 serge 436
align 4
437
proc get_fileinfo stdcall, file_name:dword, info:dword
438
           locals
439
             cmd     dd ?
440
             offset  dd ?
441
                     dd ?
442
             count   dd ?
443
             buff    dd ?
444
                     db ?
445
             name    dd ?
446
           endl
164 serge 447
 
188 serge 448
           xor eax, eax
449
           mov ebx, [file_name]
450
           sub ebx, new_app_base
451
           mov ecx, [info]
452
           sub ecx, new_app_base
164 serge 453
 
188 serge 454
           mov [cmd], 5
455
           mov [offset], eax
456
           mov [offset+4], eax
457
           mov [count], eax
458
           mov [buff], ecx
459
           mov byte [buff+4], al
460
           mov [name], ebx
164 serge 461
 
188 serge 462
           mov eax, 70
463
           lea ebx, [cmd]
464
           sub ebx, new_app_base
465
           int 0x40
466
           ret
467
endp
164 serge 468
 
188 serge 469
align 4
470
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
471
                                     bytes:dword
472
           locals
473
             cmd     dd ?
474
             offset  dd ?
475
                     dd ?
476
             count   dd ?
477
             buff    dd ?
478
                     db ?
479
             name    dd ?
480
           endl
164 serge 481
 
188 serge 482
           xor eax, eax
483
           mov ebx, [file_name]
484
           mov ecx, [off]
485
           mov edx, [bytes]
486
           mov esi, [buffer]
487
           sub ebx, new_app_base
488
           sub esi, new_app_base
164 serge 489
 
188 serge 490
           mov [cmd], eax
491
           mov [offset], ecx
492
           mov [offset+4], eax
493
           mov [count], edx
494
           mov [buff], esi
495
           mov byte [buff+4], al
496
           mov [name], ebx
497
 
498
           mov eax, 70
499
           lea ebx, [cmd]
500
           sub ebx, new_app_base
501
           int 0x40
502
           ret
503
endp
504
 
505
align 4
506
proc load_file stdcall, file_name:dword
507
           locals
508
             attr       dd ?
509
             flags      dd ?
510
             cr_time    dd ?
511
             cr_date    dd ?
512
             acc_time   dd ?
513
             acc_date   dd ?
514
             mod_time   dd ?
515
             mod_date   dd ?
516
             file_size  dd ?
517
 
518
             file       dd ?
519
           endl
520
 
521
           lea eax, [attr]
522
           stdcall get_fileinfo, [file_name], eax
164 serge 523
           test eax, eax
188 serge 524
           jnz .fail
164 serge 525
 
188 serge 526
           stdcall kernel_alloc, [file_size]
527
           mov [file], eax
164 serge 528
 
188 serge 529
           stdcall read_file, [file_name], eax, dword 0, [file_size]
530
           cmp ebx, [file_size]
531
           jne .cleanup
532
           mov eax, [file]
533
           ret
534
.cleanup:
535
           stdcall kernel_free, [file]
536
.fail:
537
           xor eax, eax
538
           ret
539
endp
164 serge 540
 
188 serge 541
align 4
542
proc get_proc_ex stdcall, proc_name:dword, imports:dword
543
 
544
.look_up:
545
           mov edx, [imports]
546
           mov edx, [edx]
547
           test edx, edx
548
           jz .end
549
.next:
550
           mov eax, [edx]
164 serge 551
           test eax, eax
188 serge 552
           jz .next_table
164 serge 553
 
188 serge 554
           push edx
555
           stdcall strncmp, eax, [proc_name], 16
556
           pop edx
557
           test eax, eax
558
           jz .ok
164 serge 559
 
188 serge 560
           add edx,8
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
164 serge 572
 
188 serge 573
align 4
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
164 serge 579
 
188 serge 580
           mov edi, [symbols]
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
164 serge 589
 
188 serge 590
           mov edi, [edi+4]
591
           add edi, [strings]
592
@@:
593
           push edi
594
           stdcall get_proc_ex, edi,[imports]
595
           pop edi
164 serge 596
 
188 serge 597
           xor ebx, ebx
598
           test eax, eax
599
           jnz @F
164 serge 600
 
188 serge 601
           mov esi, msg_unresolved
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
164 serge 607
 
188 serge 608
           mov [retval],0
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
           mov eax, [ebx+CFS.VirtualAddress]
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
164 serge 628
endp
629
 
630
align 4
188 serge 631
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
164 serge 632
	   locals
188 serge 633
             n_sec     dd ?
164 serge 634
	   endl
635
 
188 serge 636
           mov eax, [coff]
637
           movzx ebx, [eax+CFH.nSections]
638
           mov [n_sec], ebx
639
.fix_sec:
640
           mov esi, [sec]
164 serge 641
	   mov edi, [esi+CFS.PtrReloc]
188 serge 642
           add edi, [coff]
164 serge 643
 
188 serge 644
           movzx ecx, [esi+CFS.NumReloc]
645
           test ecx, ecx
646
           jz .next
647
.next_reloc:
164 serge 648
	   mov ebx, [edi+CRELOC.SymIndex]
649
	   add ebx,ebx
650
	   lea ebx,[ebx+ebx*8]
188 serge 651
           add ebx, [sym]
164 serge 652
 
188 serge 653
           mov edx, [ebx+CSYM.Value]
164 serge 654
 
188 serge 655
           cmp [edi+CRELOC.Type], 6
656
           je .dir_32
164 serge 657
 
188 serge 658
           cmp [edi+CRELOC.Type], 20
659
           jne .next_reloc
660
.rel_32:
164 serge 661
	   mov eax, [edi+CRELOC.VirtualAddress]
188 serge 662
           add eax, [esi+CFS.VirtualAddress]
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], 40
676
           dec [n_sec]
677
           jnz .fix_sec
164 serge 678
.exit:
679
	   ret
680
endp
681
 
188 serge 682
align 4
683
proc load_driver stdcall, file_name:dword
684
           locals
685
             coff      dd ?
686
             sym       dd ?
687
             strings   dd ?
688
             img_size  dd ?
689
             img_base  dd ?
690
             start     dd ?
691
 
692
             exports   dd ?   ;fake exports table
693
                       dd ?
694
           endl
695
 
696
           stdcall load_file, [file_name]
697
           test eax, eax
698
           jz .fail
699
 
700
           mov [coff], eax
701
 
702
           movzx ecx, [eax+CFH.nSections]
703
           xor ebx, ebx
704
 
705
           lea edx, [eax+20]
706
@@:
707
           add ebx, [edx+CFS.SizeOfRawData]
708
           add ebx, 15
709
           and ebx, not 15
710
           add edx, 18
711
           dec ecx
712
           jnz @B
713
           mov [img_size], ebx
714
 
715
           stdcall kernel_alloc, ebx
716
           test eax, eax
717
           jz .fail
718
           mov [img_base], eax
719
 
720
           mov edi, eax
721
           xor eax, eax
722
           mov ecx, [img_size]
723
           add ecx, 4095
724
           and ecx, not 4095
725
           shr ecx, 2
726
           cld
727
           rep stosd
728
 
729
           mov edx, [coff]
730
           movzx ebx, [edx+CFH.nSections]
731
           mov edi, [img_base]
732
           lea eax, [edx+20]
733
@@:
734
           mov [eax+CFS.VirtualAddress], edi
735
           mov esi, [eax+CFS.PtrRawData]
736
           test esi, esi
737
           jnz .copy
738
           add edi, [eax+CFS.SizeOfRawData]
739
           jmp .next
740
.copy:
741
           add esi, edx
742
           mov ecx, [eax+CFS.SizeOfRawData]
743
           cld
744
           rep movsb
745
.next:
746
           add edi, 15
747
           and edi, not 15
748
           add eax, 40
749
           dec ebx
750
           jnz @B
751
 
752
           mov ebx, [edx+CFH.pSymTable]
753
           add ebx, edx
754
           mov [sym], ebx
755
           mov ecx, [edx+CFH.nSymbols]
756
           add ecx,ecx
757
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
758
           add ecx, [sym]
759
           mov [strings], ecx
760
 
761
           lea ebx, [exports]
762
           mov dword [ebx], kernel_export
763
           mov dword [ebx+4], 0
764
           lea eax, [edx+20]
765
 
766
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
767
                                     [strings], ebx
768
           test eax, eax
769
           jnz @F
770
 
771
           mov esi, msg_module
772
           call sys_msg_board_str
773
           mov esi, [file_name]
774
           call sys_msg_board_str
775
           mov esi, msg_CR
776
           call sys_msg_board_str
777
 
778
           stdcall kernel_free,[coff]
779
           xor eax, eax
164 serge 780
           ret
188 serge 781
@@:
782
           mov ebx, [coff]
783
           add ebx, 20
784
           stdcall fix_coff_relocs, [coff], ebx, [sym]
785
 
786
           mov ebx, [coff]
787
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
788
           mov [start], eax
789
 
790
           stdcall kernel_free, [coff]
791
 
792
           mov ebx, [start]
793
           call ebx
794
           test eax, eax
795
           jnz .ok
796
 
797
           stdcall kernel_free, [img_base]
798
           xor eax, eax
799
           ret
800
.ok:
801
           mov ebx, [img_base]
802
           mov [eax+SRV.base], ebx
803
           ret
804
.fail:
805
           xor eax, eax
806
           ret
164 serge 807
endp
808
 
188 serge 809
drv_sound      db '/rd/1/unisound.obj', 0
810
drv_infinity   db '/rd/1/infinity.obj', 0
164 serge 811
 
812
szSound        db 'SOUND',0
813
szInfinity     db 'INFINITY',0
814
 
815
szSTART        db 'START',0
816
szEXPORTS      db 'EXPORTS',0
817
szIMPORTS      db 'IMPORTS',0
818
 
188 serge 819
msg_unresolved db 'unresolved ',0
820
msg_module     db 'in module ',0
821
msg_CR         db  13,10,0
822
 
164 serge 823
align 16
824
services:
825
           dd szSound,    drv_sound
826
           dd szInfinity, drv_infinity
827
           dd 0