Subversion Repositories Kolibri OS

Rev

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