Subversion Repositories Kolibri OS

Rev

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