Subversion Repositories Kolibri OS

Rev

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