Subversion Repositories Kolibri OS

Rev

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