Subversion Repositories Kolibri OS

Rev

Rev 201 | Rev 207 | 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
           fninit            ;re-init fpu
203 serge 1041
           ret
164 serge 1042
.no_SSE:
1043
           fnsave [eax]
1044
           ret
1045
endp
1046
1047
 
1048
proc fpu_restore
1049
           mov ebx, [CURRENT_TASK]
1050
           shl ebx, 8
1051
           mov eax, [ebx+PROC_BASE+0x10]
1052
           bt [cpu_caps], CAPS_FXSR
1053
           jnc .no_SSE
1054
1055
 
1056
           ret
1057
.no_SSE:
1058
           fnclex               ;fix possible problems
203 serge 1059
           frstor [eax]
164 serge 1060
           ret
1061
endp
1062
1063
 
1064
proc test_cpu
1065
           locals
1066
              cpu_type   dd ?
166 serge 1067
              cpu_id     dd ?
1068
              cpu_Intel  dd ?
1069
              cpu_AMD    dd ?
1070
           endl
164 serge 1071
1072
 
1073
1074
 
1075
           pop eax
1076
           mov ecx, eax
1077
           xor eax, 0x40000
1078
           push eax
1079
           popfd
1080
           pushfd
1081
           pop eax
1082
           xor eax, ecx
1083
           mov [cpu_type], CPU_386
1084
           jz .end_cpu
1085
           push ecx
1086
           popfd
1087
1088
 
1089
           mov eax, ecx
1090
           xor eax, 0x200000
1091
           push eax
1092
           popfd
1093
           pushfd
1094
           pop eax
1095
           xor eax, ecx
1096
           je .end_cpu
1097
           mov [cpu_id], 1
1098
1099
 
1100
           cpuid
1101
           mov [cpu_vendor], ebx
1102
           mov [cpu_vendor+4], edx
1103
           mov [cpu_vendor+8], ecx
1104
           cmp ebx, dword [intel_str]
1105
           jne .check_AMD
1106
           cmp edx, dword [intel_str+4]
1107
           jne .check_AMD
1108
           cmp ecx, dword [intel_str+8]
1109
           jne .check_AMD
1110
           mov [cpu_Intel], 1
1111
           cmp eax, 1
1112
           jl .end_cpuid
1113
           mov eax, 1
1114
           cpuid
1115
           mov [cpu_sign], eax
1116
           mov [cpu_info],  ebx
1117
           mov [cpu_caps],  edx
1118
           mov [cpu_caps+4],ecx
1119
1120
 
1121
           and eax, 0x0f
1122
           mov [cpu_type], eax
1123
           ret
1124
1125
 
1126
           mov eax, [cpu_type]
1127
           ret
1128
1129
 
1130
           cmp ebx, dword [AMD_str]
1131
           jne .end_cpu
1132
           cmp edx, dword [AMD_str+4]
1133
           jne .end_cpu
1134
           cmp ecx, dword [AMD_str+8]
1135
           jne .end_cpu
1136
           mov [cpu_AMD], 1
1137
           cmp eax, 1
1138
           jl .end_cpuid
1139
           mov eax, 1
1140
           cpuid
1141
           mov [cpu_sign], eax
1142
           mov [cpu_info],  ebx
1143
           mov [cpu_caps],  edx
1144
           mov [cpu_caps+4],ecx
1145
           shr eax, 8
1146
           and eax, 0x0f
1147
           mov [cpu_type], eax
1148
.end_cpu:
1149
           mov eax, [cpu_type]
1150
           ret
1151
endp
1152
1153
 
1154
MEM_WC     equ 1               ;write combined memory
1155
MEM_UC     equ 0               ;uncached memory
1156
1157
 
1158
proc init_mtrr
1159
1160
 
1161
           je  .exit
1162
1163
 
1164
           or eax, 0x60000000   ;disable caching
1165
           mov cr0, eax
1166
           wbinvd               ;invalidate cache
1167
1168
 
1169
           rdmsr                ;
1170
           push eax
1171
1172
 
1173
           xor eax, eax
1174
           mov ecx, 0x2FF
1175
           wrmsr                ;disable all MTRR
1176
1177
 
1178
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1179
           xor edx, edx
1180
           xor eax, eax
1181
           mov ecx, 0x204
1182
           mov ebx, 6
1183
@@:
1184
           wrmsr                ;disable unused MTRR
1185
           inc ecx
1186
           wrmsr
1187
           inc ecx
1188
           dec ebx
1189
           jnz @b
1190
1191
 
1192
1193
 
1194
           or eax, 0x800        ;set default memtype to UC
1195
           and al, 0xF0
1196
           mov ecx, 0x2FF
1197
           wrmsr                ;and enable MTRR
1198
1199
 
1200
           and eax, not 0x60000000
1201
           mov cr0, eax         ; enable caching
1202
.exit:
1203
           ret
1204
endp
1205
1206
 
1207
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1208
1209
 
1210
           mov eax, [base]
1211
           or eax, [mem_type]
1212
           mov ecx, [reg]
1213
           lea ecx, [0x200+ecx*2]
1214
           wrmsr
1215
1216
 
1217
           dec ebx
1218
           mov eax, 0xFFFFFFFF
1219
           mov edx, 0x0000000F
1220
           sub eax, ebx
1221
           sbb edx, 0
1222
           or eax, 0x800
1223
           inc ecx
1224
           wrmsr
1225
           ret
1226
endp
1227
1228
 
172 serge 1229
proc stall stdcall, delay:dword
1230
           push ecx
1231
           push edx
1232
           push ebx
1233
           push eax
1234
1235
 
1236
           mul [stall_mcs]
1237
           mov ebx, eax       ;low
1238
           mov ecx, edx       ;high
1239
           rdtsc
1240
           add ebx, eax
1241
           adc ecx,edx
1242
@@:
1243
           rdtsc
1244
           sub eax, ebx
1245
           sbb edx, ecx
1246
           jb @B
1247
1248
 
1249
           pop ebx
1250
           pop edx
1251
           pop ecx
1252
           ret
1253
endp
1254
1255
 
164 serge 1256
align 4
1257
  intel_str    db "GenuineIntel",0
1258
  AMD_str      db "AuthenticAMD",0
1259
endg
1260
1261
 
1262
align 16
1263
  irq_tab           rd 16
1264
1265
 
1266
 
1267
1268
 
1269
  ipc_pdir          rd 1
1270
  ipc_ptab          rd 1
1271
1272
 
1273
  proc_mem_pdir     rd 1
1274
  proc_mem_tab      rd 1
1275
1276
 
1277
  tmp_task_ptab     rd 1
1278
  tmp_task_data     rd 1
1279
1280
 
188 serge 1281
164 serge 1282
 
1283
  fdd_buff          rd 1
1284
1285
 
172 serge 1286
;;CPUID information
164 serge 1287
1288
 
1289
  cpu_sign          rd 1
1290
  cpu_info          rd 1
1291
1292
 
1293
1294
 
1295
align 16
1296
   dll_tab         rb 32*32
1297
   srv_tab         rb 32*32
1298
   dll_map         rd 1
1299
   srv_map         rd 1
1300
1301
 
1302
   mem_block_list  rd 64
1303
   mem_block_map   rb 512
1304
   mem_block_arr   rd 1
1305
   mem_block_start rd 1
1306
   mem_block_end   rd 1
1307
   mem_block_mask  rd 2
1308
   heap_size       rd 1
170 serge 1309
   heap_free       rd 1
1310
   heap_blocks     rd 1
1311
   free_blocks     rd 1
1312
164 serge 1313
 
1314
   page_end        rd 1
1315
   sys_page_map    rd 1
1316
;   app_load        rd 1
170 serge 1317
endg
164 serge 1318
1319
 
1320
 
1321
;     push edx
1322
;     mov edx, 0x400   ;bocsh
1323
;     mov al,0xff      ;bocsh
1324
;     out dx, al       ;bocsh
1325
;     pop edx
1326
;     pop eax
1327