Subversion Repositories Kolibri OS

Rev

Rev 388 | 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 .user_space
164 serge 479
480
 
378 serge 481
           jae .alloc
188 serge 482
483
 
378 serge 484
           jae .tab_space
164 serge 485
486
 
378 serge 487
           jae .lfb_addr
488
489
 
164 serge 490
491
 
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