Subversion Repositories Kolibri OS

Rev

Rev 221 | Rev 233 | 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
227 serge 809
 
164 serge 810
           mov edx, ebx
811
           add ebx, 8
812
           add ebx, [msg_size]
813
           cmp ebx, [buf_size]
814
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
815
227 serge 816
 
164 serge 817
           mov eax,[TASK_BASE]
818
           mov eax, [eax+0x04]         ;eax - our PID
819
           mov edi, [dst_offset]
820
           add edi, [ipc_tmp]
821
           add edi, edx
822
           mov [edi], eax
823
           mov ecx, [msg_size]
824
825
 
826
           add edi, 8
827
           mov esi, [msg_addr]
828
           add esi, new_app_base
829
           cld
830
           rep movsb
831
832
 
833
           mov edx, ebx
834
           shr ebx, 12
835
           xor eax, eax
836
           mov [pages_tab+ebx*4], eax
837
           invlpg [edx]
838
839
 
840
           mov edx, ebx
841
           shr ebx, 12
842
           xor eax, eax
843
           mov [pages_tab+ebx*4], eax
844
           invlpg [edx]
845
846
 
847
           mov edx, ebx
848
           shr ebx, 12
849
           xor eax, eax
850
           mov [pages_tab+ebx*4], eax
851
           invlpg [edx]
852
853
 
854
           shl eax, 8
855
           or   [eax+PROC_BASE+0xA8],dword 0x40
856
           cmp  dword [check_idle_semaphore],20
857
           jge  .ipc_no_cis
858
859
 
860
.ipc_no_cis:
861
           popf
862
           xor eax, eax
863
           ret
864
.no_pid:
865
           popf
866
           mov  eax, 4
867
           ret
868
.no_ipc_area:
869
           popf
870
           xor eax, eax
871
           inc eax
872
           ret
873
.ipc_blocked:
874
           popf
875
           mov  eax, 2
876
           ret
877
.buffer_overflow:
878
           popf
879
           mov  eax, 3
880
           ret
881
endp
882
883
 
884
sysfn_meminfo:
170 serge 885
164 serge 886
 
170 serge 887
           cmp ebx, new_app_base
172 serge 888
           jb .fail
889
890
 
164 serge 891
           mov [ebx], eax
170 serge 892
           shl eax, 12
172 serge 893
           mov [esp+36], eax
894
           mov ecx, [pg_data.pages_free]
170 serge 895
           mov [ebx+4], ecx
896
           mov edx, [pg_data.pages_faults]
897
           mov [ebx+8], edx
898
           mov esi, [heap_size]
899
           mov [ebx+12], esi
900
           mov edi, [heap_free]
901
           mov [ebx+16], edi
902
           mov eax, [heap_blocks]
903
           mov [ebx+20], eax
904
           mov ecx, [free_blocks]
905
           mov [ebx+24], ecx
906
           ret
164 serge 907
.fail:
172 serge 908
           mov dword [esp+36], -1
909
           ret
910
164 serge 911
 
912
new_services:
913
914
 
915
           jle  sys_sheduler
916
917
 
170 serge 918
           jb .fail
164 serge 919
           ja @f
920
921
 
188 serge 922
           mov [esp+36], eax
164 serge 923
           ret
924
@@:
925
           cmp eax, 12
926
           ja @f
927
928
 
929
           mov [esp+36], eax
930
           ret
931
@@:
932
           cmp eax, 13
933
           ja @f
934
           add ebx, new_app_base
188 serge 935
           stdcall user_free, ebx
164 serge 936
           mov [esp+36], eax
937
           ret
938
@@:
939
           cmp eax, 14
940
           ja @f
941
           add ebx, new_app_base
227 serge 942
           cmp ebx, new_app_base
172 serge 943
           jb .fail
944
           stdcall get_event_ex, ebx, ecx
227 serge 945
           mov [esp+36], eax
946
           ret
164 serge 947
@@:
948
           cmp eax, 15
949
           ja @f
950
           mov ecx, [CURRENT_TASK]
951
           shl ecx, 8
952
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
953
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
954
           mov [esp+36], eax
955
           ret
956
@@:
957
           cmp eax, 16
958
           ja @f
959
960
 
188 serge 961
           jz .fail
962
           add ebx, new_app_base
164 serge 963
           cmp ebx, new_app_base
172 serge 964
           jb .fail
965
           stdcall get_service, ebx
164 serge 966
           mov [esp+36], eax
967
           ret
968
@@:
969
           cmp eax, 17
970
           ja @f
971
           stdcall srv_handlerEx, ebx
972
           mov [esp+36], eax
973
           ret
974
@@:
168 serge 975
           cmp eax, 18
976
           ja @f
977
           mov ecx, [CURRENT_TASK]
978
           shl ecx, 8
979
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
980
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
981
           mov [esp+36], eax
982
           ret
983
@@:
164 serge 984
           cmp eax, 19
198 serge 985
           ja .fail
227 serge 986
           add ebx, new_app_base
198 serge 987
           cmp ebx, new_app_base
988
           jb .fail
989
           stdcall load_library, ebx
990
           mov [esp+36], eax
991
           ret
992
227 serge 993
 
164 serge 994
           xor eax, eax
995
           mov [esp+36], eax
996
           ret
997
998
 
999
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1000
1001
 
1002
          jecxz .end
1003
1004
 
1005
1006
 
1007
          mov esi,edi
1008
          xor eax,eax
1009
          repne scasb
1010
          neg ecx             ; cx = count - strlen
1011
          add ecx,ebx         ; strlen + count - strlen
1012
1013
 
1014
          mov edi,esi
1015
          mov esi,[str2]
1016
          repe cmpsb
1017
          mov al,[esi-1]
1018
          xor ecx,ecx
1019
1020
 
1021
          ja .str2_big
1022
          je .end
1023
1024
 
1025
          sub ecx,2
1026
1027
 
1028
          not ecx
1029
.end:
1030
          mov eax,ecx
1031
          ret
1032
endp
1033
1034
 
1035
proc test_cpu
1036
           locals
1037
              cpu_type   dd ?
166 serge 1038
              cpu_id     dd ?
1039
              cpu_Intel  dd ?
1040
              cpu_AMD    dd ?
1041
           endl
164 serge 1042
1043
 
1044
           xor eax, eax
211 serge 1045
           mov [cpu_caps], eax
1046
           mov [cpu_caps+4], eax
1047
164 serge 1048
 
1049
           pop eax
1050
           mov ecx, eax
1051
           xor eax, 0x40000
1052
           push eax
1053
           popfd
1054
           pushfd
1055
           pop eax
1056
           xor eax, ecx
1057
           mov [cpu_type], CPU_386
1058
           jz .end_cpuid
221 serge 1059
           push ecx
164 serge 1060
           popfd
1061
1062
 
1063
           mov eax, ecx
1064
           xor eax, 0x200000
1065
           push eax
1066
           popfd
1067
           pushfd
1068
           pop eax
1069
           xor eax, ecx
1070
           je .end_cpuid
221 serge 1071
           mov [cpu_id], 1
164 serge 1072
1073
 
1074
           cpuid
1075
           mov [cpu_vendor], ebx
1076
           mov [cpu_vendor+4], edx
1077
           mov [cpu_vendor+8], ecx
1078
           cmp ebx, dword [intel_str]
1079
           jne .check_AMD
1080
           cmp edx, dword [intel_str+4]
1081
           jne .check_AMD
1082
           cmp ecx, dword [intel_str+8]
1083
           jne .check_AMD
1084
           mov [cpu_Intel], 1
1085
           cmp eax, 1
1086
           jl .end_cpuid
1087
           mov eax, 1
1088
           cpuid
1089
           mov [cpu_sign], eax
1090
           mov [cpu_info],  ebx
1091
           mov [cpu_caps],  edx
1092
           mov [cpu_caps+4],ecx
1093
1094
 
1095
           and eax, 0x0f
1096
           ret
1097
.end_cpuid:
1098
           mov eax, [cpu_type]
1099
           ret
1100
1101
 
1102
           cmp ebx, dword [AMD_str]
1103
           jne .unknown
221 serge 1104
           cmp edx, dword [AMD_str+4]
164 serge 1105
           jne .unknown
221 serge 1106
           cmp ecx, dword [AMD_str+8]
164 serge 1107
           jne .unknown
221 serge 1108
           mov [cpu_AMD], 1
164 serge 1109
           cmp eax, 1
1110
           jl .unknown
221 serge 1111
           mov eax, 1
164 serge 1112
           cpuid
1113
           mov [cpu_sign], eax
1114
           mov [cpu_info],  ebx
1115
           mov [cpu_caps],  edx
1116
           mov [cpu_caps+4],ecx
1117
           shr eax, 8
1118
           and eax, 0x0f
1119
           ret
1120
.unknown:
221 serge 1121
           mov eax, 1
1122
           cpuid
1123
           mov [cpu_sign], eax
1124
           mov [cpu_info],  ebx
1125
           mov [cpu_caps],  edx
1126
           mov [cpu_caps+4],ecx
1127
           shr eax, 8
1128
           and eax, 0x0f
1129
           ret
1130
endp
164 serge 1131
1132
 
1133
MEM_WC     equ 1               ;write combined memory
1134
MEM_UC     equ 0               ;uncached memory
1135
1136
 
1137
proc init_mtrr
1138
1139
 
1140
           je  .exit
1141
1142
 
211 serge 1143
           jnc .exit
1144
1145
 
164 serge 1146
           or eax, 0x60000000   ;disable caching
1147
           mov cr0, eax
1148
           wbinvd               ;invalidate cache
1149
1150
 
1151
           rdmsr                ;
1152
           push eax
1153
1154
 
1155
           xor eax, eax
1156
           mov ecx, 0x2FF
1157
           wrmsr                ;disable all MTRR
1158
1159
 
1160
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1161
           xor edx, edx
1162
           xor eax, eax
1163
           mov ecx, 0x204
1164
           mov ebx, 6
1165
@@:
1166
           wrmsr                ;disable unused MTRR
1167
           inc ecx
1168
           wrmsr
1169
           inc ecx
1170
           dec ebx
1171
           jnz @b
1172
1173
 
1174
1175
 
1176
           or eax, 0x800        ;set default memtype to UC
1177
           and al, 0xF0
1178
           mov ecx, 0x2FF
1179
           wrmsr                ;and enable MTRR
1180
1181
 
1182
           and eax, not 0x60000000
1183
           mov cr0, eax         ; enable caching
1184
.exit:
1185
           ret
1186
endp
1187
1188
 
1189
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1190
1191
 
1192
           mov eax, [base]
1193
           or eax, [mem_type]
1194
           mov ecx, [reg]
1195
           lea ecx, [0x200+ecx*2]
1196
           wrmsr
1197
1198
 
1199
           dec ebx
1200
           mov eax, 0xFFFFFFFF
1201
           mov edx, 0x0000000F
1202
           sub eax, ebx
1203
           sbb edx, 0
1204
           or eax, 0x800
1205
           inc ecx
1206
           wrmsr
1207
           ret
1208
endp
1209
1210
 
172 serge 1211
proc stall stdcall, delay:dword
1212
           push ecx
1213
           push edx
1214
           push ebx
1215
           push eax
1216
1217
 
1218
           mul [stall_mcs]
1219
           mov ebx, eax       ;low
1220
           mov ecx, edx       ;high
1221
           rdtsc
1222
           add ebx, eax
1223
           adc ecx,edx
1224
@@:
1225
           rdtsc
1226
           sub eax, ebx
1227
           sbb edx, ecx
1228
           jb @B
1229
1230
 
1231
           pop ebx
1232
           pop edx
1233
           pop ecx
1234
           ret
1235
endp
1236
1237
 
164 serge 1238
align 4
1239
  intel_str    db "GenuineIntel",0
1240
  AMD_str      db "AuthenticAMD",0
1241
endg
1242
1243
 
1244
align 16
1245
  irq_tab           rd 16
1246
1247
 
1248
 
1249
1250
 
1251
  ipc_pdir          rd 1
1252
  ipc_ptab          rd 1
1253
1254
 
1255
  proc_mem_pdir     rd 1
1256
  proc_mem_tab      rd 1
1257
1258
 
1259
  tmp_task_ptab     rd 1
1260
  tmp_task_data     rd 1
1261
1262
 
1263
  fdd_buff          rd 1
1264
  LFBSize           rd 1
214 serge 1265
164 serge 1266
 
172 serge 1267
;;CPUID information
164 serge 1268
1269
 
1270
  cpu_sign          rd 1
1271
  cpu_info          rd 1
1272
1273
 
221 serge 1274
1275
 
1276
cur_saved_data   rb 4096
1277
1278
 
1279
cursor_map       rd 2
1280
cursor_start     rd 1
1281
cursor_end       rd 1
1282
1283
 
1284
1285
 
1286
scr_height       rd 1
1287
1288
 
1289
cur_saved_base   rd 1
1290
cur_saved_interl rd 1
1291
cur_saved_w      rd 1
1292
cur_saved_h      rd 1
1293
1294
 
164 serge 1295
1296
 
1297
align 16
1298
227 serge 1299
 
164 serge 1300
   srv_tab         rb 36*32
214 serge 1301
   mem_block_map   rb 512
227 serge 1302
   event_map       rb 128
1303
   mem_block_list  rd 64
1304
   mem_block_mask  rd 2
1305
1306
 
164 serge 1307
   srv_map         rd 1
1308
1309
 
1310
   mem_block_arr   rd 1
1311
   mem_block_start rd 1
1312
   mem_block_end   rd 1
1313
   heap_size       rd 1
170 serge 1314
   heap_free       rd 1
1315
   heap_blocks     rd 1
1316
   free_blocks     rd 1
1317
164 serge 1318
 
1319
   page_end        rd 1
1320
   events          rd 1
227 serge 1321
   event_start     rd 1
1322
   event_end       rd 1
1323
1324
 
164 serge 1325
endg
1326
1327
 
1328
 
1329
;     push edx
1330
;     mov edx, 0x400   ;bocsh
1331
;     mov al,0xff      ;bocsh
1332
;     out dx, al       ;bocsh
1333
;     pop edx
1334
;     pop eax
1335