Subversion Repositories Kolibri OS

Rev

Rev 390 | 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
 
394 serge 481
           jae .tab_space
482
483
 
378 serge 484
           jae .alloc
188 serge 485
486
 
378 serge 487
           jae .lfb_addr
488
489
 
164 serge 490
           shr ebx, 12
491
           mov ecx, ebx
172 serge 492
           shr ecx, 10
493
           mov edx, [master_tab+ecx*4]
494
           test edx, 1
495
           jz .fail
496
497
 
365 serge 498
           test eax, 2
164 serge 499
           jz .fail
172 serge 500
.alloc:
188 serge 501
           call alloc_page
164 serge 502
           and eax, eax
503
           jz .exit
504
505
 
506
507
 
188 serge 508
           and edi, 0xFFFFF000
509
           mov ecx, 1024
164 serge 510
           xor eax, eax
511
           cld
188 serge 512
           rep stosd
513
.exit:
164 serge 514
           pop es
188 serge 515
           pop ds
164 serge 516
           mov esp, ebp
517
           popad
518
           add esp, 4
519
           iretd
520
.fail:
172 serge 521
           pop es
188 serge 522
           pop ds
172 serge 523
           mov esp, ebp
524
           popad
525
           add esp, 4
526
           iretd
388 serge 527
164 serge 528
 
172 serge 529
530
 
531
           jmp exc_c
532
           iretd
533
534
 
164 serge 535
;           shr ebx, 12
188 serge 536
;           mov eax, [page_tabs+ebx*4]
365 serge 537
;           shr ebx, 10
188 serge 538
;           mov eax, [master_tab+ebx*4]
539
           jmp .exit
540
.old_addr:
164 serge 541
;           shr ebx, 12
188 serge 542
;           mov eax, [page_tabs+ebx*4]
365 serge 543
;           shr ebx, 10
188 serge 544
;           mov eax, [master_tab+ebx*4]
545
           jmp .exit
546
.lfb_addr:
164 serge 547
;           shr ebx, 22
188 serge 548
;           ;mov ecx, [sys_page_dir]
549
;           mov eax, [master_tab+ebx*4]
550
           jmp .exit
551
.tab_space:
164 serge 552
;           shr ebx, 12
188 serge 553
;           mov eax, [page_tabs+ebx*4]
365 serge 554
;           shr ebx, 10
188 serge 555
;           ;mov ecx, [sys_page_dir]
556
;           mov eax, [master_tab+ebx*4]
557
           jmp .exit
558
endp
164 serge 559
560
 
561
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
562
                      ofs:dword,buf_size:dword
563
           mov eax, [buf_size]
564
           test eax, eax
565
           jz .exit
566
567
 
568
           and eax, 0xFFFFF000
569
570
 
571
           mov ebx, [ofs]
572
           shr ebx, 22
573
           mov esi, [ipc_pdir]
574
           mov edi, [ipc_ptab]
575
           mov eax, [esi+ebx*4]
576
           and eax, 0xFFFFF000
577
           test eax, eax
578
           jz .exit
579
           stdcall map_page,edi,eax,dword PG_UW
580
;           inc ebx
581
;           add edi, 0x1000
582
;           mov eax, [esi+ebx*4]
583
;           test eax, eax
584
;           jz @f
585
;          and eax, 0xFFFFF000
586
;           stdcall map_page, edi, eax
587
588
 
589
           and edi, 0xFFFFF000
590
           mov ecx, [buf_size]
591
           add ecx, 4095
592
           shr ecx, 12
593
           inc ecx
594
595
 
596
           shr edx, 12
597
           and edx, 0x3FF
598
           mov esi, [ipc_ptab]
599
600
 
601
           and eax, 0xFFFFF000
602
           test eax, eax
603
           jz .exit
604
           stdcall map_page,edi,eax,dword PG_UW
605
           add edi, 0x1000
606
           inc edx
607
           dec ecx
608
           jnz .map
609
610
 
611
           ret
612
endp
613
614
 
615
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
616
                        ofs:dword,buf_size:dword
617
           mov eax, [buf_size]
618
           test eax, eax
619
           jz .exit
620
621
 
622
           and eax, 0xFFFFF000
623
624
 
625
           mov ebx, [ofs]
626
           shr ebx, 22
627
           mov esi, [proc_mem_pdir]
628
           mov edi, [proc_mem_tab]
629
           mov eax, [esi+ebx*4]
630
           and eax, 0xFFFFF000
631
           test eax, eax
632
           jz .exit
633
           stdcall map_page,edi,eax,dword PG_UW
634
635
 
636
           and edi, 0xFFFFF000
637
           mov ecx, [buf_size]
638
           add ecx, 4095
639
           shr ecx, 12
640
           inc ecx
641
642
 
643
           shr edx, 12
644
           and edx, 0x3FF
645
           mov esi, [proc_mem_tab]
646
647
 
648
;           and eax, 0xFFFFF000
649
;           test eax, eax
650
;           jz .exit
651
           stdcall map_page,edi,eax,dword PG_UW
652
           add edi, 0x1000
653
           inc edx
654
           dec ecx
655
           jnz .map
656
.exit:
657
           ret
658
endp
659
660
 
661
 
662
 
663
 
664
;input:
665
;  eax=1 - set ipc buffer area
666
;    ebx=address of buffer
667
;    ecx=size of buffer
668
;  eax=2 - send message
669
;    ebx=PID
670
;    ecx=address of message
671
;    edx=size of message
672
673
 
674
           jne @f
675
           call set_ipc_buff
676
           mov [esp+36], eax
677
           ret
678
@@:
679
           cmp eax, 2
680
           jne @f
681
           stdcall sys_ipc_send, ebx, ecx, edx
682
           mov [esp+36], eax
683
           ret
684
@@:
685
           xor eax, eax
686
           not eax
687
           mov [esp+36], eax
688
           ret
689
690
 
691
proc set_ipc_buff
692
693
 
694
           shl  eax,8
695
           add  eax, SLOT_BASE
380 serge 696
           pushf
164 serge 697
           cli
698
           mov  [eax+0xA0],ebx     ;set fields in extended information area
699
           mov  [eax+0xA4],ecx
700
701
 
702
           add ecx, ebx
703
           add ecx, 4095
704
           and ecx, not 4095
705
706
 
707
           add ebx, 0x1000
708
           cmp ebx, ecx
709
           jna .touch
710
711
 
712
           xor eax, eax
713
           ret
714
endp
715
716
 
717
           locals
718
             dst_slot   dd ?
719
             dst_offset dd ?
720
             buf_size   dd ?
721
           endl
722
723
 
724
           cli
725
726
 
727
           call pid_to_slot
728
           test eax,eax
729
           jz   .no_pid
730
731
 
732
           shl  eax,8
733
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
380 serge 734
           test edi,edi
164 serge 735
           jz   .no_ipc_area
736
737
 
738
           add edi, new_app_base
739
           and ebx, 0xFFF
740
           mov [dst_offset], ebx
741
742
 
380 serge 743
           mov [buf_size], esi
164 serge 744
745
 
380 serge 746
                             edi, esi
164 serge 747
748
 
749
           add edi, [ipc_tmp]
750
           cmp dword [edi], 0
751
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
752
227 serge 753
 
164 serge 754
           mov edx, ebx
755
           add ebx, 8
756
           add ebx, [msg_size]
757
           cmp ebx, [buf_size]
758
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
759
227 serge 760
 
164 serge 761
           mov eax,[TASK_BASE]
762
           mov eax, [eax+0x04]         ;eax - our PID
763
           mov edi, [dst_offset]
764
           add edi, [ipc_tmp]
765
           add edi, edx
766
           mov [edi], eax
767
           mov ecx, [msg_size]
768
769
 
770
           add edi, 8
771
           mov esi, [msg_addr]
772
           add esi, new_app_base
773
           cld
774
           rep movsb
775
776
 
777
           mov edx, ebx
778
           shr ebx, 12
779
           xor eax, eax
780
           mov [page_tabs+ebx*4], eax
365 serge 781
           invlpg [edx]
164 serge 782
783
 
784
           mov edx, ebx
785
           shr ebx, 12
786
           xor eax, eax
787
           mov [page_tabs+ebx*4], eax
365 serge 788
           invlpg [edx]
164 serge 789
790
 
791
           mov edx, ebx
792
           shr ebx, 12
793
           xor eax, eax
794
           mov [page_tabs+ebx*4], eax
365 serge 795
           invlpg [edx]
164 serge 796
797
 
798
           shl eax, 8
799
           or   [eax+SLOT_BASE+0xA8],dword 0x40
380 serge 800
           cmp  dword [check_idle_semaphore],20
164 serge 801
           jge  .ipc_no_cis
802
803
 
804
.ipc_no_cis:
805
           popf
806
           xor eax, eax
807
           ret
808
.no_pid:
809
           popf
810
           mov  eax, 4
811
           ret
812
.no_ipc_area:
813
           popf
814
           xor eax, eax
815
           inc eax
816
           ret
817
.ipc_blocked:
818
           popf
819
           mov  eax, 2
820
           ret
821
.buffer_overflow:
822
           popf
823
           mov  eax, 3
824
           ret
825
endp
826
827
 
828
sysfn_meminfo:
170 serge 829
164 serge 830
 
170 serge 831
           cmp ebx, new_app_base
172 serge 832
           jb .fail
833
834
 
164 serge 835
           mov [ebx], eax
170 serge 836
           shl eax, 12
172 serge 837
           mov [esp+36], eax
838
           mov ecx, [pg_data.pages_free]
170 serge 839
           mov [ebx+4], ecx
840
           mov edx, [pg_data.pages_faults]
841
           mov [ebx+8], edx
842
           mov esi, [heap_size]
843
           mov [ebx+12], esi
844
           mov edi, [heap_free]
845
           mov [ebx+16], edi
846
           mov eax, [heap_blocks]
847
           mov [ebx+20], eax
848
           mov ecx, [free_blocks]
849
           mov [ebx+24], ecx
850
           ret
164 serge 851
.fail:
172 serge 852
           mov dword [esp+36], -1
853
           ret
854
164 serge 855
 
856
new_services:
857
858
 
859
           jle  sys_sheduler
860
861
 
170 serge 862
           jb .fail
164 serge 863
           ja @f
864
865
 
188 serge 866
           mov [esp+36], eax
164 serge 867
           ret
868
@@:
869
           cmp eax, 12
870
           ja @f
871
872
 
873
           mov [esp+36], eax
874
           ret
875
@@:
876
           cmp eax, 13
877
           ja @f
878
           add ebx, new_app_base
188 serge 879
           stdcall user_free, ebx
164 serge 880
           mov [esp+36], eax
881
           ret
882
@@:
883
           cmp eax, 14
884
           ja @f
885
           add ebx, new_app_base
227 serge 886
           cmp ebx, new_app_base
172 serge 887
           jb .fail
888
           stdcall get_event_ex, ebx, ecx
227 serge 889
           mov [esp+36], eax
890
           ret
164 serge 891
@@:
892
           cmp eax, 15
893
           ja @f
894
           mov ecx, [CURRENT_TASK]
895
           shl ecx, 8
896
           mov eax, [ecx+SLOT_BASE+APPDATA.fpu_handler]
380 serge 897
           mov [ecx+SLOT_BASE+APPDATA.fpu_handler], ebx
898
           mov [esp+36], eax
164 serge 899
           ret
900
@@:
901
           cmp eax, 16
902
           ja @f
903
904
 
188 serge 905
           jz .fail
906
           add ebx, new_app_base
164 serge 907
           cmp ebx, new_app_base
172 serge 908
           jb .fail
909
           stdcall get_service, ebx
164 serge 910
           mov [esp+36], eax
911
           ret
912
@@:
913
           cmp eax, 17
914
           ja @f
915
           call srv_handlerEx   ;ebx
378 serge 916
           mov [esp+36], eax
164 serge 917
           ret
918
@@:
168 serge 919
           cmp eax, 18
920
           ja @f
921
           mov ecx, [CURRENT_TASK]
922
           shl ecx, 8
923
           mov eax, [ecx+SLOT_BASE+APPDATA.sse_handler]
380 serge 924
           mov [ecx+SLOT_BASE+APPDATA.sse_handler], ebx
925
           mov [esp+36], eax
168 serge 926
           ret
927
@@:
164 serge 928
           cmp eax, 19
198 serge 929
           ja .fail
227 serge 930
           add ebx, new_app_base
198 serge 931
           cmp ebx, new_app_base
932
           jb .fail
933
           stdcall load_library, ebx
934
           mov [esp+36], eax
935
           ret
936
227 serge 937
 
164 serge 938
           xor eax, eax
939
           mov [esp+36], eax
940
           ret
941
942
 
943
proc init_mtrr
944
945
 
388 serge 946
           je  .exit
164 serge 947
948
 
211 serge 949
           jnc .exit
950
951
 
164 serge 952
           or eax, 0x60000000   ;disable caching
953
           mov cr0, eax
954
           wbinvd               ;invalidate cache
955
956
 
957
           rdmsr                ;
958
           push eax
959
960
 
961
           xor eax, eax
962
           mov ecx, 0x2FF
963
           wrmsr                ;disable all MTRR
964
965
 
966
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
967
           xor edx, edx
968
           xor eax, eax
969
           mov ecx, 0x204
970
           mov ebx, 6
971
@@:
972
           wrmsr                ;disable unused MTRR
973
           inc ecx
974
           wrmsr
975
           inc ecx
976
           dec ebx
977
           jnz @b
978
979
 
980
981
 
982
           or eax, 0x800        ;set default memtype to UC
983
           and al, 0xF0
984
           mov ecx, 0x2FF
985
           wrmsr                ;and enable MTRR
986
987
 
988
           and eax, not 0x60000000
989
           mov cr0, eax         ; enable caching
990
.exit:
991
           ret
992
endp
993
994
 
995
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
996
997
 
998
           mov eax, [base]
999
           or eax, [mem_type]
1000
           mov ecx, [reg]
1001
           lea ecx, [0x200+ecx*2]
1002
           wrmsr
1003
1004
 
1005
           dec ebx
1006
           mov eax, 0xFFFFFFFF
1007
           mov edx, 0x0000000F
1008
           sub eax, ebx
1009
           sbb edx, 0
1010
           or eax, 0x800
1011
           inc ecx
1012
           wrmsr
1013
           ret
1014
endp
1015
1016
 
388 serge 1017
 
172 serge 1018
proc strncmp stdcall, str1:dword, str2:dword, count:dword
388 serge 1019
1020
 
1021
          jecxz .end
1022
1023
 
1024
1025
 
1026
          mov esi,edi
1027
          xor eax,eax
1028
          repne scasb
1029
          neg ecx             ; cx = count - strlen
1030
          add ecx,ebx         ; strlen + count - strlen
1031
1032
 
1033
          mov edi,esi
1034
          mov esi,[str2]
1035
          repe cmpsb
1036
          mov al,[esi-1]
1037
          xor ecx,ecx
1038
1039
 
1040
          ja .str2_big
1041
          je .end
1042
1043
 
1044
          sub ecx,2
1045
1046
 
1047
          not ecx
1048
.end:
1049
          mov eax,ecx
1050
          ret
1051
endp
1052
1053
 
1054
proc stall stdcall, delay:dword
172 serge 1055
           push ecx
1056
           push edx
1057
           push ebx
1058
           push eax
1059
1060
 
1061
           mul [stall_mcs]
1062
           mov ebx, eax       ;low
1063
           mov ecx, edx       ;high
1064
           rdtsc
1065
           add ebx, eax
1066
           adc ecx,edx
1067
@@:
1068
           rdtsc
1069
           sub eax, ebx
1070
           sbb edx, ecx
1071
           jb @B
1072
1073
 
1074
           pop ebx
1075
           pop edx
1076
           pop ecx
1077
           ret
1078
endp
1079
1080
 
164 serge 1081
k_strrchr:
237 serge 1082
        push eax
1083
        xor eax,eax
1084
        or  ecx,-1
1085
        repne scasb
1086
        add ecx,1
1087
        neg ecx
1088
        sub edi,1
1089
        pop eax
1090
        std
1091
        repne scasb
1092
        cld
1093
        add edi,1
1094
1095
 
1096
        jne @F
1097
        mov eax,edi
1098
        ret
1099
@@:
1100
        xor eax,eax
1101
        ret
1102
1103
 
1104
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1105
        mov eax, [dest]
1106
        mov esi, [src]
1107
        mov ecx, [maxlen]
1108
        test eax, eax
1109
        jz .L9
1110
        test esi, esi
1111
        jz .L9
1112
        test ecx, ecx
1113
        jz .L9
1114
1115
 
1116
        jmp .L1
1117
1118
 
1119
.L2:
1120
        mov edx, [esi+eax]
1121
        mov [eax], dl
1122
        test dl, dl
1123
        jz .L7
1124
1125
 
1126
        test dh, dh
1127
        jz .L6
1128
1129
 
1130
        mov [eax+2],dl
1131
        test dl, dl
1132
        jz .L5
1133
1134
 
1135
        test dh, dh
1136
        jz .L4
1137
        add eax, 4
1138
.L1:
1139
        sub ecx, 4
1140
        jae .L2
1141
1142
 
1143
        jz .L9
1144
1145
 
1146
        mov [eax], dl
1147
        test dl, dl
1148
        jz .L3
1149
1150
 
1151
        dec ecx
1152
        jz .L9
1153
1154
 
1155
        mov [eax], dl
1156
        test dl, dl
1157
        jz .L3
1158
1159
 
1160
        dec ecx
1161
        jz .L9
1162
1163
 
1164
        mov [eax], dl
1165
        test dl, dl
1166
        jz .L3
1167
1168
 
1169
        jmp .L9
1170
1171
 
1172
        inc eax
1173
1174
 
1175
        inc eax
1176
1177
 
1178
        inc eax
1179
.L7:
1180
        add ecx,3
1181
        jz .L9
1182
.L8:
1183
        mov byte [ecx+eax], 0
1184
.L3:
1185
        dec ecx
1186
        jnz .L8
1187
.L9:
1188
	ret
1189
endp
1190
1191
 
1192
1193
 
1194
1195
 
1196
        mov eax,[esp+4]
1197
        mov edx, 3
1198
1199
 
1200
        jz .L1
1201
        jp .L0
1202
1203
 
1204
        je .L2
1205
1206
 
1207
        cmp dh, byte [eax]
1208
1209
 
1210
1211
 
1212
        xor edx, 2
1213
1214
 
1215
.L0:
1216
        cmp dh, [eax]
1217
        je .L2
1218
1219
 
1220
        xor edx, edx
1221
1222
 
1223
        mov ecx, [eax]
1224
        add eax, 4
1225
1226
 
1227
        add ecx, magic
1228
1229
 
1230
        jnc .L3
1231
1232
 
1233
        and edx, not magic
1234
        jne .L3
1235
1236
 
1237
        add eax, 4
1238
1239
 
1240
        add ecx, magic
1241
        dec edx
1242
        jnc .L3
1243
1244
 
1245
        and edx, not magic
1246
        jne .L3
1247
1248
 
1249
        add eax, 4
1250
1251
 
1252
        add ecx, magic
1253
1254
 
1255
        jnc .L3
1256
1257
 
1258
1259
 
1260
        jne .L3
1261
1262
 
1263
        add eax, 4
1264
1265
 
1266
        add ecx, magic
1267
1268
 
1269
        jnc .L3
1270
1271
 
1272
1273
 
1274
        je .L1
1275
1276
 
1277
        sub ecx, magic
1278
1279
 
1280
        jz .L2
1281
1282
 
1283
        test ch, ch
1284
        jz .L2
1285
1286
 
1287
        inc eax
1288
1289
 
1290
        jz .L2
1291
1292
 
1293
1294
 
1295
        sub eax, [esp+4]
1296
	ret
1297
1298
 
1299
388 serge 1300
 
1301
     push eax
1302
     push edx
1303
     mov edx, 0x400   ;bocsh
1304
     mov al,0xff      ;bocsh
1305
     out dx, al       ;bocsh
1306
     pop edx
1307
     pop eax
1308
end if
1309