Subversion Repositories Kolibri OS

Rev

Rev 802 | Rev 916 | 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: 819 $
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
 
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