Subversion Repositories Kolibri OS

Rev

Rev 170 | Rev 188 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
164 serge 1
 
2
3
 
4
proc mem_test
5
           mov eax, cr0
6
           or eax, (CR0_CD+CR0_NW);disable caching
168 serge 7
           mov cr0, eax
164 serge 8
           wbinvd                 ;invalidate cache
168 serge 9
164 serge 10
 
11
           mov ebx, 'TEST'
12
@@:
13
           add edi, 0x400000
14
           xchg ebx, dword [edi]
15
           cmp dword [edi], 'TEST'
16
           xchg ebx, dword [edi]
17
           je @b
18
19
 
168 serge 20
           mov cr0, eax
164 serge 21
           mov eax, edi
22
           ret
23
endp
24
25
 
26
proc init_memEx
27
           xor eax, eax
28
           mov edi, sys_pgdir
29
           mov ecx, 2048
30
           rep stosd
31
32
 
33
           jnc .no_PSE
34
35
 
36
           or ebx, CR4_PSE
37
           mov eax, PG_LARGE+PG_SW
38
           bt [cpu_caps], CAPS_PGE
39
           jnc @F
40
           or eax, PG_GLOBAL
41
           or ebx, CR4_PGE
42
168 serge 43
 
164 serge 44
           mov cr4, ebx
168 serge 45
46
 
164 serge 47
           add eax, 0x00400000
48
           mov dword [sys_pgdir+4], eax
49
           add eax, 0x00400000
50
           mov dword [sys_pgdir+8], eax
51
           add eax, 0x00400000
52
           mov dword [sys_pgdir+12], eax
53
54
 
55
           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
56
57
 
58
           sub ecx, 4
59
           mov eax, tmp_page_tab+PG_SW
60
           mov edi, sys_pgdir+16
61
           mov esi, sys_master_tab+16
62
63
 
64
.no_PSE:
65
           mov eax, PG_SW
66
           mov esi, tmp_page_tab
67
           mov ecx, 4096/4      ;0x0 - 0x00FFFFFF
68
.map_low:
69
           mov [esi], eax
70
           add eax, 0x1000
71
           mov [esi+4], eax
72
           add eax, 0x1000
73
           mov [esi+8], eax
74
           add eax, 0x1000
75
           mov [esi+12], eax
76
           add eax, 0x1000
77
           add esi, 16
78
           dec ecx
79
           jnz .map_low            ;ядро
80
81
 
82
           mov eax, tmp_page_tab+PG_SW
83
           mov edi, sys_pgdir
84
           mov esi, sys_master_tab
85
86
 
87
88
 
89
           mov [esi], eax
90
           add eax, 0x1000
91
           add edi, 4
92
           add esi, 4
93
           dec ecx
94
           jnz .map_kernel_tabs
95
96
 
97
           bt [cpu_caps], CAPS_PSE
98
           jc @F
99
           add edi, 4096*4      ;skip low kernel memory
100
@@:
101
           mov ecx, [pg_data.kernel_tables]
102
           sub ecx, 4
103
           shl ecx, 10
104
           xor eax, eax
105
           cld
106
           rep stosd
107
108
 
109
           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
110
           ret
111
endp
112
113
 
114
proc init_page_map
115
           mov edi, sys_pgmap
116
           mov ecx, 512/4
117
           xor eax,eax
118
           cld
119
           rep stosd
120
121
 
122
           mov ecx, [pg_data.pagemap_size]
123
           sub ecx, 512
124
           shr ecx, 2
125
           rep stosd
126
127
 
128
           mov edx, [pg_data.pages_count]
129
           mov ecx, [pg_data.kernel_tables]
130
           bt [cpu_caps], CAPS_PSE
131
           jnc @f
132
           sub ecx, 4
133
@@:
134
           sub edx, 4096
135
           sub edx, ecx
136
           mov [pg_data.pages_free], edx
137
138
 
139
           mov ebx, ecx
140
           shr ecx, 5
141
           rep stosd
142
143
 
144
           mov ecx, ebx
145
           and ecx, 31
146
           shl eax, cl
147
           stosd
148
149
 
150
           mov ebx, sys_pgmap
151
           add ebx, [pg_data.pagemap_size]
152
           mov [page_end], ebx
153
154
 
155
156
 
157
endp
158
159
 
160
proc alloc_page
161
162
 
163
           cli
164
           mov ebx, [page_start]
165
           mov ecx, [page_end]
166
.l1:
167
           bsf eax,[ebx];
168
           jnz .found
169
           add ebx,4
170
           cmp ebx, ecx
171
           jb .l1
172
           popfd
173
           xor eax,eax
174
           ret
175
.found:
176
           btr [ebx], eax
177
           mov [page_start],ebx
178
           sub ebx, sys_pgmap
179
           shl ebx, 3
180
           add eax,ebx
181
           shl eax, 12
182
           dec [pg_data.pages_free]
183
           popfd
184
           ret
185
endp
186
187
 
188
proc alloc_pages stdcall, count:dword
189
           pushfd
190
           cli
191
           mov eax, [count]
192
           add eax, 7
193
           shr eax, 3
194
           mov [count], eax
195
           cmp eax, [pg_data.pages_free]
196
           ja .fail
197
198
 
199
           mov ebx, [page_end]
200
.find:
201
           mov edx, [count]
202
           mov edi, ecx
203
204
 
205
           cmp byte [ecx], 0xFF
206
           jne .next
207
           dec edx
208
           jz .ok
209
           inc ecx
210
           cmp ecx,ebx
211
           jb .match
212
.fail:     xor eax, eax
213
           popfd
214
           ret
215
.next:
216
           inc ecx
217
           cmp ecx, ebx
218
           jb .find
219
           popfd
220
           xor eax, eax
221
           ret
222
.ok:
223
           sub ecx, edi
224
           inc ecx
225
           mov esi, edi
226
           xor eax, eax
227
           rep stosb
228
           sub esi, sys_pgmap
229
           shl esi, 3+12
230
           mov eax, esi
231
           mov ebx, [count]
232
           shl ebx, 3
233
           sub [pg_data.pages_free], ebx
234
           popfd
235
           ret
236
endp
237
238
 
239
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
240
           mov eax, [phis_addr]
241
           and eax, not 0xFFF
242
           or eax, [flags]
243
           mov ebx, [lin_addr]
244
           shr ebx, 12
245
           mov [pages_tab+ebx*4], eax
246
           mov eax, [lin_addr]
247
           invlpg [eax]
248
           ret
249
endp
250
251
 
252
proc free_page
253
;arg:  eax  page address
254
           pushfd
255
           cli
256
           inc [pg_data.pages_free]
257
           shr eax, 12              ;page index
258
           mov ebx, sys_pgmap
259
           bts [ebx], eax           ;that's all!
260
           shr eax, 3
261
           and eax, not 3           ;dword offset from page_map
262
           add eax, ebx
263
           cmp [page_start], eax
264
           ja @f
265
           popfd
266
           ret
267
@@:
268
           mov [page_start], eax
269
           popfd
270
           ret
271
endp
272
273
 
274
proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword
275
           mov ebx, [lin_addr]
276
           shr ebx, 22
277
           mov eax, [phis_addr]
278
           and eax, not 0xFFF
279
           or eax, PG_UW          ;+PG_NOCACHE
280
           mov ecx, [page_dir]
281
           mov dword [ecx+ebx*4], eax
282
           mov dword [master_tab+ebx*4], eax
283
           mov eax, [lin_addr]
284
           shr eax, 10
285
           add eax, pages_tab
286
           invlpg [eax]
287
           ret
288
endp
289
290
 
291
proc init_LFB
292
293
 
294
           jne @f
295
296
 
297
           mov [LFBAddress], eax
298
           ret
299
@@:
300
           test [SCR_MODE],word 0100000000000000b
301
           jz @f
302
           call map_LFB
303
@@:
304
           ret
305
endp
306
307
 
308
proc map_LFB
309
           locals
310
             pg_count dd ?
311
           endl
312
313
 
314
           mov esi, [LFBAddress]
315
           shr edi, 12
316
           mov [pg_count], edi
317
           shr edi, 10
318
319
 
320
           jnc .map_page_tables
321
           mov ebx, esi
322
           or esi, PG_LARGE+PG_UW
323
           shr ebx, 20
324
           mov ecx, ebx
325
@@:
326
           mov [sys_pgdir+ebx], esi
327
           add ebx, 4
328
           add esi, 0x00400000
329
           dec edi
330
           jnz @B
331
332
 
333
           mov eax, cr3       ;flush TLB
334
           mov cr3, eax
335
           ret
336
337
 
338
339
 
340
           call alloc_page
341
           stdcall map_page_table,sys_pgdir, esi, eax
342
           add esi, 0x00400000
343
           dec edi
344
           jnz @B
345
346
 
347
           mov esi, eax
348
           shr esi, 10
349
           add esi, pages_tab
350
           or eax, PG_UW
351
           mov ecx, [pg_count]
352
           shr ecx, 2
353
.map:
354
           mov [esi], eax
355
           add eax, 0x1000
356
           mov [esi+4], eax
357
           add eax, 0x1000
358
           mov [esi+8], eax
359
           add eax, 0x1000
360
           mov [esi+12], eax
361
           add eax, 0x1000
362
           add esi, 16
363
           sub ecx, 1
364
           jnz .map
365
366
 
367
           mov cr3, eax
368
369
 
370
endp
371
372
 
373
proc new_mem_resize stdcall, new_size:dword
374
375
 
376
377
 
378
           add edi,4095
379
           and edi,not 4095
380
           mov [new_size], edi
381
382
 
383
           shl edx,8
384
           cmp [PROC_BASE+APPDATA.heap_base+edx],0
172 serge 385
           jne .exit
386
387
 
388
           add esi, 4095
164 serge 389
           and esi, not 4095
390
391
 
392
           jae .expand
393
394
 
395
           shr esi, 12
396
@@:
397
           mov eax, [pages_tab+0x00181000+edi*4]
398
           test eax, 1
399
           jz .next
400
           mov dword [pages_tab+0x00181000+edi*4], 2
401
           mov ebx, edi
402
           shl ebx, 12
403
           invlpg [ebx+std_application_base_address]
404
           call free_page
405
406
 
407
           cmp edi, esi
408
           jb @B
409
410
 
411
412
 
413
           mov    [PROC_BASE+0x8c+edx],ebx
414
415
 
416
;application memory size infomation
417
           mov    ecx,[PROC_BASE+0xb8+edx]
418
           mov    eax,2
419
420
 
421
;eax = current slot
422
;ebx = new memory size
423
;ecx = page directory
424
           cmp    eax,[TASK_COUNT]
425
           jg     .search_threads_end
426
           mov    edx,eax
427
           shl    edx,5
428
           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
429
           jz     .search_threads_next
430
           shl    edx,3
431
           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
432
           jnz    .search_threads_next
433
           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
434
.search_threads_next:
435
           inc    eax
436
           jmp    .search_threads
437
.search_threads_end:
438
           xor eax, eax
439
           dec [pg_data.pg_mutex]
440
           ret
441
442
 
443
           add edi, new_app_base
444
           add esi, new_app_base
445
446
 
447
           push edi
448
449
 
450
           and edi, not(0x3FFFFF)
451
           add esi, 0x3FFFFF
452
           and esi, not(0x3FFFFF)
453
454
 
455
           jae .grow
456
457
 
458
459
 
460
           stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE
461
462
 
463
           call alloc_page
464
           test eax, eax
465
           jz .exit
466
467
 
468
469
 
470
           shr edi, 10
471
           add edi, pages_tab
472
           mov ecx, 1024
473
           xor eax, eax
474
           cld
475
           rep stosd
476
           pop edi
477
478
 
479
           cmp edi, esi
480
           jb @B
481
482
 
483
.grow:
484
           pop edi
485
           pop esi
486
@@:
487
           call alloc_page
488
           test eax, eax
489
           jz .exit
490
           stdcall map_page,esi,eax,dword PG_UW
491
492
 
493
           mov edi, esi
494
           xor eax, eax
495
           mov ecx, 1024
496
           cld
497
           rep stosd
498
           pop edi
499
500
 
501
           cmp esi, edi
502
           jna @B
503
504
 
505
.exit:
506
           xor eax, eax
507
           inc eax
508
           dec [pg_data.pg_mutex]
509
           ret
510
endp
511
512
 
513
proc get_pg_addr stdcall, lin_addr:dword
514
           mov ebx, [lin_addr]
515
           shr ebx, 12
516
           mov eax, [pages_tab+ebx*4]
517
           and eax, 0xFFFFF000
518
           ret
519
endp
520
521
 
522
proc page_fault_handler
523
           pushad
524
525
 
526
           mov eax, cr2
527
           push eax
172 serge 528
           push ds
164 serge 529
530
 
531
           mov ds, ax
532
533
 
534
535
 
536
           jae .lfb_addr
537
538
 
539
           jae .user_space
540
541
 
542
           jae .tab_space
543
544
 
545
546
 
547
           inc [pg_data.pages_faults]
548
549
 
550
           mov ecx, ebx
172 serge 551
           shr ecx, 10
552
           mov edx, [master_tab+ecx*4]
553
           test edx, 1
554
           jz .fail
555
556
 
164 serge 557
           test eax, 2
558
           jz .fail
172 serge 559
164 serge 560
 
561
           and eax, eax
562
           jz .exit
563
564
 
565
566
 
567
           and esi, 0xFFFFF000
568
           mov ecx, 1024
569
           xor eax, eax
570
@@:
571
           mov [esi], eax
572
           add esi, 4
573
           dec ecx
574
           jnz @B
575
.exit:
576
           pop ds
577
           mov esp, ebp
578
           popad
579
           add esp, 4
580
           iretd
581
.fail:
172 serge 582
           pop ds
583
           mov esp, ebp
584
           popad
585
           add esp, 4
586
164 serge 587
 
172 serge 588
589
 
590
           jmp exc_c
591
           iretd
592
593
 
164 serge 594
           shr ebx, 12
595
           mov eax, [pages_tab+ebx*4]
596
           shr ebx, 10
597
           mov eax, [master_tab+ebx*4]
598
599
 
600
           mov esp, ebp
601
           popad
602
           add esp, 4
603
           iretd
604
605
 
606
           shr ebx, 12
607
;           mov eax, [pages_tab+ebx*4]
608
           shr ebx, 10
609
           mov eax, [master_tab+ebx*4]
610
611
 
612
           mov esp, ebp
613
           popad
614
           add esp, 4
615
           iretd
616
617
 
618
           shr ebx, 22
619
           ;mov ecx, [sys_page_dir]
620
           mov eax, [master_tab+ebx*4]
621
622
 
623
           mov esp, ebp
624
           popad
625
           add esp, 4
626
           iretd
627
628
 
629
           shr ebx, 12
630
;           mov eax, [pages_tab+ebx*4]
631
           shr ebx, 10
632
           ;mov ecx, [sys_page_dir]
633
           mov eax, [master_tab+ebx*4]
634
635
 
636
           mov esp, ebp
637
           popad
638
           add esp, 4
639
           iretd
640
endp
641
642
 
643
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
644
                      ofs:dword,buf_size:dword
645
           mov eax, [buf_size]
646
           test eax, eax
647
           jz .exit
648
649
 
650
           and eax, 0xFFFFF000
651
652
 
653
           mov ebx, [ofs]
654
           shr ebx, 22
655
           mov esi, [ipc_pdir]
656
           mov edi, [ipc_ptab]
657
           mov eax, [esi+ebx*4]
658
           and eax, 0xFFFFF000
659
           test eax, eax
660
           jz .exit
661
           stdcall map_page,edi,eax,dword PG_UW
662
;           inc ebx
663
;           add edi, 0x1000
664
;           mov eax, [esi+ebx*4]
665
;           test eax, eax
666
;           jz @f
667
;          and eax, 0xFFFFF000
668
;           stdcall map_page, edi, eax
669
670
 
671
           and edi, 0xFFFFF000
672
           mov ecx, [buf_size]
673
           add ecx, 4095
674
           shr ecx, 12
675
           inc ecx
676
677
 
678
           shr edx, 12
679
           and edx, 0x3FF
680
           mov esi, [ipc_ptab]
681
682
 
683
           and eax, 0xFFFFF000
684
           test eax, eax
685
           jz .exit
686
           stdcall map_page,edi,eax,dword PG_UW
687
           add edi, 0x1000
688
           inc edx
689
           dec ecx
690
           jnz .map
691
692
 
693
           ret
694
endp
695
696
 
697
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
698
                        ofs:dword,buf_size:dword
699
           mov eax, [buf_size]
700
           test eax, eax
701
           jz .exit
702
703
 
704
           and eax, 0xFFFFF000
705
706
 
707
           mov ebx, [ofs]
708
           shr ebx, 22
709
           mov esi, [proc_mem_pdir]
710
           mov edi, [proc_mem_tab]
711
           mov eax, [esi+ebx*4]
712
           and eax, 0xFFFFF000
713
           test eax, eax
714
           jz .exit
715
           stdcall map_page,edi,eax,dword PG_UW
716
717
 
718
           and edi, 0xFFFFF000
719
           mov ecx, [buf_size]
720
           add ecx, 4095
721
           shr ecx, 12
722
           inc ecx
723
724
 
725
           shr edx, 12
726
           and edx, 0x3FF
727
           mov esi, [proc_mem_tab]
728
729
 
730
;           and eax, 0xFFFFF000
731
;           test eax, eax
732
;           jz .exit
733
           stdcall map_page,edi,eax,dword PG_UW
734
           add edi, 0x1000
735
           inc edx
736
           dec ecx
737
           jnz .map
738
.exit:
739
           ret
740
endp
741
742
 
743
 
744
 
745
 
746
;input:
747
;  eax=1 - set ipc buffer area
748
;    ebx=address of buffer
749
;    ecx=size of buffer
750
;  eax=2 - send message
751
;    ebx=PID
752
;    ecx=address of message
753
;    edx=size of message
754
755
 
756
           jne @f
757
           call set_ipc_buff
758
           mov [esp+36], eax
759
           ret
760
761
 
762
           cmp eax, 2
763
           jne @f
764
           stdcall sys_ipc_send, ebx, ecx, edx
765
           mov [esp+36], eax
766
           ret
767
768
 
769
           xor eax, eax
770
           not eax
771
           mov [esp+36], eax
772
           ret
773
774
 
775
proc set_ipc_buff
776
777
 
778
           shl  eax,8
779
           add  eax, PROC_BASE
780
           pushf
781
           cli
782
           mov  [eax+0xA0],ebx     ;set fields in extended information area
783
           mov  [eax+0xA4],ecx
784
785
 
786
           add ecx, ebx
787
           add ecx, 4095
788
           and ecx, not 4095
789
790
 
791
           add ebx, 0x1000
792
           cmp ebx, ecx
793
           jna .touch
794
795
 
796
           xor eax, eax
797
           ret
798
endp
799
800
 
801
           locals
802
             dst_slot   dd ?
803
             dst_offset dd ?
804
             buf_size   dd ?
805
           endl
806
807
 
808
           cli
809
810
 
811
           call pid_to_slot
812
           test eax,eax
813
           jz   .no_pid
814
815
 
816
           shl  eax,8
817
           mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
818
           test edi,edi
819
           jz   .no_ipc_area
820
821
 
822
           add edi, new_app_base
823
           and ebx, 0xFFF
824
           mov [dst_offset], ebx
825
826
 
827
           mov [buf_size], esi
828
829
 
830
                             edi, esi
831
832
 
833
           add edi, [ipc_tmp]
834
           cmp dword [edi], 0
835
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
836
           mov ebx, dword [edi+4]
837
           mov edx, ebx
838
           add ebx, 8
839
           add ebx, [msg_size]
840
           cmp ebx, [buf_size]
841
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
842
           mov dword [edi+4], ebx
843
           mov eax,[TASK_BASE]
844
           mov eax, [eax+0x04]         ;eax - our PID
845
           mov edi, [dst_offset]
846
           add edi, [ipc_tmp]
847
           add edi, edx
848
           mov [edi], eax
849
           mov ecx, [msg_size]
850
851
 
852
           add edi, 8
853
           mov esi, [msg_addr]
854
           add esi, new_app_base
855
           cld
856
           rep movsb
857
858
 
859
           mov edx, ebx
860
           shr ebx, 12
861
           xor eax, eax
862
           mov [pages_tab+ebx*4], eax
863
           invlpg [edx]
864
865
 
866
           mov edx, ebx
867
           shr ebx, 12
868
           xor eax, eax
869
           mov [pages_tab+ebx*4], eax
870
           invlpg [edx]
871
872
 
873
           mov edx, ebx
874
           shr ebx, 12
875
           xor eax, eax
876
           mov [pages_tab+ebx*4], eax
877
           invlpg [edx]
878
879
 
880
           shl eax, 8
881
           or   [eax+PROC_BASE+0xA8],dword 0x40
882
           cmp  dword [check_idle_semaphore],20
883
           jge  .ipc_no_cis
884
885
 
886
.ipc_no_cis:
887
           popf
888
           xor eax, eax
889
           ret
890
.no_pid:
891
           popf
892
           mov  eax, 4
893
           ret
894
.no_ipc_area:
895
           popf
896
           xor eax, eax
897
           inc eax
898
           ret
899
.ipc_blocked:
900
           popf
901
           mov  eax, 2
902
           ret
903
.buffer_overflow:
904
           popf
905
           mov  eax, 3
906
           ret
907
endp
908
909
 
910
sysfn_meminfo:
170 serge 911
164 serge 912
 
170 serge 913
           cmp ebx, new_app_base
172 serge 914
           jb .fail
915
916
 
164 serge 917
           mov [ebx], eax
170 serge 918
           shl eax, 12
172 serge 919
           mov [esp+36], eax
920
           mov ecx, [pg_data.pages_free]
170 serge 921
           mov [ebx+4], ecx
922
           mov edx, [pg_data.pages_faults]
923
           mov [ebx+8], edx
924
           mov esi, [heap_size]
925
           mov [ebx+12], esi
926
           mov edi, [heap_free]
927
           mov [ebx+16], edi
928
           mov eax, [heap_blocks]
929
           mov [ebx+20], eax
930
           mov ecx, [free_blocks]
931
           mov [ebx+24], ecx
932
           ret
164 serge 933
.fail:
172 serge 934
           mov dword [esp+36], -1
935
           ret
936
164 serge 937
 
938
new_services:
939
940
 
941
           jle  sys_sheduler
942
943
 
170 serge 944
           jb .fail
164 serge 945
           ja @f
946
947
 
948
           mov [esp+36], eax
949
           ret
950
@@:
951
           cmp eax, 12
952
           ja @f
953
954
 
955
           mov [esp+36], eax
956
           ret
957
@@:
958
           cmp eax, 13
959
           ja @f
960
961
 
962
           mov [esp+36], eax
963
           ret
964
@@:
965
           cmp eax, 14
966
           ja @f
967
           add ebx,new_app_base
968
           cmp ebx, new_app_base
172 serge 969
           jb .fail
970
           stdcall get_notify, ebx
164 serge 971
           ret
972
@@:
973
           cmp eax, 15
974
           ja @f
975
           mov ecx, [CURRENT_TASK]
976
           shl ecx, 8
977
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
978
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
979
           mov [esp+36], eax
980
           ret
981
@@:
982
           cmp eax, 16
983
           ja @f
984
985
 
986
           cmp ebx, new_app_base
172 serge 987
           jb .fail
988
           stdcall get_service, ebx
164 serge 989
           mov [esp+36], eax
990
           ret
991
@@:
992
           cmp eax, 17
993
           ja @f
994
           stdcall srv_handlerEx, ebx
995
           mov [esp+36], eax
996
           ret
997
@@:
168 serge 998
           cmp eax, 18
999
           ja @f
1000
           mov ecx, [CURRENT_TASK]
1001
           shl ecx, 8
1002
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
1003
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
1004
           mov [esp+36], eax
1005
           ret
1006
164 serge 1007
 
1008
.fail:
1009
           xor eax, eax
1010
           mov [esp+36], eax
1011
           ret
1012
1013
 
1014
 
1015
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1016
1017
 
1018
          jecxz .end
1019
1020
 
1021
1022
 
1023
          mov esi,edi
1024
          xor eax,eax
1025
          repne scasb
1026
          neg ecx             ; cx = count - strlen
1027
          add ecx,ebx         ; strlen + count - strlen
1028
1029
 
1030
          mov edi,esi
1031
          mov esi,[str2]
1032
          repe cmpsb
1033
          mov al,[esi-1]
1034
          xor ecx,ecx
1035
1036
 
1037
          ja .str2_big
1038
          je .end
1039
1040
 
1041
          sub ecx,2
1042
1043
 
1044
          not ecx
1045
.end:
1046
          mov eax,ecx
1047
          ret
1048
endp
1049
1050
 
1051
proc fpu_save
1052
           clts
1053
           mov ebx, [fpu_owner]
1054
           shl ebx, 8
1055
           mov eax, [ebx+PROC_BASE+0x10]
1056
           mov ebx, [CURRENT_TASK]
1057
           mov [fpu_owner], ebx
1058
1059
 
1060
           jnc .no_SSE
1061
1062
 
1063
           ret
1064
.no_SSE:
1065
           fnsave [eax]
1066
           ret
1067
endp
1068
1069
 
1070
proc fpu_restore
1071
           mov ebx, [CURRENT_TASK]
1072
           shl ebx, 8
1073
           mov eax, [ebx+PROC_BASE+0x10]
1074
           bt [cpu_caps], CAPS_FXSR
1075
           jnc .no_SSE
1076
1077
 
1078
           ret
1079
.no_SSE:
1080
           frstor [eax]
1081
           ret
1082
endp
1083
1084
 
1085
proc test_cpu
1086
           locals
1087
              cpu_type   dd ?
166 serge 1088
              cpu_id     dd ?
1089
              cpu_Intel  dd ?
1090
              cpu_AMD    dd ?
1091
           endl
164 serge 1092
1093
 
1094
1095
 
1096
           pop eax
1097
           mov ecx, eax
1098
           xor eax, 0x40000
1099
           push eax
1100
           popfd
1101
           pushfd
1102
           pop eax
1103
           xor eax, ecx
1104
           mov [cpu_type], CPU_386
1105
           jz .end_cpu
1106
           push ecx
1107
           popfd
1108
1109
 
1110
           mov eax, ecx
1111
           xor eax, 0x200000
1112
           push eax
1113
           popfd
1114
           pushfd
1115
           pop eax
1116
           xor eax, ecx
1117
           je .end_cpu
1118
           mov [cpu_id], 1
1119
1120
 
1121
           cpuid
1122
           mov [cpu_vendor], ebx
1123
           mov [cpu_vendor+4], edx
1124
           mov [cpu_vendor+8], ecx
1125
           cmp ebx, dword [intel_str]
1126
           jne .check_AMD
1127
           cmp edx, dword [intel_str+4]
1128
           jne .check_AMD
1129
           cmp ecx, dword [intel_str+8]
1130
           jne .check_AMD
1131
           mov [cpu_Intel], 1
1132
           cmp eax, 1
1133
           jl .end_cpuid
1134
           mov eax, 1
1135
           cpuid
1136
           mov [cpu_sign], eax
1137
           mov [cpu_info],  ebx
1138
           mov [cpu_caps],  edx
1139
           mov [cpu_caps+4],ecx
1140
1141
 
1142
           and eax, 0x0f
1143
           mov [cpu_type], eax
1144
           ret
1145
1146
 
1147
           mov eax, [cpu_type]
1148
           ret
1149
1150
 
1151
           cmp ebx, dword [AMD_str]
1152
           jne .end_cpu
1153
           cmp edx, dword [AMD_str+4]
1154
           jne .end_cpu
1155
           cmp ecx, dword [AMD_str+8]
1156
           jne .end_cpu
1157
           mov [cpu_AMD], 1
1158
           cmp eax, 1
1159
           jl .end_cpuid
1160
           mov eax, 1
1161
           cpuid
1162
           mov [cpu_sign], eax
1163
           mov [cpu_info],  ebx
1164
           mov [cpu_caps],  edx
1165
           mov [cpu_caps+4],ecx
1166
           shr eax, 8
1167
           and eax, 0x0f
1168
           mov [cpu_type], eax
1169
.end_cpu:
1170
           mov eax, [cpu_type]
1171
           ret
1172
endp
1173
1174
 
1175
MEM_WC     equ 1               ;write combined memory
1176
MEM_UC     equ 0               ;uncached memory
1177
1178
 
1179
proc init_mtrr
1180
1181
 
1182
           je  .exit
1183
1184
 
1185
           or eax, 0x60000000   ;disable caching
1186
           mov cr0, eax
1187
           wbinvd               ;invalidate cache
1188
1189
 
1190
           rdmsr                ;
1191
           push eax
1192
1193
 
1194
           xor eax, eax
1195
           mov ecx, 0x2FF
1196
           wrmsr                ;disable all MTRR
1197
1198
 
1199
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1200
           xor edx, edx
1201
           xor eax, eax
1202
           mov ecx, 0x204
1203
           mov ebx, 6
1204
@@:
1205
           wrmsr                ;disable unused MTRR
1206
           inc ecx
1207
           wrmsr
1208
           inc ecx
1209
           dec ebx
1210
           jnz @b
1211
1212
 
1213
1214
 
1215
           or eax, 0x800        ;set default memtype to UC
1216
           and al, 0xF0
1217
           mov ecx, 0x2FF
1218
           wrmsr                ;and enable MTRR
1219
1220
 
1221
           and eax, not 0x60000000
1222
           mov cr0, eax         ; enable caching
1223
.exit:
1224
           ret
1225
endp
1226
1227
 
1228
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1229
1230
 
1231
           mov eax, [base]
1232
           or eax, [mem_type]
1233
           mov ecx, [reg]
1234
           lea ecx, [0x200+ecx*2]
1235
           wrmsr
1236
1237
 
1238
           dec ebx
1239
           mov eax, 0xFFFFFFFF
1240
           mov edx, 0x0000000F
1241
           sub eax, ebx
1242
           sbb edx, 0
1243
           or eax, 0x800
1244
           inc ecx
1245
           wrmsr
1246
           ret
1247
endp
1248
1249
 
172 serge 1250
proc stall stdcall, delay:dword
1251
           push ecx
1252
           push edx
1253
           push ebx
1254
           push eax
1255
1256
 
1257
           mul [stall_mcs]
1258
           mov ebx, eax       ;low
1259
           mov ecx, edx       ;high
1260
           rdtsc
1261
           add ebx, eax
1262
           adc ecx,edx
1263
@@:
1264
           rdtsc
1265
           sub eax, ebx
1266
           sbb edx, ecx
1267
           jb @B
1268
1269
 
1270
           pop ebx
1271
           pop edx
1272
           pop ecx
1273
           ret
1274
endp
1275
1276
 
164 serge 1277
align 4
1278
  intel_str    db "GenuineIntel",0
1279
  AMD_str      db "AuthenticAMD",0
1280
endg
1281
1282
 
1283
align 16
1284
  irq_tab           rd 16
1285
1286
 
1287
 
1288
1289
 
1290
  ipc_pdir          rd 1
1291
  ipc_ptab          rd 1
1292
1293
 
1294
  proc_mem_pdir     rd 1
1295
  proc_mem_tab      rd 1
1296
1297
 
1298
  tmp_task_ptab     rd 1
1299
  tmp_task_data     rd 1
1300
1301
 
1302
1303
 
1304
  fdd_buff          rd 1
1305
1306
 
172 serge 1307
;;CPUID information
164 serge 1308
1309
 
1310
  cpu_sign          rd 1
1311
  cpu_info          rd 1
1312
1313
 
1314
1315
 
1316
align 16
1317
   dll_tab         rb 32*32
1318
   srv_tab         rb 32*32
1319
   dll_map         rd 1
1320
   srv_map         rd 1
1321
1322
 
1323
   mem_block_list  rd 64
1324
   mem_block_map   rb 512
1325
   mem_block_arr   rd 1
1326
   mem_block_start rd 1
1327
   mem_block_end   rd 1
1328
   mem_block_mask  rd 2
1329
   heap_size       rd 1
170 serge 1330
   heap_free       rd 1
1331
   heap_blocks     rd 1
1332
   free_blocks     rd 1
1333
164 serge 1334
 
1335
   page_end        rd 1
1336
   sys_page_map    rd 1
1337
;   app_load        rd 1
170 serge 1338
endg
164 serge 1339
1340
 
1341
 
1342
;     push edx
1343
;     mov edx, 0x400   ;bocsh
1344
;     mov al,0xff      ;bocsh
1345
;     out dx, al       ;bocsh
1346
;     pop edx
1347
;     pop eax
1348