Subversion Repositories Kolibri OS

Rev

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