Subversion Repositories Kolibri OS

Rev

Rev 797 | Rev 819 | 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: 802 $
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
 
769 Rus 391
	   xor eax, eax
164 serge 392
 
769 Rus 393
	   cmp [name], eax
394
	   je .fail
740 serge 395
 
769 Rus 396
	   cmp [handler], eax
397
	   je .fail
740 serge 398
 
769 Rus 399
	   push ebx
672 hidnplayr 400
	   mov eax, SRV_SIZE
401
	   call malloc		 ;call alloc_service
769 Rus 402
	   pop ebx
164 serge 403
	   test eax, eax
404
	   jz .fail
405
 
769 Rus 406
	   push ebx
407
	   push esi
408
	   push edi
164 serge 409
	   mov edi, eax
769 Rus 410
	   mov esi, [name]
672 hidnplayr 411
	   mov ecx, 16/4
412
	   rep movsd
769 Rus 413
	   pop edi
414
	   pop esi
164 serge 415
 
672 hidnplayr 416
	   mov [eax+SRV.magic], ' SRV'
417
	   mov [eax+SRV.size], SRV_SIZE
278 serge 418
 
672 hidnplayr 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
 
769 Rus 426
	   mov ecx, [handler]
672 hidnplayr 427
	   mov [eax+SRV.srv_proc], ecx
769 Rus 428
	   pop ebx
429
	   ret
164 serge 430
.fail:
431
	   xor eax, eax
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
 
672 hidnplayr 588
	   mov eax, [file_size]
589
	   cmp eax, 1024*1024*16
590
	   ja .fail
206 serge 591
 
672 hidnplayr 592
	   stdcall kernel_alloc, [file_size]
593
	   mov [file], eax
164 serge 594
 
672 hidnplayr 595
	   stdcall read_file, [file_name], eax, dword 0, [file_size]
596
	   cmp ebx, [file_size]
597
	   jne .cleanup
211 serge 598
 
672 hidnplayr 599
	   mov eax, [file]
600
	   cmp dword [eax], 0x4B43504B
601
	   jne .exit
602
	   mov ebx, [eax+4]
603
	   mov [file_size], ebx
604
	   stdcall kernel_alloc, ebx
211 serge 605
 
672 hidnplayr 606
	   test eax, eax
607
	   jz .cleanup
211 serge 608
 
672 hidnplayr 609
	   mov [file2], eax
610
	   stdcall unpack, [file], eax
611
	   stdcall kernel_free, [file]
612
	   mov eax, [file2]
613
	   mov ebx, [file_size]
211 serge 614
.exit:
672 hidnplayr 615
	   push eax
616
	   lea edi, [eax+ebx]	  ;cleanup remain space
617
	   mov ecx, 4096	  ;from file end
618
	   and ebx, 4095
619
	   jz  @f
620
	   sub ecx, ebx
621
	   xor eax, eax
622
	   cld
623
	   rep stosb
521 diamond 624
@@:
672 hidnplayr 625
	   mov ebx, [file_size]
626
	   pop eax
627
	   pop edi
628
	   pop esi
629
	   ret
188 serge 630
.cleanup:
672 hidnplayr 631
	   stdcall kernel_free, [file]
188 serge 632
.fail:
672 hidnplayr 633
	   xor eax, eax
634
	   xor ebx, ebx
635
	   pop edi
636
	   pop esi
637
	   ret
188 serge 638
endp
164 serge 639
 
188 serge 640
align 4
641
proc get_proc_ex stdcall, proc_name:dword, imports:dword
642
 
643
.look_up:
672 hidnplayr 644
	   mov edx, [imports]
645
	   test edx, edx
646
	   jz .end
647
	   mov edx, [edx]
648
	   test edx, edx
649
	   jz .end
188 serge 650
.next:
672 hidnplayr 651
	   mov eax, [edx]
652
	   test eax, eax
653
	   jz .next_table
164 serge 654
 
672 hidnplayr 655
	   push edx
656
	   stdcall strncmp, eax, [proc_name], 16
657
	   pop edx
658
	   test eax, eax
659
	   jz .ok
164 serge 660
 
672 hidnplayr 661
	   add edx,8
662
	   jmp .next
188 serge 663
.next_table:
672 hidnplayr 664
	   add [imports], 4
665
	   jmp .look_up
188 serge 666
.ok:
672 hidnplayr 667
	   mov eax, [edx+4]
668
	   ret
188 serge 669
.end:
672 hidnplayr 670
	   xor eax, eax
671
	   ret
188 serge 672
endp
164 serge 673
 
188 serge 674
align 4
675
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
672 hidnplayr 676
		      sym_count:dword, strings:dword, imports:dword
677
	   locals
678
	     retval dd ?
679
	   endl
164 serge 680
 
672 hidnplayr 681
	   mov edi, [symbols]
682
	   mov [retval], 1
188 serge 683
.fix:
672 hidnplayr 684
	   movzx ebx, [edi+CSYM.SectionNumber]
685
	   test ebx, ebx
686
	   jnz .internal
687
	   mov eax, dword [edi+CSYM.Name]
688
	   test eax, eax
689
	   jnz @F
164 serge 690
 
672 hidnplayr 691
	   mov edi, [edi+4]
692
	   add edi, [strings]
188 serge 693
@@:
672 hidnplayr 694
	   push edi
695
	   stdcall get_proc_ex, edi,[imports]
696
	   pop edi
164 serge 697
 
672 hidnplayr 698
	   xor ebx, ebx
699
	   test eax, eax
700
	   jnz @F
164 serge 701
 
672 hidnplayr 702
	   mov esi, msg_unresolved
703
	   call sys_msg_board_str
704
	   mov esi, edi
705
	   call sys_msg_board_str
706
	   mov esi, msg_CR
707
	   call sys_msg_board_str
164 serge 708
 
672 hidnplayr 709
	   mov [retval],0
188 serge 710
@@:
672 hidnplayr 711
	   mov edi, [symbols]
712
	   mov [edi+CSYM.Value], eax
713
	   jmp .next
188 serge 714
.internal:
672 hidnplayr 715
	   cmp bx, -1
716
	   je .next
717
	   cmp bx, -2
718
	   je .next
541 serge 719
 
672 hidnplayr 720
	   dec ebx
721
	   shl ebx, 3
722
	   lea ebx, [ebx+ebx*4]
723
	   add ebx, [sec]
188 serge 724
 
672 hidnplayr 725
	   mov eax, [ebx+CFS.VirtualAddress]
726
	   add [edi+CSYM.Value], eax
188 serge 727
.next:
672 hidnplayr 728
	   add edi, CSYM_SIZE
729
	   mov [symbols], edi
730
	   dec [sym_count]
731
	   jnz .fix
732
	   mov eax, [retval]
733
	   ret
164 serge 734
endp
735
 
736
align 4
188 serge 737
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
164 serge 738
	   locals
672 hidnplayr 739
	     n_sec     dd ?
164 serge 740
	   endl
741
 
672 hidnplayr 742
	   mov eax, [coff]
743
	   movzx ebx, [eax+CFH.nSections]
744
	   mov [n_sec], ebx
188 serge 745
.fix_sec:
672 hidnplayr 746
	   mov esi, [sec]
164 serge 747
	   mov edi, [esi+CFS.PtrReloc]
672 hidnplayr 748
	   add edi, [coff]
164 serge 749
 
672 hidnplayr 750
	   movzx ecx, [esi+CFS.NumReloc]
751
	   test ecx, ecx
752
	   jz .next
188 serge 753
.next_reloc:
164 serge 754
	   mov ebx, [edi+CRELOC.SymIndex]
755
	   add ebx,ebx
756
	   lea ebx,[ebx+ebx*8]
672 hidnplayr 757
	   add ebx, [sym]
164 serge 758
 
672 hidnplayr 759
	   mov edx, [ebx+CSYM.Value]
164 serge 760
 
672 hidnplayr 761
	   cmp [edi+CRELOC.Type], 6
762
	   je .dir_32
164 serge 763
 
672 hidnplayr 764
	   cmp [edi+CRELOC.Type], 20
765
	   jne .next_reloc
188 serge 766
.rel_32:
164 serge 767
	   mov eax, [edi+CRELOC.VirtualAddress]
672 hidnplayr 768
	   add eax, [esi+CFS.VirtualAddress]
769
	   sub edx, eax
770
	   sub edx, 4
771
	   jmp .fix
188 serge 772
.dir_32:
773
	   mov eax, [edi+CRELOC.VirtualAddress]
672 hidnplayr 774
	   add eax, [esi+CFS.VirtualAddress]
188 serge 775
.fix:
672 hidnplayr 776
	   add [eax], edx
777
	   add edi, 10
778
	   dec ecx
779
	   jnz .next_reloc
188 serge 780
.next:
672 hidnplayr 781
	   add [sec], COFF_SECTION_SIZE
782
	   dec [n_sec]
783
	   jnz .fix_sec
164 serge 784
.exit:
785
	   ret
786
endp
787
 
188 serge 788
align 4
346 diamond 789
proc load_driver stdcall, driver_name:dword
672 hidnplayr 790
	   locals
791
	     coff      dd ?
792
	     sym       dd ?
793
	     strings   dd ?
794
	     img_size  dd ?
795
	     img_base  dd ?
796
	     start     dd ?
188 serge 797
 
672 hidnplayr 798
	     exports   dd ?   ;fake exports table
799
		       dd ?
800
	     file_name rb 13+16+4+1	 ; '/sys/drivers/.obj'
801
	   endl
188 serge 802
 
672 hidnplayr 803
	   lea	   edx, [file_name]
804
	   mov	   dword [edx], '/sys'
805
	   mov	   dword [edx+4], '/dri'
806
	   mov	   dword [edx+8], 'vers'
807
	   mov	   byte [edx+12], '/'
808
	   mov	   esi, [driver_name]
809
	   lea	   edi, [edx+13]
810
	   mov	   ecx, 16
346 diamond 811
@@:
672 hidnplayr 812
	   lodsb
813
	   test    al, al
814
	   jz	   @f
815
	   stosb
816
	   loop    @b
346 diamond 817
@@:
672 hidnplayr 818
	   mov	   dword [edi], '.obj'
819
	   mov	   byte [edi+4], 0
820
	   stdcall load_file, edx
214 serge 821
 
672 hidnplayr 822
	   test eax, eax
823
	   jz .exit
188 serge 824
 
672 hidnplayr 825
	   mov [coff], eax
188 serge 826
 
672 hidnplayr 827
	   movzx ecx, [eax+CFH.nSections]
828
	   xor ebx, ebx
188 serge 829
 
672 hidnplayr 830
	   lea edx, [eax+20]
188 serge 831
@@:
672 hidnplayr 832
	   add ebx, [edx+CFS.SizeOfRawData]
833
	   add ebx, 15
834
	   and ebx, not 15
835
	   add edx, COFF_SECTION_SIZE
836
	   dec ecx
837
	   jnz @B
838
	   mov [img_size], ebx
188 serge 839
 
672 hidnplayr 840
	   stdcall kernel_alloc, ebx
841
	   test eax, eax
842
	   jz .fail
843
	   mov [img_base], eax
188 serge 844
 
672 hidnplayr 845
	   mov edi, eax
846
	   xor eax, eax
847
	   mov ecx, [img_size]
848
	   add ecx, 4095
849
	   and ecx, not 4095
850
	   shr ecx, 2
851
	   cld
852
	   rep stosd
188 serge 853
 
672 hidnplayr 854
	   mov edx, [coff]
855
	   movzx ebx, [edx+CFH.nSections]
856
	   mov edi, [img_base]
857
	   lea eax, [edx+20]
188 serge 858
@@:
672 hidnplayr 859
	   mov [eax+CFS.VirtualAddress], edi
860
	   mov esi, [eax+CFS.PtrRawData]
861
	   test esi, esi
862
	   jnz .copy
863
	   add edi, [eax+CFS.SizeOfRawData]
864
	   jmp .next
188 serge 865
.copy:
672 hidnplayr 866
	   add esi, edx
867
	   mov ecx, [eax+CFS.SizeOfRawData]
868
	   cld
869
	   rep movsb
188 serge 870
.next:
672 hidnplayr 871
	   add edi, 15
872
	   and edi, not 15
873
	   add eax, COFF_SECTION_SIZE
874
	   dec ebx
875
	   jnz @B
188 serge 876
 
672 hidnplayr 877
	   mov ebx, [edx+CFH.pSymTable]
878
	   add ebx, edx
879
	   mov [sym], ebx
880
	   mov ecx, [edx+CFH.nSymbols]
881
	   add ecx,ecx
882
	   lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
883
	   add ecx, [sym]
884
	   mov [strings], ecx
188 serge 885
 
672 hidnplayr 886
	   lea ebx, [exports]
887
	   mov dword [ebx], kernel_export
888
	   mov dword [ebx+4], 0
889
	   lea eax, [edx+20]
188 serge 890
 
672 hidnplayr 891
	   stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
892
				     [strings], ebx
893
	   test eax, eax
894
	   jz .link_fail
188 serge 895
 
672 hidnplayr 896
	   mov ebx, [coff]
897
	   add ebx, 20
898
	   stdcall fix_coff_relocs, [coff], ebx, [sym]
188 serge 899
 
672 hidnplayr 900
	   mov ebx, [coff]
901
	   stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
902
	   test eax, eax
903
	   jz .link_fail
227 serge 904
 
672 hidnplayr 905
	   mov eax, [eax]
906
	   shr eax, 16
907
	   cmp eax, DRV_COMPAT
908
	   jb .ver_fail
227 serge 909
 
672 hidnplayr 910
	   cmp eax, DRV_CURRENT
911
	   ja .ver_fail
227 serge 912
 
672 hidnplayr 913
	   mov ebx, [coff]
914
	   stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
915
	   mov [start], eax
188 serge 916
 
672 hidnplayr 917
	   stdcall kernel_free, [coff]
188 serge 918
 
672 hidnplayr 919
	   mov ebx, [start]
920
	   stdcall ebx, DRV_ENTRY
921
	   test eax, eax
922
	   jnz .ok
188 serge 923
 
672 hidnplayr 924
	   stdcall kernel_free, [img_base]
925
	   xor eax, eax
926
	   ret
188 serge 927
.ok:
672 hidnplayr 928
	   mov ebx, [img_base]
929
	   mov [eax+SRV.base], ebx
930
	   mov ecx, [start]
931
	   mov [eax+SRV.entry], ecx
932
	   ret
227 serge 933
 
934
.ver_fail:
672 hidnplayr 935
	   mov esi, msg_CR
936
	   call sys_msg_board_str
937
	   mov esi, [driver_name]
938
	   call sys_msg_board_str
939
	   mov esi, msg_CR
940
	   call sys_msg_board_str
941
	   mov esi, msg_version
942
	   call sys_msg_board_str
943
	   mov esi, msg_www
944
	   call sys_msg_board_str
945
	   jmp .cleanup
227 serge 946
 
947
.link_fail:
672 hidnplayr 948
	   mov esi, msg_module
949
	   call sys_msg_board_str
950
	   mov esi, [driver_name]
951
	   call sys_msg_board_str
952
	   mov esi, msg_CR
953
	   call sys_msg_board_str
227 serge 954
.cleanup:
672 hidnplayr 955
	   stdcall kernel_free,[img_base]
188 serge 956
.fail:
672 hidnplayr 957
	   stdcall kernel_free, [coff]
227 serge 958
.exit:
672 hidnplayr 959
	   xor eax, eax
960
	   ret
164 serge 961
endp
962
 
198 serge 963
align 4
964
proc load_library stdcall, file_name:dword
672 hidnplayr 965
	   locals
966
	     coff      dd ?
967
	     sym       dd ?
968
	     strings   dd ?
969
	     img_size  dd ?
970
	     img_base  dd ?
971
	     exports   dd ?
972
	   endl
198 serge 973
 
672 hidnplayr 974
	   cli
198 serge 975
 
672 hidnplayr 976
	   stdcall load_file, [file_name]
977
	   test eax, eax
978
	   jz .fail
198 serge 979
 
672 hidnplayr 980
	   mov [coff], eax
981
	   movzx ecx, [eax+CFH.nSections]
982
	   xor ebx, ebx
198 serge 983
 
672 hidnplayr 984
	   lea edx, [eax+20]
198 serge 985
@@:
672 hidnplayr 986
	   add ebx, [edx+CFS.SizeOfRawData]
987
	   add ebx, 15
988
	   and ebx, not 15
989
	   add edx, COFF_SECTION_SIZE
990
	   dec ecx
991
	   jnz @B
992
	   mov [img_size], ebx
198 serge 993
 
672 hidnplayr 994
	   call init_heap
995
	   stdcall user_alloc, [img_size]
198 serge 996
 
672 hidnplayr 997
	   test eax, eax
998
	   jz .fail
999
	   mov [img_base], eax
198 serge 1000
 
672 hidnplayr 1001
	   mov edx, [coff]
1002
	   movzx ebx, [edx+CFH.nSections]
1003
	   mov edi, [img_base]
1004
	   lea eax, [edx+20]
198 serge 1005
@@:
672 hidnplayr 1006
	   mov [eax+CFS.VirtualAddress], edi
1007
	   mov esi, [eax+CFS.PtrRawData]
1008
	   test esi, esi
1009
	   jnz .copy
1010
	   add edi, [eax+CFS.SizeOfRawData]
1011
	   jmp .next
198 serge 1012
.copy:
672 hidnplayr 1013
	   add esi, edx
465 serge 1014
    ;       add edi, new_app_base
672 hidnplayr 1015
	   mov ecx, [eax+CFS.SizeOfRawData]
1016
	   cld
1017
	   rep movsb
198 serge 1018
.next:
672 hidnplayr 1019
	   add edi, 15 ;-new_app_base
1020
	   and edi, -16
1021
	   add eax, COFF_SECTION_SIZE
1022
	   dec ebx
1023
	   jnz @B
198 serge 1024
 
672 hidnplayr 1025
	   mov ebx, [edx+CFH.pSymTable]
1026
	   add ebx, edx
1027
	   mov [sym], ebx
1028
	   mov ecx, [edx+CFH.nSymbols]
1029
	   add ecx,ecx
1030
	   lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
1031
	   add ecx, [sym]
1032
	   mov [strings], ecx
198 serge 1033
 
672 hidnplayr 1034
	   lea eax, [edx+20]
198 serge 1035
 
672 hidnplayr 1036
	   stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
1037
				     [strings], dword 0
1038
	   test eax, eax
1039
	   jnz @F
198 serge 1040
 
1041
@@:
672 hidnplayr 1042
	   mov edx, [coff]
1043
	   movzx ebx, [edx+CFH.nSections]
1044
	   mov edi, new_app_base
1045
	   lea eax, [edx+20]
198 serge 1046
@@:
672 hidnplayr 1047
	   add [eax+CFS.VirtualAddress], edi  ;patch user space offset
1048
	   add eax, COFF_SECTION_SIZE
1049
	   dec ebx
1050
	   jnz @B
198 serge 1051
 
672 hidnplayr 1052
	   add edx, 20
1053
	   stdcall fix_coff_relocs, [coff], edx, [sym]
198 serge 1054
 
672 hidnplayr 1055
	   mov ebx, [coff]
1056
	   stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
1057
	   mov [exports], eax
198 serge 1058
 
672 hidnplayr 1059
	   stdcall kernel_free, [coff]
1060
	   mov eax, [exports]
1061
	   ret
198 serge 1062
.fail:
672 hidnplayr 1063
	   xor eax, eax
1064
	   ret
198 serge 1065
endp
1066
 
214 serge 1067
align 4
1068
proc stop_all_services
278 serge 1069
 
672 hidnplayr 1070
	   mov edx, [srv.fd]
214 serge 1071
.next:
672 hidnplayr 1072
	   cmp edx,  srv.fd-SRV_FD_OFFSET
1073
	   je .done
1074
	   cmp [edx+SRV.magic], ' SRV'
1075
	   jne .next
1076
	   cmp [edx+SRV.size], SRV_SIZE
1077
	   jne .next
732 serge 1078
 
769 Rus 1079
	   mov ebx, [edx+SRV.entry]
672 hidnplayr 1080
	   mov edx, [edx+SRV.fd]
769 Rus 1081
	   test ebx, ebx
1082
	   jz .next
732 serge 1083
 
769 Rus 1084
	   push edx
672 hidnplayr 1085
	   stdcall ebx, dword -1
1086
	   pop edx
1087
	   jmp .next
278 serge 1088
.done:
672 hidnplayr 1089
	   ret
214 serge 1090
endp
198 serge 1091
 
281 serge 1092
; param
291 serge 1093
;  eax= size
1094
;  ebx= pid
214 serge 1095
 
281 serge 1096
align 4
1097
create_kernel_object:
1098
 
672 hidnplayr 1099
	   push ebx
1100
	   call malloc
1101
	   pop ebx
1102
	   test eax, eax
1103
	   jz .fail
281 serge 1104
 
672 hidnplayr 1105
	   mov ecx,[current_slot]
1106
	   add ecx, APP_OBJ_OFFSET
281 serge 1107
 
672 hidnplayr 1108
	   pushfd
1109
	   cli
1110
	   mov edx, [ecx+APPOBJ.fd]
1111
	   mov [eax+APPOBJ.fd], edx
1112
	   mov [eax+APPOBJ.bk], ecx
1113
	   mov [eax+APPOBJ.pid], ebx
281 serge 1114
 
672 hidnplayr 1115
	   mov [ecx+APPOBJ.fd], eax
1116
	   mov [edx+APPOBJ.bk], eax
1117
	   popfd
281 serge 1118
.fail:
672 hidnplayr 1119
	   ret
281 serge 1120
 
1121
; param
1122
;  eax= object
1123
 
1124
align 4
1125
destroy_kernel_object:
1126
 
672 hidnplayr 1127
	   pushfd
1128
	   cli
1129
	   mov ebx, [eax+APPOBJ.fd]
1130
	   mov ecx, [eax+APPOBJ.bk]
1131
	   mov [ebx+APPOBJ.bk], ecx
1132
	   mov [ecx+APPOBJ.fd], ebx
1133
	   popfd
281 serge 1134
 
672 hidnplayr 1135
	   xor edx, edx        ;clear common header
1136
	   mov [eax], edx
1137
	   mov [eax+4], edx
1138
	   mov [eax+8], edx
1139
	   mov [eax+12], edx
1140
	   mov [eax+16], edx
281 serge 1141
 
672 hidnplayr 1142
	   call free	       ;release object memory
1143
	   ret
281 serge 1144
 
1145
 
164 serge 1146
 
465 serge 1147
if 0
164 serge 1148
 
465 serge 1149
irq:
188 serge 1150
 
465 serge 1151
.irq0:
672 hidnplayr 1152
	   pusfd
1153
	   pushad
1154
	   push IRQ_0
1155
	   jmp .master
465 serge 1156
.irq_1:
672 hidnplayr 1157
	   pusfd
1158
	   pushad
1159
	   push IRQ_1
1160
	   jmp .master
465 serge 1161
 
1162
.master:
672 hidnplayr 1163
	   mov ax, app_data
1164
	   mov ds, eax
1165
	   mov es, eax
1166
	   mov ebx, [esp+4]  ;IRQ_xx
1167
	   mov eax, [irq_handlers+ebx+4]
1168
	   call intr_handler
1169
	   mov ecx, [esp+4]
1170
	   cmp [irq_actids+ecx*4], 0
1171
	   je @F
1172
	   in al, 0x21
1173
	   bts eax, ecx
1174
	   out 0x21, al
1175
	   mov al, 0x20
1176
	   out 0x20, al
1177
	   jmp .restart
465 serge 1178
 
1179
.slave:
672 hidnplayr 1180
	   mov ax, app_data
1181
	   mov ds, eax
1182
	   mov es, eax
1183
	   mov ebx, [esp+4]  ;IRQ_xx
1184
	   mov eax, [irq_handlers+ebx+4]
1185
	   call intr_handler
1186
	   mov ecx, [esp+4]
1187
	   sub ecx, 8
1188
	   cmp [irq_actids+ecx*4], 0
1189
	   je @F
1190
	   in al, 0xA1
1191
	   bts eax, ecx
1192
	   out 0xA1, al
1193
	   mov al, 0x20
1194
	   out 0xA0, al
1195
	   out 0x20, al
465 serge 1196
.restart:
672 hidnplayr 1197
	   mov ebx, [next_slot]
1198
	   test ebx, ebx
1199
	   jz @F
1200
	   mov [next_task],0
1201
	   mov esi, [prev_slot]
1202
	   call do_change_task
1203
	   add esp, 4
1204
	   iretd
465 serge 1205
 
1206
end if
1207