Subversion Repositories Kolibri OS

Rev

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

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