Subversion Repositories Kolibri OS

Rev

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