Subversion Repositories Kolibri OS

Rev

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

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