Subversion Repositories Kolibri OS

Rev

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