Subversion Repositories Kolibri OS

Rev

Rev 886 | Rev 889 | 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: 887 $
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
887 serge 561
;  You mast call mem_free() to delete each file
363 serge 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
887 serge 625
           mov ecx, 4096          ;from file end
886 serge 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:
887 serge 639
           mov ecx, [file]
640
           call @mem_free@4
188 serge 641
.fail:
886 serge 642
           xor eax, eax
643
           xor ebx, ebx
644
           pop edi
645
           pop esi
646
           ret
188 serge 647
endp
164 serge 648
 
188 serge 649
align 4
650
proc get_proc_ex stdcall, proc_name:dword, imports:dword
651
 
652
.look_up:
886 serge 653
           mov edx, [imports]
654
           test edx, edx
655
           jz .end
656
           mov edx, [edx]
657
           test edx, edx
658
           jz .end
188 serge 659
.next:
886 serge 660
           mov eax, [edx]
661
           test eax, eax
662
           jz .next_table
164 serge 663
 
886 serge 664
           push edx
665
           stdcall strncmp, eax, [proc_name], 16
666
           pop edx
667
           test eax, eax
668
           jz .ok
164 serge 669
 
886 serge 670
           add edx,8
671
           jmp .next
188 serge 672
.next_table:
886 serge 673
           add [imports], 4
674
           jmp .look_up
188 serge 675
.ok:
886 serge 676
           mov eax, [edx+4]
677
           ret
188 serge 678
.end:
886 serge 679
           xor eax, eax
680
           ret
188 serge 681
endp
164 serge 682
 
188 serge 683
align 4
684
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
672 hidnplayr 685
		      sym_count:dword, strings:dword, imports:dword
886 serge 686
           locals
687
             retval dd ?
688
           endl
164 serge 689
 
886 serge 690
           mov edi, [symbols]
691
           mov [retval], 1
188 serge 692
.fix:
886 serge 693
           movzx ebx, [edi+CSYM.SectionNumber]
694
           test ebx, ebx
695
           jnz .internal
696
           mov eax, dword [edi+CSYM.Name]
697
           test eax, eax
698
           jnz @F
164 serge 699
 
886 serge 700
           mov edi, [edi+4]
701
           add edi, [strings]
188 serge 702
@@:
886 serge 703
           push edi
704
           stdcall get_proc_ex, edi,[imports]
705
           pop edi
164 serge 706
 
886 serge 707
           xor ebx, ebx
708
           test eax, eax
709
           jnz @F
164 serge 710
 
886 serge 711
           mov esi, msg_unresolved
712
           call sys_msg_board_str
713
           mov esi, edi
714
           call sys_msg_board_str
715
           mov esi, msg_CR
716
           call sys_msg_board_str
164 serge 717
 
886 serge 718
           mov [retval],0
188 serge 719
@@:
886 serge 720
           mov edi, [symbols]
721
           mov [edi+CSYM.Value], eax
722
           jmp .next
188 serge 723
.internal:
886 serge 724
           cmp bx, -1
725
           je .next
726
           cmp bx, -2
727
           je .next
541 serge 728
 
886 serge 729
           dec ebx
730
           shl ebx, 3
731
           lea ebx, [ebx+ebx*4]
732
           add ebx, [sec]
188 serge 733
 
886 serge 734
           mov eax, [ebx+CFS.VirtualAddress]
735
           add [edi+CSYM.Value], eax
188 serge 736
.next:
886 serge 737
           add edi, CSYM_SIZE
738
           mov [symbols], edi
739
           dec [sym_count]
740
           jnz .fix
741
           mov eax, [retval]
742
           ret
164 serge 743
endp
744
 
745
align 4
188 serge 746
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
886 serge 747
           locals
748
             n_sec     dd ?
749
           endl
164 serge 750
 
886 serge 751
           mov eax, [coff]
752
           movzx ebx, [eax+CFH.nSections]
753
           mov [n_sec], ebx
188 serge 754
.fix_sec:
886 serge 755
           mov esi, [sec]
756
           mov edi, [esi+CFS.PtrReloc]
757
           add edi, [coff]
164 serge 758
 
886 serge 759
           movzx ecx, [esi+CFS.NumReloc]
760
           test ecx, ecx
761
           jz .next
188 serge 762
.next_reloc:
886 serge 763
           mov ebx, [edi+CRELOC.SymIndex]
764
           add ebx,ebx
765
           lea ebx,[ebx+ebx*8]
766
           add ebx, [sym]
164 serge 767
 
886 serge 768
           mov edx, [ebx+CSYM.Value]
164 serge 769
 
886 serge 770
           cmp [edi+CRELOC.Type], 6
771
           je .dir_32
164 serge 772
 
886 serge 773
           cmp [edi+CRELOC.Type], 20
774
           jne .next_reloc
188 serge 775
.rel_32:
886 serge 776
           mov eax, [edi+CRELOC.VirtualAddress]
777
           add eax, [esi+CFS.VirtualAddress]
778
           sub edx, eax
779
           sub edx, 4
780
           jmp .fix
188 serge 781
.dir_32:
886 serge 782
           mov eax, [edi+CRELOC.VirtualAddress]
783
           add eax, [esi+CFS.VirtualAddress]
188 serge 784
.fix:
886 serge 785
           add [eax], edx
786
           add edi, 10
787
           dec ecx
788
           jnz .next_reloc
188 serge 789
.next:
886 serge 790
           add [sec], COFF_SECTION_SIZE
791
           dec [n_sec]
792
           jnz .fix_sec
164 serge 793
.exit:
886 serge 794
           ret
164 serge 795
endp
796
 
188 serge 797
align 4
346 diamond 798
proc load_driver stdcall, driver_name:dword
886 serge 799
           locals
800
             coff      dd ?
801
             sym       dd ?
802
             strings   dd ?
803
             img_size  dd ?
804
             img_base  dd ?
805
             start     dd ?
188 serge 806
 
886 serge 807
             exports   dd ?   ;fake exports table
808
                   dd ?
809
             file_name rb 13+16+4+1  ; '/sys/drivers/.obj'
810
           endl
188 serge 811
 
886 serge 812
           lea     edx, [file_name]
813
           mov     dword [edx], '/sys'
814
           mov     dword [edx+4], '/dri'
815
           mov     dword [edx+8], 'vers'
816
           mov     byte [edx+12], '/'
817
           mov     esi, [driver_name]
818
           lea     edi, [edx+13]
819
           mov     ecx, 16
346 diamond 820
@@:
886 serge 821
           lodsb
822
           test    al, al
823
           jz      @f
824
           stosb
825
           loop    @b
346 diamond 826
@@:
886 serge 827
           mov     dword [edi], '.obj'
828
           mov     byte [edi+4], 0
829
           stdcall load_file, edx
887 serge 830
           mov [coff], eax
886 serge 831
           test eax, eax
832
           jz .exit
188 serge 833
 
864 serge 834
           movzx ebx, [eax+CFH.nSections]
886 serge 835
           lea edx, [eax+20]
864 serge 836
           xor ecx, ecx
188 serge 837
@@:
864 serge 838
           add ecx, [edx+CFS.SizeOfRawData]
839
           add ecx, 15
840
           and ecx, not 15
886 serge 841
           add edx, COFF_SECTION_SIZE
864 serge 842
           dec ebx
886 serge 843
           jnz @B
188 serge 844
 
864 serge 845
           mov [img_size], ecx
846
           mov edx, PG_SW
847
           call @mem_alloc@8
886 serge 848
           test eax, eax
887 serge 849
           mov [img_base], eax
886 serge 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
 
887 serge 926
           mov ecx, [coff]
927
           call @mem_free@4
188 serge 928
 
886 serge 929
           mov ebx, [start]
930
           stdcall ebx, DRV_ENTRY
931
           test eax, eax
932
           jnz .ok
188 serge 933
 
887 serge 934
           mov ecx, [img_base]
935
           call @mem_free@4
886 serge 936
           xor eax, eax
937
           ret
188 serge 938
.ok:
886 serge 939
           mov ebx, [img_base]
940
           mov [eax+SRV.base], ebx
941
           mov ecx, [start]
942
           mov [eax+SRV.entry], ecx
943
           ret
227 serge 944
 
945
.ver_fail:
886 serge 946
           mov esi, msg_CR
947
           call sys_msg_board_str
948
           mov esi, [driver_name]
949
           call sys_msg_board_str
950
           mov esi, msg_CR
951
           call sys_msg_board_str
952
           mov esi, msg_version
953
           call sys_msg_board_str
954
           mov esi, msg_www
955
           call sys_msg_board_str
956
           jmp .cleanup
227 serge 957
 
958
.link_fail:
886 serge 959
           mov esi, msg_module
960
           call sys_msg_board_str
961
           mov esi, [driver_name]
962
           call sys_msg_board_str
963
           mov esi, msg_CR
964
           call sys_msg_board_str
227 serge 965
.cleanup:
887 serge 966
           mov ecx, [img_base]
967
           call @mem_free@4
188 serge 968
.fail:
887 serge 969
           mov ecx, [coff]
970
           call @mem_free@4
227 serge 971
.exit:
886 serge 972
           xor eax, eax
973
           ret
164 serge 974
endp
975
 
198 serge 976
align 4
977
proc load_library stdcall, file_name:dword
886 serge 978
           locals
979
             coff      dd ?
980
             sym       dd ?
981
             strings   dd ?
982
             img_size  dd ?
983
             img_base  dd ?
984
             exports   dd ?
985
           endl
198 serge 986
 
886 serge 987
           cli
198 serge 988
 
886 serge 989
           stdcall load_file, [file_name]
990
           test eax, eax
991
           jz .fail
198 serge 992
 
886 serge 993
           mov [coff], eax
994
           movzx ecx, [eax+CFH.nSections]
995
           xor ebx, ebx
198 serge 996
 
886 serge 997
           lea edx, [eax+20]
198 serge 998
@@:
886 serge 999
           add ebx, [edx+CFS.SizeOfRawData]
1000
           add ebx, 15
1001
           and ebx, not 15
1002
           add edx, COFF_SECTION_SIZE
1003
           dec ecx
1004
           jnz @B
1005
           mov [img_size], ebx
198 serge 1006
 
886 serge 1007
           call init_heap
1008
           stdcall user_alloc, [img_size]
198 serge 1009
 
886 serge 1010
           test eax, eax
1011
           jz .fail
1012
           mov [img_base], eax
198 serge 1013
 
886 serge 1014
           mov edx, [coff]
1015
           movzx ebx, [edx+CFH.nSections]
1016
           mov edi, [img_base]
1017
           lea eax, [edx+20]
198 serge 1018
@@:
886 serge 1019
           mov [eax+CFS.VirtualAddress], edi
1020
           mov esi, [eax+CFS.PtrRawData]
1021
           test esi, esi
1022
           jnz .copy
1023
           add edi, [eax+CFS.SizeOfRawData]
1024
           jmp .next
198 serge 1025
.copy:
886 serge 1026
           add esi, edx
1027
           mov ecx, [eax+CFS.SizeOfRawData]
1028
           cld
1029
           rep movsb
198 serge 1030
.next:
886 serge 1031
           add edi, 15 ;-new_app_base
1032
           and edi, -16
1033
           add eax, COFF_SECTION_SIZE
1034
           dec ebx
1035
           jnz @B
198 serge 1036
 
886 serge 1037
           mov ebx, [edx+CFH.pSymTable]
1038
           add ebx, edx
1039
           mov [sym], ebx
1040
           mov ecx, [edx+CFH.nSymbols]
1041
           add ecx,ecx
1042
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
1043
           add ecx, [sym]
1044
           mov [strings], ecx
198 serge 1045
 
886 serge 1046
           lea eax, [edx+20]
198 serge 1047
 
886 serge 1048
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
1049
                         [strings], dword 0
1050
           test eax, eax
1051
           jnz @F
198 serge 1052
 
1053
@@:
886 serge 1054
           mov edx, [coff]
198 serge 1055
 
840 serge 1056
;           movzx ebx, [edx+CFH.nSections]
1057
;           xor edi, edi
1058
;           lea eax, [edx+20]
1059
;@@:
1060
;           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
1061
;           add eax, COFF_SECTION_SIZE
1062
;           dec ebx
1063
;           jnz @B
1064
 
886 serge 1065
           add edx, 20
1066
           stdcall fix_coff_relocs, [coff], edx, [sym]
198 serge 1067
 
886 serge 1068
           mov ebx, [coff]
1069
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
1070
           mov [exports], eax
198 serge 1071
 
887 serge 1072
           mov ecx, [coff]
1073
           call @mem_free@4
1074
 
886 serge 1075
           mov eax, [exports]
1076
           ret
198 serge 1077
.fail:
886 serge 1078
           xor eax, eax
1079
           ret
198 serge 1080
endp
1081
 
214 serge 1082
align 4
1083
proc stop_all_services
278 serge 1084
 
886 serge 1085
           mov edx, [srv.fd]
214 serge 1086
.next:
886 serge 1087
           cmp edx,  srv.fd-SRV_FD_OFFSET
1088
           je .done
1089
           cmp [edx+SRV.magic], ' SRV'
1090
           jne .next
1091
           cmp [edx+SRV.size], SRV_SIZE
1092
           jne .next
732 serge 1093
 
886 serge 1094
           mov ebx, [edx+SRV.entry]
1095
           mov edx, [edx+SRV.fd]
1096
           test ebx, ebx
1097
           jz .next
732 serge 1098
 
886 serge 1099
           push edx
1100
           stdcall ebx, dword -1
1101
           pop edx
1102
           jmp .next
278 serge 1103
.done:
886 serge 1104
           ret
214 serge 1105
endp
198 serge 1106
 
281 serge 1107
; param
291 serge 1108
;  eax= size
1109
;  ebx= pid
214 serge 1110
 
281 serge 1111
align 4
1112
create_kernel_object:
1113
 
886 serge 1114
           push ebx
1115
           call malloc
1116
           pop ebx
1117
           test eax, eax
1118
           jz .fail
281 serge 1119
 
886 serge 1120
           mov ecx,[current_slot]
1121
           add ecx, APP_OBJ_OFFSET
281 serge 1122
 
886 serge 1123
           pushfd
1124
           cli
1125
           mov edx, [ecx+APPOBJ.fd]
1126
           mov [eax+APPOBJ.fd], edx
1127
           mov [eax+APPOBJ.bk], ecx
1128
           mov [eax+APPOBJ.pid], ebx
281 serge 1129
 
886 serge 1130
           mov [ecx+APPOBJ.fd], eax
1131
           mov [edx+APPOBJ.bk], eax
1132
           popfd
281 serge 1133
.fail:
886 serge 1134
           ret
281 serge 1135
 
1136
; param
1137
;  eax= object
1138
 
1139
align 4
1140
destroy_kernel_object:
1141
 
886 serge 1142
           pushfd
1143
           cli
1144
           mov ebx, [eax+APPOBJ.fd]
1145
           mov ecx, [eax+APPOBJ.bk]
1146
           mov [ebx+APPOBJ.bk], ecx
1147
           mov [ecx+APPOBJ.fd], ebx
1148
           popfd
281 serge 1149
 
886 serge 1150
           xor edx, edx        ;clear common header
1151
           mov [eax], edx
1152
           mov [eax+4], edx
1153
           mov [eax+8], edx
1154
           mov [eax+12], edx
1155
           mov [eax+16], edx
281 serge 1156
 
886 serge 1157
           call free           ;release object memory
1158
           ret
281 serge 1159
 
1160
 
164 serge 1161
 
465 serge 1162
if 0
164 serge 1163
 
465 serge 1164
irq:
188 serge 1165
 
465 serge 1166
.irq0:
672 hidnplayr 1167
	   pusfd
1168
	   pushad
1169
	   push IRQ_0
1170
	   jmp .master
465 serge 1171
.irq_1:
672 hidnplayr 1172
	   pusfd
1173
	   pushad
1174
	   push IRQ_1
1175
	   jmp .master
465 serge 1176
 
1177
.master:
672 hidnplayr 1178
	   mov ax, app_data
1179
	   mov ds, eax
1180
	   mov es, eax
1181
	   mov ebx, [esp+4]  ;IRQ_xx
1182
	   mov eax, [irq_handlers+ebx+4]
1183
	   call intr_handler
1184
	   mov ecx, [esp+4]
1185
	   cmp [irq_actids+ecx*4], 0
1186
	   je @F
1187
	   in al, 0x21
1188
	   bts eax, ecx
1189
	   out 0x21, al
1190
	   mov al, 0x20
1191
	   out 0x20, al
1192
	   jmp .restart
465 serge 1193
 
1194
.slave:
672 hidnplayr 1195
	   mov ax, app_data
1196
	   mov ds, eax
1197
	   mov es, eax
1198
	   mov ebx, [esp+4]  ;IRQ_xx
1199
	   mov eax, [irq_handlers+ebx+4]
1200
	   call intr_handler
1201
	   mov ecx, [esp+4]
1202
	   sub ecx, 8
1203
	   cmp [irq_actids+ecx*4], 0
1204
	   je @F
1205
	   in al, 0xA1
1206
	   bts eax, ecx
1207
	   out 0xA1, al
1208
	   mov al, 0x20
1209
	   out 0xA0, al
1210
	   out 0x20, al
465 serge 1211
.restart:
672 hidnplayr 1212
	   mov ebx, [next_slot]
1213
	   test ebx, ebx
1214
	   jz @F
1215
	   mov [next_task],0
1216
	   mov esi, [prev_slot]
1217
	   call do_change_task
1218
	   add esp, 4
1219
	   iretd
465 serge 1220
 
1221
end if
1222