Subversion Repositories Kolibri OS

Rev

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