Subversion Repositories Kolibri OS

Rev

Rev 1018 | Rev 1289 | 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: 1275 $
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
 
1275 serge 318
       cmp [edi+SRV.size], SRV.sizeof
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
 
1275 serge 350
       cmp [eax+SRV.size], SRV.sizeof
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
 
1275 serge 405
       mov eax, SRV.sizeof
406
       call malloc
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]
1275 serge 414
       movsd
415
       movsd
416
       movsd
417
       movsd
769 Rus 418
	   pop edi
419
	   pop esi
164 serge 420
 
672 hidnplayr 421
	   mov [eax+SRV.magic], ' SRV'
1275 serge 422
       mov [eax+SRV.size], SRV.sizeof
278 serge 423
 
672 hidnplayr 424
	   mov ebx, srv.fd-SRV_FD_OFFSET
425
	   mov edx, [ebx+SRV.fd]
426
	   mov [eax+SRV.fd], edx
427
	   mov [eax+SRV.bk], ebx
428
	   mov [ebx+SRV.fd], eax
429
	   mov [edx+SRV.bk], eax
278 serge 430
 
769 Rus 431
	   mov ecx, [handler]
672 hidnplayr 432
	   mov [eax+SRV.srv_proc], ecx
769 Rus 433
	   pop ebx
434
	   ret
164 serge 435
.fail:
436
	   xor eax, eax
819 serge 437
           pop ebx
769 Rus 438
	   ret
740 serge 439
endp
164 serge 440
 
441
align 4
442
proc get_proc stdcall, exp:dword, sz_name:dword
443
 
672 hidnplayr 444
	   mov edx, [exp]
164 serge 445
.next:
672 hidnplayr 446
	   mov eax, [edx]
447
	   test eax, eax
448
	   jz .end
164 serge 449
 
672 hidnplayr 450
	   push edx
451
	   stdcall strncmp, eax, [sz_name], 16
452
	   pop edx
453
	   test eax, eax
454
	   jz .ok
164 serge 455
 
672 hidnplayr 456
	   add edx,8
457
	   jmp .next
164 serge 458
.ok:
672 hidnplayr 459
	   mov eax, [edx+4]
164 serge 460
.end:
672 hidnplayr 461
	   ret
164 serge 462
endp
463
 
464
align 4
465
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
466
 
467
@@:
468
	   stdcall strncmp, [pSym], [sz_sym], 8
469
	   test eax,eax
470
	   jz .ok
471
	   add [pSym], 18
472
	   dec [count]
473
	   jnz @b
474
	   xor eax, eax
475
	   ret
476
.ok:
477
	   mov ebx, [pSym]
478
	   mov eax, [ebx+8]
479
	   ret
480
endp
481
 
482
align 4
188 serge 483
proc get_curr_task
672 hidnplayr 484
	   mov eax,[CURRENT_TASK]
485
	   shl eax, 8
486
	   ret
188 serge 487
endp
164 serge 488
 
188 serge 489
align 4
490
proc get_fileinfo stdcall, file_name:dword, info:dword
672 hidnplayr 491
	   locals
492
	     cmd     dd ?
493
	     offset  dd ?
494
		     dd ?
495
	     count   dd ?
496
	     buff    dd ?
497
		     db ?
498
	     name    dd ?
499
	   endl
164 serge 500
 
672 hidnplayr 501
	   xor eax, eax
502
	   mov ebx, [file_name]
503
	   mov ecx, [info]
164 serge 504
 
672 hidnplayr 505
	   mov [cmd], 5
506
	   mov [offset], eax
507
	   mov [offset+4], eax
508
	   mov [count], eax
509
	   mov [buff], ecx
510
	   mov byte [buff+4], al
511
	   mov [name], ebx
164 serge 512
 
672 hidnplayr 513
	   mov eax, 70
514
	   lea ebx, [cmd]
515
	   int 0x40
516
	   ret
188 serge 517
endp
164 serge 518
 
188 serge 519
align 4
520
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
672 hidnplayr 521
				     bytes:dword
522
	   locals
523
	     cmd     dd ?
524
	     offset  dd ?
525
		     dd ?
526
	     count   dd ?
527
	     buff    dd ?
528
		     db ?
529
	     name    dd ?
530
	   endl
164 serge 531
 
672 hidnplayr 532
	   xor eax, eax
533
	   mov ebx, [file_name]
534
	   mov ecx, [off]
535
	   mov edx, [bytes]
536
	   mov esi, [buffer]
164 serge 537
 
672 hidnplayr 538
	   mov [cmd], eax
539
	   mov [offset], ecx
540
	   mov [offset+4], eax
541
	   mov [count], edx
542
	   mov [buff], esi
543
	   mov byte [buff+4], al
544
	   mov [name], ebx
188 serge 545
 
672 hidnplayr 546
	   pushad
547
	   push eax
548
	   lea eax, [cmd]
549
	   call file_system_lfn
550
	   pop eax
551
	   popad
552
	   ret
188 serge 553
endp
554
 
363 serge 555
; description
556
;  allocate kernel memory and loads the specified file
557
;
558
; param
559
;  file_name= full path to file
560
;
561
; retval
562
;  eax= file image in kernel memory
563
;  ebx= size of file
564
;
565
; warging
566
;  You mast call kernel_free() to delete each file
567
;  loaded by the load_file() function
568
 
188 serge 569
align 4
570
proc load_file stdcall, file_name:dword
672 hidnplayr 571
	   locals
572
	     attr	dd ?
573
	     flags	dd ?
574
	     cr_time	dd ?
575
	     cr_date	dd ?
576
	     acc_time	dd ?
577
	     acc_date	dd ?
578
	     mod_time	dd ?
579
	     mod_date	dd ?
580
	     file_size	dd ?
188 serge 581
 
672 hidnplayr 582
	     file	dd ?
583
	     file2	dd ?
584
	   endl
188 serge 585
 
672 hidnplayr 586
	   push esi
587
	   push edi
662 serge 588
 
672 hidnplayr 589
	   lea eax, [attr]
590
	   stdcall get_fileinfo, [file_name], eax
591
	   test eax, eax
592
	   jnz .fail
164 serge 593
 
672 hidnplayr 594
	   mov eax, [file_size]
595
	   cmp eax, 1024*1024*16
596
	   ja .fail
206 serge 597
 
672 hidnplayr 598
	   stdcall kernel_alloc, [file_size]
599
	   mov [file], eax
164 serge 600
 
672 hidnplayr 601
	   stdcall read_file, [file_name], eax, dword 0, [file_size]
602
	   cmp ebx, [file_size]
603
	   jne .cleanup
211 serge 604
 
672 hidnplayr 605
	   mov eax, [file]
606
	   cmp dword [eax], 0x4B43504B
607
	   jne .exit
608
	   mov ebx, [eax+4]
609
	   mov [file_size], ebx
610
	   stdcall kernel_alloc, ebx
211 serge 611
 
672 hidnplayr 612
	   test eax, eax
613
	   jz .cleanup
211 serge 614
 
672 hidnplayr 615
	   mov [file2], eax
1275 serge 616
       pushfd
617
       cli
672 hidnplayr 618
	   stdcall unpack, [file], eax
1275 serge 619
       popfd
672 hidnplayr 620
	   stdcall kernel_free, [file]
621
	   mov eax, [file2]
622
	   mov ebx, [file_size]
211 serge 623
.exit:
672 hidnplayr 624
	   push eax
625
	   lea edi, [eax+ebx]	  ;cleanup remain space
626
	   mov ecx, 4096	  ;from file end
627
	   and ebx, 4095
628
	   jz  @f
629
	   sub ecx, ebx
630
	   xor eax, eax
631
	   cld
632
	   rep stosb
521 diamond 633
@@:
672 hidnplayr 634
	   mov ebx, [file_size]
635
	   pop eax
636
	   pop edi
637
	   pop esi
638
	   ret
188 serge 639
.cleanup:
672 hidnplayr 640
	   stdcall kernel_free, [file]
188 serge 641
.fail:
672 hidnplayr 642
	   xor eax, eax
643
	   xor ebx, ebx
644
	   pop edi
645
	   pop esi
646
	   ret
188 serge 647
endp
164 serge 648
 
188 serge 649
align 4
650
proc get_proc_ex stdcall, proc_name:dword, imports:dword
651
 
652
.look_up:
672 hidnplayr 653
	   mov edx, [imports]
654
	   test edx, edx
655
	   jz .end
656
	   mov edx, [edx]
657
	   test edx, edx
658
	   jz .end
188 serge 659
.next:
672 hidnplayr 660
	   mov eax, [edx]
661
	   test eax, eax
662
	   jz .next_table
164 serge 663
 
672 hidnplayr 664
	   push edx
916 serge 665
       stdcall strncmp, eax, [proc_name], 256
672 hidnplayr 666
	   pop edx
667
	   test eax, eax
668
	   jz .ok
164 serge 669
 
672 hidnplayr 670
	   add edx,8
671
	   jmp .next
188 serge 672
.next_table:
672 hidnplayr 673
	   add [imports], 4
674
	   jmp .look_up
188 serge 675
.ok:
672 hidnplayr 676
	   mov eax, [edx+4]
677
	   ret
188 serge 678
.end:
672 hidnplayr 679
	   xor eax, eax
680
	   ret
188 serge 681
endp
164 serge 682
 
188 serge 683
align 4
684
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
672 hidnplayr 685
		      sym_count:dword, strings:dword, imports:dword
686
	   locals
687
	     retval dd ?
688
	   endl
164 serge 689
 
672 hidnplayr 690
	   mov edi, [symbols]
691
	   mov [retval], 1
188 serge 692
.fix:
672 hidnplayr 693
	   movzx ebx, [edi+CSYM.SectionNumber]
694
	   test ebx, ebx
695
	   jnz .internal
696
	   mov eax, dword [edi+CSYM.Name]
697
	   test eax, eax
698
	   jnz @F
164 serge 699
 
672 hidnplayr 700
	   mov edi, [edi+4]
701
	   add edi, [strings]
188 serge 702
@@:
672 hidnplayr 703
	   push edi
704
	   stdcall get_proc_ex, edi,[imports]
705
	   pop edi
164 serge 706
 
672 hidnplayr 707
	   xor ebx, ebx
708
	   test eax, eax
709
	   jnz @F
164 serge 710
 
672 hidnplayr 711
	   mov esi, msg_unresolved
712
	   call sys_msg_board_str
713
	   mov esi, edi
714
	   call sys_msg_board_str
715
	   mov esi, msg_CR
716
	   call sys_msg_board_str
164 serge 717
 
672 hidnplayr 718
	   mov [retval],0
188 serge 719
@@:
672 hidnplayr 720
	   mov edi, [symbols]
721
	   mov [edi+CSYM.Value], eax
722
	   jmp .next
188 serge 723
.internal:
672 hidnplayr 724
	   cmp bx, -1
725
	   je .next
726
	   cmp bx, -2
727
	   je .next
541 serge 728
 
672 hidnplayr 729
	   dec ebx
730
	   shl ebx, 3
731
	   lea ebx, [ebx+ebx*4]
732
	   add ebx, [sec]
188 serge 733
 
672 hidnplayr 734
	   mov eax, [ebx+CFS.VirtualAddress]
735
	   add [edi+CSYM.Value], eax
188 serge 736
.next:
672 hidnplayr 737
	   add edi, CSYM_SIZE
738
	   mov [symbols], edi
739
	   dec [sym_count]
740
	   jnz .fix
741
	   mov eax, [retval]
742
	   ret
164 serge 743
endp
744
 
745
align 4
188 serge 746
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
164 serge 747
	   locals
672 hidnplayr 748
	     n_sec     dd ?
164 serge 749
	   endl
750
 
672 hidnplayr 751
	   mov eax, [coff]
752
	   movzx ebx, [eax+CFH.nSections]
753
	   mov [n_sec], ebx
188 serge 754
.fix_sec:
672 hidnplayr 755
	   mov esi, [sec]
164 serge 756
	   mov edi, [esi+CFS.PtrReloc]
672 hidnplayr 757
	   add edi, [coff]
164 serge 758
 
672 hidnplayr 759
	   movzx ecx, [esi+CFS.NumReloc]
760
	   test ecx, ecx
761
	   jz .next
188 serge 762
.next_reloc:
164 serge 763
	   mov ebx, [edi+CRELOC.SymIndex]
764
	   add ebx,ebx
765
	   lea ebx,[ebx+ebx*8]
672 hidnplayr 766
	   add ebx, [sym]
164 serge 767
 
672 hidnplayr 768
	   mov edx, [ebx+CSYM.Value]
164 serge 769
 
672 hidnplayr 770
	   cmp [edi+CRELOC.Type], 6
771
	   je .dir_32
164 serge 772
 
672 hidnplayr 773
	   cmp [edi+CRELOC.Type], 20
774
	   jne .next_reloc
188 serge 775
.rel_32:
164 serge 776
	   mov eax, [edi+CRELOC.VirtualAddress]
672 hidnplayr 777
	   add eax, [esi+CFS.VirtualAddress]
778
	   sub edx, eax
779
	   sub edx, 4
780
	   jmp .fix
188 serge 781
.dir_32:
782
	   mov eax, [edi+CRELOC.VirtualAddress]
672 hidnplayr 783
	   add eax, [esi+CFS.VirtualAddress]
188 serge 784
.fix:
672 hidnplayr 785
	   add [eax], edx
786
	   add edi, 10
787
	   dec ecx
788
	   jnz .next_reloc
188 serge 789
.next:
672 hidnplayr 790
	   add [sec], COFF_SECTION_SIZE
791
	   dec [n_sec]
792
	   jnz .fix_sec
164 serge 793
.exit:
794
	   ret
795
endp
796
 
188 serge 797
align 4
346 diamond 798
proc load_driver stdcall, driver_name:dword
672 hidnplayr 799
	   locals
800
	     coff      dd ?
801
	     sym       dd ?
802
	     strings   dd ?
803
	     img_size  dd ?
804
	     img_base  dd ?
805
	     start     dd ?
188 serge 806
 
672 hidnplayr 807
	     exports   dd ?   ;fake exports table
808
		       dd ?
809
	     file_name rb 13+16+4+1	 ; '/sys/drivers/.obj'
810
	   endl
188 serge 811
 
672 hidnplayr 812
	   lea	   edx, [file_name]
813
	   mov	   dword [edx], '/sys'
814
	   mov	   dword [edx+4], '/dri'
815
	   mov	   dword [edx+8], 'vers'
816
	   mov	   byte [edx+12], '/'
817
	   mov	   esi, [driver_name]
1018 diamond 818
.redo:
819
           lea     edx, [file_name]
672 hidnplayr 820
	   lea	   edi, [edx+13]
821
	   mov	   ecx, 16
346 diamond 822
@@:
672 hidnplayr 823
	   lodsb
824
	   test    al, al
825
	   jz	   @f
826
	   stosb
827
	   loop    @b
346 diamond 828
@@:
672 hidnplayr 829
	   mov	   dword [edi], '.obj'
830
	   mov	   byte [edi+4], 0
831
	   stdcall load_file, edx
214 serge 832
 
672 hidnplayr 833
	   test eax, eax
834
	   jz .exit
188 serge 835
 
672 hidnplayr 836
	   mov [coff], eax
188 serge 837
 
672 hidnplayr 838
	   movzx ecx, [eax+CFH.nSections]
839
	   xor ebx, ebx
188 serge 840
 
672 hidnplayr 841
	   lea edx, [eax+20]
188 serge 842
@@:
672 hidnplayr 843
	   add ebx, [edx+CFS.SizeOfRawData]
844
	   add ebx, 15
845
	   and ebx, not 15
846
	   add edx, COFF_SECTION_SIZE
847
	   dec ecx
848
	   jnz @B
849
	   mov [img_size], ebx
188 serge 850
 
672 hidnplayr 851
	   stdcall kernel_alloc, ebx
852
	   test eax, eax
853
	   jz .fail
854
	   mov [img_base], eax
188 serge 855
 
672 hidnplayr 856
	   mov edi, eax
857
	   xor eax, eax
858
	   mov ecx, [img_size]
859
	   add ecx, 4095
860
	   and ecx, not 4095
861
	   shr ecx, 2
862
	   cld
863
	   rep stosd
188 serge 864
 
672 hidnplayr 865
	   mov edx, [coff]
866
	   movzx ebx, [edx+CFH.nSections]
867
	   mov edi, [img_base]
868
	   lea eax, [edx+20]
188 serge 869
@@:
672 hidnplayr 870
	   mov [eax+CFS.VirtualAddress], edi
871
	   mov esi, [eax+CFS.PtrRawData]
872
	   test esi, esi
873
	   jnz .copy
874
	   add edi, [eax+CFS.SizeOfRawData]
875
	   jmp .next
188 serge 876
.copy:
672 hidnplayr 877
	   add esi, edx
878
	   mov ecx, [eax+CFS.SizeOfRawData]
879
	   cld
880
	   rep movsb
188 serge 881
.next:
672 hidnplayr 882
	   add edi, 15
883
	   and edi, not 15
884
	   add eax, COFF_SECTION_SIZE
885
	   dec ebx
886
	   jnz @B
188 serge 887
 
672 hidnplayr 888
	   mov ebx, [edx+CFH.pSymTable]
889
	   add ebx, edx
890
	   mov [sym], ebx
891
	   mov ecx, [edx+CFH.nSymbols]
892
	   add ecx,ecx
893
	   lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
894
	   add ecx, [sym]
895
	   mov [strings], ecx
188 serge 896
 
672 hidnplayr 897
	   lea ebx, [exports]
898
	   mov dword [ebx], kernel_export
899
	   mov dword [ebx+4], 0
900
	   lea eax, [edx+20]
188 serge 901
 
672 hidnplayr 902
	   stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
903
				     [strings], ebx
904
	   test eax, eax
905
	   jz .link_fail
188 serge 906
 
672 hidnplayr 907
	   mov ebx, [coff]
908
	   add ebx, 20
909
	   stdcall fix_coff_relocs, [coff], ebx, [sym]
188 serge 910
 
672 hidnplayr 911
	   mov ebx, [coff]
912
	   stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
913
	   test eax, eax
914
	   jz .link_fail
227 serge 915
 
672 hidnplayr 916
	   mov eax, [eax]
917
	   shr eax, 16
918
	   cmp eax, DRV_COMPAT
919
	   jb .ver_fail
227 serge 920
 
672 hidnplayr 921
	   cmp eax, DRV_CURRENT
922
	   ja .ver_fail
227 serge 923
 
672 hidnplayr 924
	   mov ebx, [coff]
925
	   stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
926
	   mov [start], eax
188 serge 927
 
672 hidnplayr 928
	   stdcall kernel_free, [coff]
188 serge 929
 
672 hidnplayr 930
	   mov ebx, [start]
931
	   stdcall ebx, DRV_ENTRY
932
	   test eax, eax
933
	   jnz .ok
188 serge 934
 
672 hidnplayr 935
	   stdcall kernel_free, [img_base]
1018 diamond 936
           cmp     dword [file_name+13], 'SOUN'
937
           jnz     @f
938
           cmp     dword [file_name+17], 'D.ob'
939
           jnz     @f
940
           cmp     word [file_name+21], 'j'
941
           jnz     @f
942
           mov     esi, aSis
943
           jmp     .redo
944
@@:
672 hidnplayr 945
	   xor eax, eax
946
	   ret
188 serge 947
.ok:
672 hidnplayr 948
	   mov ebx, [img_base]
949
	   mov [eax+SRV.base], ebx
950
	   mov ecx, [start]
951
	   mov [eax+SRV.entry], ecx
952
	   ret
227 serge 953
 
954
.ver_fail:
672 hidnplayr 955
	   mov esi, msg_CR
956
	   call sys_msg_board_str
957
	   mov esi, [driver_name]
958
	   call sys_msg_board_str
959
	   mov esi, msg_CR
960
	   call sys_msg_board_str
961
	   mov esi, msg_version
962
	   call sys_msg_board_str
963
	   mov esi, msg_www
964
	   call sys_msg_board_str
965
	   jmp .cleanup
227 serge 966
 
967
.link_fail:
672 hidnplayr 968
	   mov esi, msg_module
969
	   call sys_msg_board_str
970
	   mov esi, [driver_name]
971
	   call sys_msg_board_str
972
	   mov esi, msg_CR
973
	   call sys_msg_board_str
227 serge 974
.cleanup:
672 hidnplayr 975
	   stdcall kernel_free,[img_base]
188 serge 976
.fail:
672 hidnplayr 977
	   stdcall kernel_free, [coff]
227 serge 978
.exit:
672 hidnplayr 979
	   xor eax, eax
980
	   ret
164 serge 981
endp
982
 
198 serge 983
align 4
984
proc load_library stdcall, file_name:dword
672 hidnplayr 985
	   locals
986
	     coff      dd ?
987
	     sym       dd ?
988
	     strings   dd ?
989
	     img_size  dd ?
990
	     img_base  dd ?
991
	     exports   dd ?
992
	   endl
198 serge 993
 
672 hidnplayr 994
	   cli
198 serge 995
 
672 hidnplayr 996
	   stdcall load_file, [file_name]
997
	   test eax, eax
998
	   jz .fail
198 serge 999
 
672 hidnplayr 1000
	   mov [coff], eax
1001
	   movzx ecx, [eax+CFH.nSections]
1002
	   xor ebx, ebx
198 serge 1003
 
672 hidnplayr 1004
	   lea edx, [eax+20]
198 serge 1005
@@:
672 hidnplayr 1006
	   add ebx, [edx+CFS.SizeOfRawData]
1007
	   add ebx, 15
1008
	   and ebx, not 15
1009
	   add edx, COFF_SECTION_SIZE
1010
	   dec ecx
1011
	   jnz @B
1012
	   mov [img_size], ebx
198 serge 1013
 
672 hidnplayr 1014
	   call init_heap
1015
	   stdcall user_alloc, [img_size]
198 serge 1016
 
672 hidnplayr 1017
	   test eax, eax
1018
	   jz .fail
1019
	   mov [img_base], eax
198 serge 1020
 
672 hidnplayr 1021
	   mov edx, [coff]
1022
	   movzx ebx, [edx+CFH.nSections]
1023
	   mov edi, [img_base]
1024
	   lea eax, [edx+20]
198 serge 1025
@@:
672 hidnplayr 1026
	   mov [eax+CFS.VirtualAddress], edi
1027
	   mov esi, [eax+CFS.PtrRawData]
1028
	   test esi, esi
1029
	   jnz .copy
1030
	   add edi, [eax+CFS.SizeOfRawData]
1031
	   jmp .next
198 serge 1032
.copy:
672 hidnplayr 1033
	   add esi, edx
1034
	   mov ecx, [eax+CFS.SizeOfRawData]
1035
	   cld
1036
	   rep movsb
198 serge 1037
.next:
672 hidnplayr 1038
	   add edi, 15 ;-new_app_base
1039
	   and edi, -16
1040
	   add eax, COFF_SECTION_SIZE
1041
	   dec ebx
1042
	   jnz @B
198 serge 1043
 
672 hidnplayr 1044
	   mov ebx, [edx+CFH.pSymTable]
1045
	   add ebx, edx
1046
	   mov [sym], ebx
1047
	   mov ecx, [edx+CFH.nSymbols]
1048
	   add ecx,ecx
1049
	   lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
1050
	   add ecx, [sym]
1051
	   mov [strings], ecx
198 serge 1052
 
672 hidnplayr 1053
	   lea eax, [edx+20]
198 serge 1054
 
672 hidnplayr 1055
	   stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
1056
				     [strings], dword 0
1057
	   test eax, eax
1058
	   jnz @F
198 serge 1059
 
1060
@@:
672 hidnplayr 1061
	   mov edx, [coff]
1062
	   movzx ebx, [edx+CFH.nSections]
1063
	   mov edi, new_app_base
1064
	   lea eax, [edx+20]
198 serge 1065
@@:
672 hidnplayr 1066
	   add [eax+CFS.VirtualAddress], edi  ;patch user space offset
1067
	   add eax, COFF_SECTION_SIZE
1068
	   dec ebx
1069
	   jnz @B
198 serge 1070
 
672 hidnplayr 1071
	   add edx, 20
1072
	   stdcall fix_coff_relocs, [coff], edx, [sym]
198 serge 1073
 
672 hidnplayr 1074
	   mov ebx, [coff]
1075
	   stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
916 serge 1076
       test eax, eax
1077
       jnz @F
1078
 
924 serge 1079
       mov ebx, [coff]
916 serge 1080
       stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],sz_EXPORTS
917 diamond 1081
@@:
924 serge 1082
       mov [exports], eax
672 hidnplayr 1083
	   stdcall kernel_free, [coff]
1084
	   mov eax, [exports]
1085
	   ret
198 serge 1086
.fail:
672 hidnplayr 1087
	   xor eax, eax
1088
	   ret
198 serge 1089
endp
1090
 
214 serge 1091
align 4
1275 serge 1092
stop_all_services:
1093
       push ebp
672 hidnplayr 1094
	   mov edx, [srv.fd]
214 serge 1095
.next:
672 hidnplayr 1096
	   cmp edx,  srv.fd-SRV_FD_OFFSET
1097
	   je .done
1098
	   cmp [edx+SRV.magic], ' SRV'
1099
	   jne .next
1275 serge 1100
       cmp [edx+SRV.size], SRV.sizeof
672 hidnplayr 1101
	   jne .next
732 serge 1102
 
769 Rus 1103
	   mov ebx, [edx+SRV.entry]
672 hidnplayr 1104
	   mov edx, [edx+SRV.fd]
769 Rus 1105
	   test ebx, ebx
1106
	   jz .next
732 serge 1107
 
769 Rus 1108
	   push edx
672 hidnplayr 1109
	   stdcall ebx, dword -1
1110
	   pop edx
1111
	   jmp .next
278 serge 1112
.done:
1275 serge 1113
       pop ebp
672 hidnplayr 1114
	   ret
198 serge 1115
 
281 serge 1116
; param
291 serge 1117
;  eax= size
1118
;  ebx= pid
214 serge 1119
 
281 serge 1120
align 4
1121
create_kernel_object:
1122
 
672 hidnplayr 1123
	   push ebx
1124
	   call malloc
1125
	   pop ebx
1126
	   test eax, eax
1127
	   jz .fail
281 serge 1128
 
672 hidnplayr 1129
	   mov ecx,[current_slot]
1130
	   add ecx, APP_OBJ_OFFSET
281 serge 1131
 
672 hidnplayr 1132
	   pushfd
1133
	   cli
1134
	   mov edx, [ecx+APPOBJ.fd]
1135
	   mov [eax+APPOBJ.fd], edx
1136
	   mov [eax+APPOBJ.bk], ecx
1137
	   mov [eax+APPOBJ.pid], ebx
281 serge 1138
 
672 hidnplayr 1139
	   mov [ecx+APPOBJ.fd], eax
1140
	   mov [edx+APPOBJ.bk], eax
1141
	   popfd
281 serge 1142
.fail:
672 hidnplayr 1143
	   ret
281 serge 1144
 
1145
; param
1146
;  eax= object
1147
 
1148
align 4
1149
destroy_kernel_object:
1150
 
672 hidnplayr 1151
	   pushfd
1152
	   cli
1153
	   mov ebx, [eax+APPOBJ.fd]
1154
	   mov ecx, [eax+APPOBJ.bk]
1155
	   mov [ebx+APPOBJ.bk], ecx
1156
	   mov [ecx+APPOBJ.fd], ebx
1157
	   popfd
281 serge 1158
 
672 hidnplayr 1159
	   xor edx, edx        ;clear common header
1160
	   mov [eax], edx
1161
	   mov [eax+4], edx
1162
	   mov [eax+8], edx
1163
	   mov [eax+12], edx
1164
	   mov [eax+16], edx
281 serge 1165
 
672 hidnplayr 1166
	   call free	       ;release object memory
1167
	   ret
281 serge 1168
 
1169
 
164 serge 1170
 
465 serge 1171
if 0
164 serge 1172
 
465 serge 1173
irq:
188 serge 1174
 
465 serge 1175
.irq0:
672 hidnplayr 1176
	   pusfd
1177
	   pushad
1178
	   push IRQ_0
1179
	   jmp .master
465 serge 1180
.irq_1:
672 hidnplayr 1181
	   pusfd
1182
	   pushad
1183
	   push IRQ_1
1184
	   jmp .master
465 serge 1185
 
1186
.master:
672 hidnplayr 1187
	   mov ax, app_data
1188
	   mov ds, eax
1189
	   mov es, eax
1190
	   mov ebx, [esp+4]  ;IRQ_xx
1191
	   mov eax, [irq_handlers+ebx+4]
1192
	   call intr_handler
1193
	   mov ecx, [esp+4]
1194
	   cmp [irq_actids+ecx*4], 0
1195
	   je @F
1196
	   in al, 0x21
1197
	   bts eax, ecx
1198
	   out 0x21, al
1199
	   mov al, 0x20
1200
	   out 0x20, al
1201
	   jmp .restart
465 serge 1202
 
1203
.slave:
672 hidnplayr 1204
	   mov ax, app_data
1205
	   mov ds, eax
1206
	   mov es, eax
1207
	   mov ebx, [esp+4]  ;IRQ_xx
1208
	   mov eax, [irq_handlers+ebx+4]
1209
	   call intr_handler
1210
	   mov ecx, [esp+4]
1211
	   sub ecx, 8
1212
	   cmp [irq_actids+ecx*4], 0
1213
	   je @F
1214
	   in al, 0xA1
1215
	   bts eax, ecx
1216
	   out 0xA1, al
1217
	   mov al, 0x20
1218
	   out 0xA0, al
1219
	   out 0x20, al
465 serge 1220
.restart:
672 hidnplayr 1221
	   mov ebx, [next_slot]
1222
	   test ebx, ebx
1223
	   jz @F
1224
	   mov [next_task],0
1225
	   mov esi, [prev_slot]
1226
	   call do_change_task
1227
	   add esp, 4
1228
	   iretd
465 serge 1229
 
1230
end if
1231