Subversion Repositories Kolibri OS

Rev

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