Subversion Repositories Kolibri OS

Rev

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

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