Subversion Repositories Kolibri OS

Rev

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