Subversion Repositories Kolibri OS

Rev

Rev 394 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
164 serge 1
 
2
proc alloc_page
3
4
 
5
           cli
6
           mov ebx, [page_start]
7
           mov ecx, [page_end]
8
.l1:
9
           bsf eax,[ebx];
10
           jnz .found
11
           add ebx,4
12
           cmp ebx, ecx
13
           jb .l1
14
           popfd
15
           xor eax,eax
16
           ret
17
.found:
18
           btr [ebx], eax
19
           mov [page_start],ebx
20
           sub ebx, sys_pgmap
21
           lea eax, [eax+ebx*8]
254 serge 22
           shl eax, 12
164 serge 23
           dec [pg_data.pages_free]
24
           popfd
25
           ret
26
endp
27
28
 
29
proc alloc_pages stdcall, count:dword
30
           pushfd
31
           cli
32
           mov eax, [count]
33
           add eax, 7
34
           shr eax, 3
35
           mov [count], eax
36
           cmp eax, [pg_data.pages_free]
37
           ja .fail
38
39
 
40
           mov ebx, [page_end]
41
.find:
42
           mov edx, [count]
43
           mov edi, ecx
44
.match:
45
           cmp byte [ecx], 0xFF
46
           jne .next
47
           dec edx
48
           jz .ok
49
           inc ecx
50
           cmp ecx,ebx
51
           jb .match
52
.fail:     xor eax, eax
53
           popfd
54
           ret
55
.next:
56
           inc ecx
57
           cmp ecx, ebx
58
           jb .find
59
           popfd
60
           xor eax, eax
61
           ret
62
.ok:
63
           sub ecx, edi
64
           inc ecx
65
           mov esi, edi
66
           xor eax, eax
67
           rep stosb
68
           sub esi, sys_pgmap
69
           shl esi, 3+12
70
           mov eax, esi
71
           mov ebx, [count]
72
           shl ebx, 3
73
           sub [pg_data.pages_free], ebx
74
           popfd
75
           ret
76
endp
77
78
 
79
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
80
           push ebx
321 diamond 81
           mov eax, [phis_addr]
164 serge 82
           and eax, not 0xFFF
83
           or eax, [flags]
84
           mov ebx, [lin_addr]
85
           shr ebx, 12
86
           mov [page_tabs+ebx*4], eax
365 serge 87
           mov eax, [lin_addr]
164 serge 88
           invlpg [eax]
89
           pop ebx
321 diamond 90
           ret
164 serge 91
endp
92
93
 
94
map_space:    ;not implemented
281 serge 95
96
 
97
 
98
99
 
100
 
101
proc free_page
164 serge 102
;arg:  eax  page address
103
           pushfd
104
           cli
105
           shr eax, 12              ;page index
106
           mov ebx, sys_pgmap
107
           bts [ebx], eax           ;that's all!
108
           cmc
291 serge 109
           adc [pg_data.pages_free], 0
328 serge 110
           shr eax, 3
164 serge 111
           and eax, not 3           ;dword offset from page_map
112
           add eax, ebx
113
           cmp [page_start], eax
114
           ja @f
115
           popfd
116
           ret
117
@@:
118
           mov [page_start], eax
119
           popfd
120
           ret
121
endp
122
123
 
279 serge 124
;  eax= page base + page flags
328 serge 125
;  ebx= liear address
281 serge 126
;  ecx= count
127
128
 
129
commit_pages:
328 serge 130
281 serge 131
 
328 serge 132
           jz .fail
133
281 serge 134
 
328 serge 135
           mov ebx, pg_data.pg_mutex
136
           call wait_mutex      ;ebx
137
138
 
139
           mov ebx, edi
140
           shr ebx, 12
141
@@:
142
           mov [page_tabs+ebx*4], eax
365 serge 143
           invlpg [edi]
328 serge 144
           add edi, edx
145
           add eax, edx
146
           inc ebx
147
           dec ecx
148
           jnz @B
149
           mov [pg_data.pg_mutex],ecx
150
.fail:
151
           ret
281 serge 152
153
 
328 serge 154
 
281 serge 155
;  eax= base
279 serge 156
;  ecx= count
281 serge 157
279 serge 158
 
164 serge 159
release_pages:
279 serge 160
321 diamond 161
 
162
           mov ebx, pg_data.pg_mutex
279 serge 163
           call wait_mutex      ;ebx
164
165
 
166
           mov edi, eax
167
168
 
169
           add esi, page_tabs
365 serge 170
328 serge 171
 
172
           mov ebx, [page_start]
279 serge 173
           mov edx, sys_pgmap
174
@@:
175
           xor eax, eax
176
           xchg eax, [esi]
177
           invlpg [edi]
178
179
 
180
           jz .next
181
182
 
183
           bts [edx], eax
184
           cmc
291 serge 185
           adc ebp, 0
328 serge 186
           shr eax, 3
279 serge 187
           and eax, -4
188
           add eax, edx
189
           cmp eax, ebx
190
           jae .next
191
192
 
193
.next:
194
           add edi, 0x1000
195
           add esi, 4
196
           dec ecx
197
           jnz @B
198
           mov [pg_data.pages_free], ebp
328 serge 199
           and [pg_data.pg_mutex],0
279 serge 200
           popad
321 diamond 201
           ret
279 serge 202
203
 
204
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
188 serge 205
           push ebx
321 diamond 206
           mov ebx, [lin_addr]
164 serge 207
           shr ebx, 22
208
           mov eax, [phis_addr]
209
           and eax, not 0xFFF
210
           or eax, PG_UW          ;+PG_NOCACHE
211
           mov dword [master_tab+ebx*4], eax
378 serge 212
           mov eax, [lin_addr]
164 serge 213
           shr eax, 10
214
           add eax, page_tabs
365 serge 215
           invlpg [eax]
164 serge 216
           pop ebx
321 diamond 217
           ret
164 serge 218
endp
219
220
 
221
proc init_LFB
222
           locals
378 serge 223
             pg_count dd ?
224
           endl
225
226
 
164 serge 227
           jne @f
228
           mov [BOOT_VAR+0x901c],byte 2
388 serge 229
           stdcall kernel_alloc, 0x280000
164 serge 230
           mov [LFBAddress], eax
231
           ret
232
@@:
233
           test [SCR_MODE],word 0100000000000000b
234
           jnz @f
211 serge 235
           mov [BOOT_VAR+0x901c],byte 2
388 serge 236
           ret
211 serge 237
@@:
238
           mov edx, LFB_BASE
378 serge 239
           mov esi, [LFBAddress]
240
           mov edi, 0x00800000
388 serge 241
           mov dword [exp_lfb+4], edx
379 serge 242
214 serge 243
 
164 serge 244
           mov [pg_count], edi
245
           shr edi, 10
246
247
 
248
           jnc .map_page_tables
249
           or esi, PG_LARGE+PG_UW
250
           shr edx, 20
378 serge 251
           mov ecx, edx
252
@@:
164 serge 253
           mov [sys_pgdir+edx], esi
378 serge 254
           add edx, 4
255
           add esi, 0x00400000
164 serge 256
           dec edi
257
           jnz @B
258
259
 
207 serge 260
           jnc @F
261
           or dword [sys_pgdir+ecx], PG_GLOBAL
164 serge 262
@@:
207 serge 263
           mov dword [LFBAddress], LFB_BASE
378 serge 264
           mov eax, cr3       ;flush TLB
164 serge 265
           mov cr3, eax
266
           ret
267
268
 
269
270
 
271
           call alloc_page
272
           stdcall map_page_table, edx, eax
378 serge 273
           add edx, 0x00400000
388 serge 274
           dec edi
164 serge 275
           jnz @B
276
277
 
278
           mov edi, page_tabs + (LFB_BASE shr 10)
378 serge 279
           or eax, PG_UW
164 serge 280
           mov ecx, [pg_count]
281
           cld
378 serge 282
@@:
388 serge 283
           stosd
284
           add eax, 0x1000
285
           dec ecx
286
           jnz @B
287
164 serge 288
 
378 serge 289
           mov eax, cr3       ;flush TLB
164 serge 290
           mov cr3, eax
291
292
 
293
endp
294
295
 
296
proc new_mem_resize stdcall, new_size:dword
297
298
 
276 serge 299
           call wait_mutex    ;ebx
300
164 serge 301
 
302
           add edi,4095
303
           and edi,not 4095
304
           mov [new_size], edi
305
306
 
307
           shl edx,8
308
           cmp [SLOT_BASE+APPDATA.heap_base+edx],0
380 serge 309
           jne .exit
172 serge 310
311
 
380 serge 312
           add esi, 4095
164 serge 313
           and esi, not 4095
314
315
 
316
           jae .expand
317
318
 
319
           shr esi, 12
320
@@:
321
           mov eax, [app_page_tabs+edi*4]
378 serge 322
           test eax, 1
164 serge 323
           jz .next
324
           mov dword [app_page_tabs+edi*4], 2
378 serge 325
           mov ebx, edi
164 serge 326
           shl ebx, 12
327
           invlpg [ebx+std_application_base_address]
328
           call free_page
329
330
 
331
           cmp edi, esi
332
           jb @B
333
334
 
335
        mov     ebx, [new_size]
294 diamond 336
        call    update_mem_size
337
164 serge 338
 
339
           dec [pg_data.pg_mutex]
340
           ret
341
342
 
343
           add edi, new_app_base
344
           add esi, new_app_base
345
346
 
347
           push edi
348
349
 
350
           and edi, not(0x3FFFFF)
351
           add esi, 0x3FFFFF
352
           and esi, not(0x3FFFFF)
353
354
 
355
           jae .grow
356
357
 
358
359
 
360
           call alloc_page
361
           test eax, eax
362
           jz .exit
363
364
 
188 serge 365
164 serge 366
 
367
           shr edi, 10
368
           add edi, page_tabs
365 serge 369
           mov ecx, 1024
164 serge 370
           xor eax, eax
371
           cld
372
           rep stosd
373
           pop edi
374
375
 
376
           cmp edi, esi
377
           jb @B
378
.grow:
379
           pop edi
380
           pop esi
381
@@:
382
           call alloc_page
383
           test eax, eax
384
           jz .exit
385
           stdcall map_page,esi,eax,dword PG_UW
386
387
 
388
           mov edi, esi
389
           xor eax, eax
390
           mov ecx, 1024
391
           cld
392
           rep stosd
393
           pop edi
394
395
 
396
           cmp esi, edi
397
           jb  @B
294 diamond 398
164 serge 399
 
400
.exit:
401
           xor eax, eax
402
           inc eax
403
           dec [pg_data.pg_mutex]
404
           ret
405
endp
406
407
 
294 diamond 408
; in: edx = slot shl 8
409
;     ebx = new memory size
410
; destroys eax,ecx,edx
411
412
 
380 serge 413
;search threads and update
294 diamond 414
;application memory size infomation
415
           mov    ecx,[SLOT_BASE+APPDATA.dir_table+edx]
380 serge 416
           mov    eax,2
294 diamond 417
418
 
419
;eax = current slot
420
;ebx = new memory size
421
;ecx = page directory
422
           cmp    eax,[TASK_COUNT]
423
           jg     .search_threads_end
424
           mov    edx,eax
425
           shl    edx,5
426
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
427
           jz     .search_threads_next
428
           shl    edx,3
429
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
380 serge 430
           jnz    .search_threads_next
294 diamond 431
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
380 serge 432
.search_threads_next:
294 diamond 433
           inc    eax
434
           jmp    .search_threads
435
.search_threads_end:
436
           ret
437
438
 
285 serge 439
;  eax= linear address
440
;
441
; retval
442
;  eax= phisical page address
443
444
 
164 serge 445
get_pg_addr:
285 serge 446
           shr eax, 12
447
           mov eax, [page_tabs+eax*4]
365 serge 448
           and eax, 0xFFFFF000
164 serge 449
           ret
450
451
 
188 serge 452
proc page_fault_handler
164 serge 453
           pushad
454
455
 
388 serge 456
     push edx
457
     mov edx, 0x400   ;bocsh
458
     mov al,0xff      ;bocsh
459
     out dx, al       ;bocsh
460
     pop edx
461
     pop eax
462
463
 
164 serge 464
           mov eax, cr2
465
           push eax
172 serge 466
           push ds
164 serge 467
           push es
188 serge 468
164 serge 469
 
470
           mov ds, ax
471
           mov es, ax
188 serge 472
164 serge 473
 
188 serge 474
475
 
164 serge 476
477
 
378 serge 478
           jae .kernel_space
394 serge 479
164 serge 480
 
395 serge 481
           jae .tab_space
394 serge 482
483
 
378 serge 484
           jae .alloc
188 serge 485
486
 
378 serge 487
           jae .lfb_addr
488
489
 
395 serge 490
;           jb .exit
491
492
 
164 serge 493
           shr ebx, 12
494
           mov ecx, ebx
172 serge 495
           shr ecx, 10
496
           mov edx, [master_tab+ecx*4]
497
           test edx, 1
498
           jz .fail
499
500
 
365 serge 501
           test eax, 2
164 serge 502
           jz .fail
172 serge 503
.alloc:
188 serge 504
           call alloc_page
164 serge 505
           and eax, eax
506
           jz .exit
507
508
 
509
510
 
188 serge 511
           and edi, 0xFFFFF000
512
           mov ecx, 1024
164 serge 513
           xor eax, eax
514
           cld
188 serge 515
           rep stosd
516
.exit:
164 serge 517
           pop es
188 serge 518
           pop ds
164 serge 519
           mov esp, ebp
520
           popad
521
           add esp, 4
522
           iretd
523
.fail:
172 serge 524
           pop es
188 serge 525
           pop ds
172 serge 526
           mov esp, ebp
527
           popad
528
           add esp, 4
529
           iretd
388 serge 530
164 serge 531
 
172 serge 532
533
 
534
           jmp exc_c
535
           iretd
536
537
 
164 serge 538
;           shr ebx, 12
188 serge 539
;           mov eax, [page_tabs+ebx*4]
365 serge 540
;           shr ebx, 10
188 serge 541
;           mov eax, [master_tab+ebx*4]
542
           jmp .exit
543
.old_addr:
164 serge 544
;           shr ebx, 12
188 serge 545
;           mov eax, [page_tabs+ebx*4]
365 serge 546
;           shr ebx, 10
188 serge 547
;           mov eax, [master_tab+ebx*4]
548
           jmp .exit
549
.lfb_addr:
164 serge 550
;           shr ebx, 22
188 serge 551
;           ;mov ecx, [sys_page_dir]
552
;           mov eax, [master_tab+ebx*4]
553
           jmp .exit
554
.tab_space:
164 serge 555
;           shr ebx, 12
188 serge 556
;           mov eax, [page_tabs+ebx*4]
365 serge 557
;           shr ebx, 10
188 serge 558
;           ;mov ecx, [sys_page_dir]
559
;           mov eax, [master_tab+ebx*4]
560
           jmp .exit
561
endp
164 serge 562
563
 
564
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
565
                      ofs:dword,buf_size:dword
566
           mov eax, [buf_size]
567
           test eax, eax
568
           jz .exit
569
570
 
571
           and eax, 0xFFFFF000
572
573
 
574
           mov ebx, [ofs]
575
           shr ebx, 22
576
           mov esi, [ipc_pdir]
577
           mov edi, [ipc_ptab]
578
           mov eax, [esi+ebx*4]
579
           and eax, 0xFFFFF000
580
           test eax, eax
581
           jz .exit
582
           stdcall map_page,edi,eax,dword PG_UW
583
;           inc ebx
584
;           add edi, 0x1000
585
;           mov eax, [esi+ebx*4]
586
;           test eax, eax
587
;           jz @f
588
;          and eax, 0xFFFFF000
589
;           stdcall map_page, edi, eax
590
591
 
592
           and edi, 0xFFFFF000
593
           mov ecx, [buf_size]
594
           add ecx, 4095
595
           shr ecx, 12
596
           inc ecx
597
598
 
599
           shr edx, 12
600
           and edx, 0x3FF
601
           mov esi, [ipc_ptab]
602
603
 
604
           and eax, 0xFFFFF000
605
           test eax, eax
606
           jz .exit
607
           stdcall map_page,edi,eax,dword PG_UW
608
           add edi, 0x1000
609
           inc edx
610
           dec ecx
611
           jnz .map
612
613
 
614
           ret
615
endp
616
617
 
618
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
619
                        ofs:dword,buf_size:dword
620
           mov eax, [buf_size]
621
           test eax, eax
622
           jz .exit
623
624
 
625
           and eax, 0xFFFFF000
626
627
 
628
           mov ebx, [ofs]
629
           shr ebx, 22
630
           mov esi, [proc_mem_pdir]
631
           mov edi, [proc_mem_tab]
632
           mov eax, [esi+ebx*4]
633
           and eax, 0xFFFFF000
634
           test eax, eax
635
           jz .exit
636
           stdcall map_page,edi,eax,dword PG_UW
637
638
 
639
           and edi, 0xFFFFF000
640
           mov ecx, [buf_size]
641
           add ecx, 4095
642
           shr ecx, 12
643
           inc ecx
644
645
 
646
           shr edx, 12
647
           and edx, 0x3FF
648
           mov esi, [proc_mem_tab]
649
650
 
651
;           and eax, 0xFFFFF000
652
;           test eax, eax
653
;           jz .exit
654
           stdcall map_page,edi,eax,dword PG_UW
655
           add edi, 0x1000
656
           inc edx
657
           dec ecx
658
           jnz .map
659
.exit:
660
           ret
661
endp
662
663
 
664
 
665
 
666
 
667
;input:
668
;  eax=1 - set ipc buffer area
669
;    ebx=address of buffer
670
;    ecx=size of buffer
671
;  eax=2 - send message
672
;    ebx=PID
673
;    ecx=address of message
674
;    edx=size of message
675
676
 
677
           jne @f
678
           call set_ipc_buff
679
           mov [esp+36], eax
680
           ret
681
@@:
682
           cmp eax, 2
683
           jne @f
684
           stdcall sys_ipc_send, ebx, ecx, edx
685
           mov [esp+36], eax
686
           ret
687
@@:
688
           xor eax, eax
689
           not eax
690
           mov [esp+36], eax
691
           ret
692
693
 
694
proc set_ipc_buff
695
696
 
697
           shl  eax,8
698
           add  eax, SLOT_BASE
380 serge 699
           pushf
164 serge 700
           cli
701
           mov  [eax+0xA0],ebx     ;set fields in extended information area
702
           mov  [eax+0xA4],ecx
703
704
 
705
           add ecx, ebx
706
           add ecx, 4095
707
           and ecx, not 4095
708
709
 
710
           add ebx, 0x1000
711
           cmp ebx, ecx
712
           jna .touch
713
714
 
715
           xor eax, eax
716
           ret
717
endp
718
719
 
720
           locals
721
             dst_slot   dd ?
722
             dst_offset dd ?
723
             buf_size   dd ?
724
           endl
725
726
 
727
           cli
728
729
 
730
           call pid_to_slot
731
           test eax,eax
732
           jz   .no_pid
733
734
 
735
           shl  eax,8
736
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
380 serge 737
           test edi,edi
164 serge 738
           jz   .no_ipc_area
739
740
 
741
           add edi, new_app_base
742
           and ebx, 0xFFF
743
           mov [dst_offset], ebx
744
745
 
380 serge 746
           mov [buf_size], esi
164 serge 747
748
 
380 serge 749
                             edi, esi
164 serge 750
751
 
752
           add edi, [ipc_tmp]
753
           cmp dword [edi], 0
754
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
755
227 serge 756
 
164 serge 757
           mov edx, ebx
758
           add ebx, 8
759
           add ebx, [msg_size]
760
           cmp ebx, [buf_size]
761
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
762
227 serge 763
 
164 serge 764
           mov eax,[TASK_BASE]
765
           mov eax, [eax+0x04]         ;eax - our PID
766
           mov edi, [dst_offset]
767
           add edi, [ipc_tmp]
768
           add edi, edx
769
           mov [edi], eax
770
           mov ecx, [msg_size]
771
772
 
773
           add edi, 8
774
           mov esi, [msg_addr]
775
           add esi, new_app_base
776
           cld
777
           rep movsb
778
779
 
780
           mov edx, ebx
781
           shr ebx, 12
782
           xor eax, eax
783
           mov [page_tabs+ebx*4], eax
365 serge 784
           invlpg [edx]
164 serge 785
786
 
787
           mov edx, ebx
788
           shr ebx, 12
789
           xor eax, eax
790
           mov [page_tabs+ebx*4], eax
365 serge 791
           invlpg [edx]
164 serge 792
793
 
794
           mov edx, ebx
795
           shr ebx, 12
796
           xor eax, eax
797
           mov [page_tabs+ebx*4], eax
365 serge 798
           invlpg [edx]
164 serge 799
800
 
801
           shl eax, 8
802
           or   [eax+SLOT_BASE+0xA8],dword 0x40
380 serge 803
           cmp  dword [check_idle_semaphore],20
164 serge 804
           jge  .ipc_no_cis
805
806
 
807
.ipc_no_cis:
808
           popf
809
           xor eax, eax
810
           ret
811
.no_pid:
812
           popf
813
           mov  eax, 4
814
           ret
815
.no_ipc_area:
816
           popf
817
           xor eax, eax
818
           inc eax
819
           ret
820
.ipc_blocked:
821
           popf
822
           mov  eax, 2
823
           ret
824
.buffer_overflow:
825
           popf
826
           mov  eax, 3
827
           ret
828
endp
829
830
 
831
sysfn_meminfo:
170 serge 832
164 serge 833
 
170 serge 834
           cmp ebx, new_app_base
172 serge 835
           jb .fail
836
837
 
164 serge 838
           mov [ebx], eax
170 serge 839
           shl eax, 12
172 serge 840
           mov [esp+36], eax
841
           mov ecx, [pg_data.pages_free]
170 serge 842
           mov [ebx+4], ecx
843
           mov edx, [pg_data.pages_faults]
844
           mov [ebx+8], edx
845
           mov esi, [heap_size]
846
           mov [ebx+12], esi
847
           mov edi, [heap_free]
848
           mov [ebx+16], edi
849
           mov eax, [heap_blocks]
850
           mov [ebx+20], eax
851
           mov ecx, [free_blocks]
852
           mov [ebx+24], ecx
853
           ret
164 serge 854
.fail:
172 serge 855
           mov dword [esp+36], -1
856
           ret
857
164 serge 858
 
859
new_services:
860
861
 
862
           jle  sys_sheduler
863
864
 
170 serge 865
           jb .fail
164 serge 866
           ja @f
867
868
 
188 serge 869
           mov [esp+36], eax
164 serge 870
           ret
871
@@:
872
           cmp eax, 12
873
           ja @f
874
875
 
876
           mov [esp+36], eax
877
           ret
878
@@:
879
           cmp eax, 13
880
           ja @f
881
           add ebx, new_app_base
188 serge 882
           stdcall user_free, ebx
164 serge 883
           mov [esp+36], eax
884
           ret
885
@@:
886
           cmp eax, 14
887
           ja @f
888
           add ebx, new_app_base
227 serge 889
           cmp ebx, new_app_base
172 serge 890
           jb .fail
891
           stdcall get_event_ex, ebx, ecx
227 serge 892
           mov [esp+36], eax
893
           ret
164 serge 894
@@:
895
           cmp eax, 15
896
           ja @f
897
           mov ecx, [CURRENT_TASK]
898
           shl ecx, 8
899
           mov eax, [ecx+SLOT_BASE+APPDATA.fpu_handler]
380 serge 900
           mov [ecx+SLOT_BASE+APPDATA.fpu_handler], ebx
901
           mov [esp+36], eax
164 serge 902
           ret
903
@@:
904
           cmp eax, 16
905
           ja @f
906
907
 
188 serge 908
           jz .fail
909
           add ebx, new_app_base
164 serge 910
           cmp ebx, new_app_base
172 serge 911
           jb .fail
912
           stdcall get_service, ebx
164 serge 913
           mov [esp+36], eax
914
           ret
915
@@:
916
           cmp eax, 17
917
           ja @f
918
           call srv_handlerEx   ;ebx
378 serge 919
           mov [esp+36], eax
164 serge 920
           ret
921
@@:
168 serge 922
           cmp eax, 18
923
           ja @f
924
           mov ecx, [CURRENT_TASK]
925
           shl ecx, 8
926
           mov eax, [ecx+SLOT_BASE+APPDATA.sse_handler]
380 serge 927
           mov [ecx+SLOT_BASE+APPDATA.sse_handler], ebx
928
           mov [esp+36], eax
168 serge 929
           ret
930
@@:
164 serge 931
           cmp eax, 19
198 serge 932
           ja .fail
227 serge 933
           add ebx, new_app_base
198 serge 934
           cmp ebx, new_app_base
935
           jb .fail
936
           stdcall load_library, ebx
937
           mov [esp+36], eax
938
           ret
939
227 serge 940
 
164 serge 941
           xor eax, eax
942
           mov [esp+36], eax
943
           ret
944
945
 
946
proc init_mtrr
947
948
 
388 serge 949
           je  .exit
164 serge 950
951
 
211 serge 952
           jnc .exit
953
954
 
164 serge 955
           or eax, 0x60000000   ;disable caching
956
           mov cr0, eax
957
           wbinvd               ;invalidate cache
958
959
 
960
           rdmsr                ;
961
           push eax
962
963
 
964
           xor eax, eax
965
           mov ecx, 0x2FF
966
           wrmsr                ;disable all MTRR
967
968
 
969
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
970
           xor edx, edx
971
           xor eax, eax
972
           mov ecx, 0x204
973
           mov ebx, 6
974
@@:
975
           wrmsr                ;disable unused MTRR
976
           inc ecx
977
           wrmsr
978
           inc ecx
979
           dec ebx
980
           jnz @b
981
982
 
983
984
 
985
           or eax, 0x800        ;set default memtype to UC
986
           and al, 0xF0
987
           mov ecx, 0x2FF
988
           wrmsr                ;and enable MTRR
989
990
 
991
           and eax, not 0x60000000
992
           mov cr0, eax         ; enable caching
993
.exit:
994
           ret
995
endp
996
997
 
998
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
999
1000
 
1001
           mov eax, [base]
1002
           or eax, [mem_type]
1003
           mov ecx, [reg]
1004
           lea ecx, [0x200+ecx*2]
1005
           wrmsr
1006
1007
 
1008
           dec ebx
1009
           mov eax, 0xFFFFFFFF
1010
           mov edx, 0x0000000F
1011
           sub eax, ebx
1012
           sbb edx, 0
1013
           or eax, 0x800
1014
           inc ecx
1015
           wrmsr
1016
           ret
1017
endp
1018
1019
 
388 serge 1020
 
172 serge 1021
proc strncmp stdcall, str1:dword, str2:dword, count:dword
388 serge 1022
1023
 
1024
          jecxz .end
1025
1026
 
1027
1028
 
1029
          mov esi,edi
1030
          xor eax,eax
1031
          repne scasb
1032
          neg ecx             ; cx = count - strlen
1033
          add ecx,ebx         ; strlen + count - strlen
1034
1035
 
1036
          mov edi,esi
1037
          mov esi,[str2]
1038
          repe cmpsb
1039
          mov al,[esi-1]
1040
          xor ecx,ecx
1041
1042
 
1043
          ja .str2_big
1044
          je .end
1045
1046
 
1047
          sub ecx,2
1048
1049
 
1050
          not ecx
1051
.end:
1052
          mov eax,ecx
1053
          ret
1054
endp
1055
1056
 
1057
proc stall stdcall, delay:dword
172 serge 1058
           push ecx
1059
           push edx
1060
           push ebx
1061
           push eax
1062
1063
 
1064
           mul [stall_mcs]
1065
           mov ebx, eax       ;low
1066
           mov ecx, edx       ;high
1067
           rdtsc
1068
           add ebx, eax
1069
           adc ecx,edx
1070
@@:
1071
           rdtsc
1072
           sub eax, ebx
1073
           sbb edx, ecx
1074
           jb @B
1075
1076
 
1077
           pop ebx
1078
           pop edx
1079
           pop ecx
1080
           ret
1081
endp
1082
1083
 
164 serge 1084
k_strrchr:
237 serge 1085
        push eax
1086
        xor eax,eax
1087
        or  ecx,-1
1088
        repne scasb
1089
        add ecx,1
1090
        neg ecx
1091
        sub edi,1
1092
        pop eax
1093
        std
1094
        repne scasb
1095
        cld
1096
        add edi,1
1097
1098
 
1099
        jne @F
1100
        mov eax,edi
1101
        ret
1102
@@:
1103
        xor eax,eax
1104
        ret
1105
1106
 
1107
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1108
        mov eax, [dest]
1109
        mov esi, [src]
1110
        mov ecx, [maxlen]
1111
        test eax, eax
1112
        jz .L9
1113
        test esi, esi
1114
        jz .L9
1115
        test ecx, ecx
1116
        jz .L9
1117
1118
 
1119
        jmp .L1
1120
1121
 
1122
.L2:
1123
        mov edx, [esi+eax]
1124
        mov [eax], dl
1125
        test dl, dl
1126
        jz .L7
1127
1128
 
1129
        test dh, dh
1130
        jz .L6
1131
1132
 
1133
        mov [eax+2],dl
1134
        test dl, dl
1135
        jz .L5
1136
1137
 
1138
        test dh, dh
1139
        jz .L4
1140
        add eax, 4
1141
.L1:
1142
        sub ecx, 4
1143
        jae .L2
1144
1145
 
1146
        jz .L9
1147
1148
 
1149
        mov [eax], dl
1150
        test dl, dl
1151
        jz .L3
1152
1153
 
1154
        dec ecx
1155
        jz .L9
1156
1157
 
1158
        mov [eax], dl
1159
        test dl, dl
1160
        jz .L3
1161
1162
 
1163
        dec ecx
1164
        jz .L9
1165
1166
 
1167
        mov [eax], dl
1168
        test dl, dl
1169
        jz .L3
1170
1171
 
1172
        jmp .L9
1173
1174
 
1175
        inc eax
1176
1177
 
1178
        inc eax
1179
1180
 
1181
        inc eax
1182
.L7:
1183
        add ecx,3
1184
        jz .L9
1185
.L8:
1186
        mov byte [ecx+eax], 0
1187
.L3:
1188
        dec ecx
1189
        jnz .L8
1190
.L9:
1191
	ret
1192
endp
1193
1194
 
1195
1196
 
1197
1198
 
1199
        mov eax,[esp+4]
1200
        mov edx, 3
1201
1202
 
1203
        jz .L1
1204
        jp .L0
1205
1206
 
1207
        je .L2
1208
1209
 
1210
        cmp dh, byte [eax]
1211
1212
 
1213
1214
 
1215
        xor edx, 2
1216
1217
 
1218
.L0:
1219
        cmp dh, [eax]
1220
        je .L2
1221
1222
 
1223
        xor edx, edx
1224
1225
 
1226
        mov ecx, [eax]
1227
        add eax, 4
1228
1229
 
1230
        add ecx, magic
1231
1232
 
1233
        jnc .L3
1234
1235
 
1236
        and edx, not magic
1237
        jne .L3
1238
1239
 
1240
        add eax, 4
1241
1242
 
1243
        add ecx, magic
1244
        dec edx
1245
        jnc .L3
1246
1247
 
1248
        and edx, not magic
1249
        jne .L3
1250
1251
 
1252
        add eax, 4
1253
1254
 
1255
        add ecx, magic
1256
1257
 
1258
        jnc .L3
1259
1260
 
1261
1262
 
1263
        jne .L3
1264
1265
 
1266
        add eax, 4
1267
1268
 
1269
        add ecx, magic
1270
1271
 
1272
        jnc .L3
1273
1274
 
1275
1276
 
1277
        je .L1
1278
1279
 
1280
        sub ecx, magic
1281
1282
 
1283
        jz .L2
1284
1285
 
1286
        test ch, ch
1287
        jz .L2
1288
1289
 
1290
        inc eax
1291
1292
 
1293
        jz .L2
1294
1295
 
1296
1297
 
1298
        sub eax, [esp+4]
1299
	ret
1300
1301
 
1302
388 serge 1303
 
1304
     push eax
1305
     push edx
1306
     mov edx, 0x400   ;bocsh
1307
     mov al,0xff      ;bocsh
1308
     out dx, al       ;bocsh
1309
     pop edx
1310
     pop eax
1311
end if
1312