Subversion Repositories Kolibri OS

Rev

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