Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
164 serge 1
 
2
3
 
4
proc mem_test
5
           mov eax, cr0
6
           or eax, (CR0_CD+CR0_NW);disable caching
168 serge 7
           mov cr0, eax
164 serge 8
           wbinvd                 ;invalidate cache
168 serge 9
164 serge 10
 
11
           mov ebx, 'TEST'
12
@@:
13
           add edi, 0x400000
14
           xchg ebx, dword [edi]
15
           cmp dword [edi], 'TEST'
16
           xchg ebx, dword [edi]
17
           je @b
18
19
 
168 serge 20
           mov cr0, eax
164 serge 21
           mov eax, edi
22
           ret
23
endp
24
25
 
26
proc init_memEx
27
           xor eax, eax
28
           mov edi, sys_pgdir
29
           mov ecx, 2048
30
           rep stosd
31
32
 
33
           jnc .no_PSE
34
35
 
36
           or ebx, CR4_PSE
37
           mov eax, PG_LARGE+PG_SW
38
           bt [cpu_caps], CAPS_PGE
39
           jnc @F
40
           or eax, PG_GLOBAL
41
           or ebx, CR4_PGE
42
168 serge 43
 
164 serge 44
           mov cr4, ebx
168 serge 45
46
 
164 serge 47
           add eax, 0x00400000
48
           mov dword [sys_pgdir+4], eax
49
           add eax, 0x00400000
50
           mov dword [sys_pgdir+8], eax
51
           add eax, 0x00400000
52
           mov dword [sys_pgdir+12], eax
53
54
 
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
           cmp eax, 19
198 serge 976
           ja @f
977
           add ebx, new_app_base
978
           cmp ebx, new_app_base
979
           jb .fail
980
           stdcall load_library, ebx
981
           mov [esp+36], eax
982
           ret
983
@@:
984
.fail:
164 serge 985
           xor eax, eax
986
           mov [esp+36], eax
987
           ret
988
989
 
990
proc strncmp stdcall, str1:dword, str2:dword, count:dword
991
992
 
993
          jecxz .end
994
995
 
996
997
 
998
          mov esi,edi
999
          xor eax,eax
1000
          repne scasb
1001
          neg ecx             ; cx = count - strlen
1002
          add ecx,ebx         ; strlen + count - strlen
1003
1004
 
1005
          mov edi,esi
1006
          mov esi,[str2]
1007
          repe cmpsb
1008
          mov al,[esi-1]
1009
          xor ecx,ecx
1010
1011
 
1012
          ja .str2_big
1013
          je .end
1014
1015
 
1016
          sub ecx,2
1017
1018
 
1019
          not ecx
1020
.end:
1021
          mov eax,ecx
1022
          ret
1023
endp
1024
1025
 
1026
proc fpu_save
1027
           clts
1028
           mov ebx, [fpu_owner]
1029
           shl ebx, 8
1030
           mov eax, [ebx+PROC_BASE+0x10]
1031
           mov ebx, [CURRENT_TASK]
1032
           mov [fpu_owner], ebx
1033
1034
 
1035
           jnc .no_SSE
1036
1037
 
1038
           ret
1039
.no_SSE:
1040
           fnsave [eax]
1041
           ret
1042
endp
1043
1044
 
1045
proc fpu_restore
1046
           mov ebx, [CURRENT_TASK]
1047
           shl ebx, 8
1048
           mov eax, [ebx+PROC_BASE+0x10]
1049
           bt [cpu_caps], CAPS_FXSR
1050
           jnc .no_SSE
1051
1052
 
1053
           ret
1054
.no_SSE:
1055
           frstor [eax]
1056
           ret
1057
endp
1058
1059
 
1060
proc test_cpu
1061
           locals
1062
              cpu_type   dd ?
166 serge 1063
              cpu_id     dd ?
1064
              cpu_Intel  dd ?
1065
              cpu_AMD    dd ?
1066
           endl
164 serge 1067
1068
 
1069
1070
 
1071
           pop eax
1072
           mov ecx, eax
1073
           xor eax, 0x40000
1074
           push eax
1075
           popfd
1076
           pushfd
1077
           pop eax
1078
           xor eax, ecx
1079
           mov [cpu_type], CPU_386
1080
           jz .end_cpu
1081
           push ecx
1082
           popfd
1083
1084
 
1085
           mov eax, ecx
1086
           xor eax, 0x200000
1087
           push eax
1088
           popfd
1089
           pushfd
1090
           pop eax
1091
           xor eax, ecx
1092
           je .end_cpu
1093
           mov [cpu_id], 1
1094
1095
 
1096
           cpuid
1097
           mov [cpu_vendor], ebx
1098
           mov [cpu_vendor+4], edx
1099
           mov [cpu_vendor+8], ecx
1100
           cmp ebx, dword [intel_str]
1101
           jne .check_AMD
1102
           cmp edx, dword [intel_str+4]
1103
           jne .check_AMD
1104
           cmp ecx, dword [intel_str+8]
1105
           jne .check_AMD
1106
           mov [cpu_Intel], 1
1107
           cmp eax, 1
1108
           jl .end_cpuid
1109
           mov eax, 1
1110
           cpuid
1111
           mov [cpu_sign], eax
1112
           mov [cpu_info],  ebx
1113
           mov [cpu_caps],  edx
1114
           mov [cpu_caps+4],ecx
1115
1116
 
1117
           and eax, 0x0f
1118
           mov [cpu_type], eax
1119
           ret
1120
1121
 
1122
           mov eax, [cpu_type]
1123
           ret
1124
1125
 
1126
           cmp ebx, dword [AMD_str]
1127
           jne .end_cpu
1128
           cmp edx, dword [AMD_str+4]
1129
           jne .end_cpu
1130
           cmp ecx, dword [AMD_str+8]
1131
           jne .end_cpu
1132
           mov [cpu_AMD], 1
1133
           cmp eax, 1
1134
           jl .end_cpuid
1135
           mov eax, 1
1136
           cpuid
1137
           mov [cpu_sign], eax
1138
           mov [cpu_info],  ebx
1139
           mov [cpu_caps],  edx
1140
           mov [cpu_caps+4],ecx
1141
           shr eax, 8
1142
           and eax, 0x0f
1143
           mov [cpu_type], eax
1144
.end_cpu:
1145
           mov eax, [cpu_type]
1146
           ret
1147
endp
1148
1149
 
1150
MEM_WC     equ 1               ;write combined memory
1151
MEM_UC     equ 0               ;uncached memory
1152
1153
 
1154
proc init_mtrr
1155
1156
 
1157
           je  .exit
1158
1159
 
1160
           or eax, 0x60000000   ;disable caching
1161
           mov cr0, eax
1162
           wbinvd               ;invalidate cache
1163
1164
 
1165
           rdmsr                ;
1166
           push eax
1167
1168
 
1169
           xor eax, eax
1170
           mov ecx, 0x2FF
1171
           wrmsr                ;disable all MTRR
1172
1173
 
1174
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1175
           xor edx, edx
1176
           xor eax, eax
1177
           mov ecx, 0x204
1178
           mov ebx, 6
1179
@@:
1180
           wrmsr                ;disable unused MTRR
1181
           inc ecx
1182
           wrmsr
1183
           inc ecx
1184
           dec ebx
1185
           jnz @b
1186
1187
 
1188
1189
 
1190
           or eax, 0x800        ;set default memtype to UC
1191
           and al, 0xF0
1192
           mov ecx, 0x2FF
1193
           wrmsr                ;and enable MTRR
1194
1195
 
1196
           and eax, not 0x60000000
1197
           mov cr0, eax         ; enable caching
1198
.exit:
1199
           ret
1200
endp
1201
1202
 
1203
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1204
1205
 
1206
           mov eax, [base]
1207
           or eax, [mem_type]
1208
           mov ecx, [reg]
1209
           lea ecx, [0x200+ecx*2]
1210
           wrmsr
1211
1212
 
1213
           dec ebx
1214
           mov eax, 0xFFFFFFFF
1215
           mov edx, 0x0000000F
1216
           sub eax, ebx
1217
           sbb edx, 0
1218
           or eax, 0x800
1219
           inc ecx
1220
           wrmsr
1221
           ret
1222
endp
1223
1224
 
172 serge 1225
proc stall stdcall, delay:dword
1226
           push ecx
1227
           push edx
1228
           push ebx
1229
           push eax
1230
1231
 
1232
           mul [stall_mcs]
1233
           mov ebx, eax       ;low
1234
           mov ecx, edx       ;high
1235
           rdtsc
1236
           add ebx, eax
1237
           adc ecx,edx
1238
@@:
1239
           rdtsc
1240
           sub eax, ebx
1241
           sbb edx, ecx
1242
           jb @B
1243
1244
 
1245
           pop ebx
1246
           pop edx
1247
           pop ecx
1248
           ret
1249
endp
1250
1251
 
164 serge 1252
align 4
1253
  intel_str    db "GenuineIntel",0
1254
  AMD_str      db "AuthenticAMD",0
1255
endg
1256
1257
 
1258
align 16
1259
  irq_tab           rd 16
1260
1261
 
1262
 
1263
1264
 
1265
  ipc_pdir          rd 1
1266
  ipc_ptab          rd 1
1267
1268
 
1269
  proc_mem_pdir     rd 1
1270
  proc_mem_tab      rd 1
1271
1272
 
1273
  tmp_task_ptab     rd 1
1274
  tmp_task_data     rd 1
1275
1276
 
188 serge 1277
164 serge 1278
 
1279
  fdd_buff          rd 1
1280
1281
 
172 serge 1282
;;CPUID information
164 serge 1283
1284
 
1285
  cpu_sign          rd 1
1286
  cpu_info          rd 1
1287
1288
 
1289
1290
 
1291
align 16
1292
   dll_tab         rb 32*32
1293
   srv_tab         rb 32*32
1294
   dll_map         rd 1
1295
   srv_map         rd 1
1296
1297
 
1298
   mem_block_list  rd 64
1299
   mem_block_map   rb 512
1300
   mem_block_arr   rd 1
1301
   mem_block_start rd 1
1302
   mem_block_end   rd 1
1303
   mem_block_mask  rd 2
1304
   heap_size       rd 1
170 serge 1305
   heap_free       rd 1
1306
   heap_blocks     rd 1
1307
   free_blocks     rd 1
1308
164 serge 1309
 
1310
   page_end        rd 1
1311
   sys_page_map    rd 1
1312
;   app_load        rd 1
170 serge 1313
endg
164 serge 1314
1315
 
1316
 
1317
;     push edx
1318
;     mov edx, 0x400   ;bocsh
1319
;     mov al,0xff      ;bocsh
1320
;     out dx, al       ;bocsh
1321
;     pop edx
1322
;     pop eax
1323