Subversion Repositories Kolibri OS

Rev

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