Subversion Repositories Kolibri OS

Rev

Rev 285 | Rev 294 | 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
           lea eax, [eax+ebx*8]
254 serge 175
           shl eax, 12
164 serge 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
map_space:    ;not implemented
281 serge 246
247
 
248
 
249
250
 
251
 
252
proc free_page
164 serge 253
;arg:  eax  page address
254
           pushfd
255
           cli
256
           shr eax, 12              ;page index
257
           mov ebx, sys_pgmap
258
           bts [ebx], eax           ;that's all!
259
           cmc
291 serge 260
           adc [pg_data.pages_free], 0
261
           shr eax, 3
164 serge 262
           and eax, not 3           ;dword offset from page_map
263
           add eax, ebx
264
           cmp [page_start], eax
265
           ja @f
266
           popfd
267
           ret
268
@@:
269
           mov [page_start], eax
270
           popfd
271
           ret
272
endp
273
274
 
279 serge 275
;  eax= page base
281 serge 276
;  ebx= liear address
277
;  ecx= count
278
279
 
280
commit_pages:   ;not implemented
281
282
 
283
 
284
285
 
286
;  eax= base
279 serge 287
;  ecx= count
281 serge 288
279 serge 289
 
164 serge 290
release_pages:
279 serge 291
291 serge 292
 
293
           mov ebx, pg_data.pg_mutex
279 serge 294
           call wait_mutex      ;ebx
295
296
 
297
           mov edi, eax
298
299
 
300
           add esi, pages_tab
301
291 serge 302
 
303
           mov ebx, [page_start]
279 serge 304
           mov edx, sys_pgmap
305
@@:
306
           xor eax, eax
307
           xchg eax, [esi]
308
           invlpg [edi]
309
310
 
311
           jz .next
312
313
 
314
           bts [edx], eax
315
           cmc
291 serge 316
           adc ebp, 0
317
           shr eax, 3
279 serge 318
           and eax, -4
319
           add eax, edx
320
           cmp eax, ebx
321
           jae .next
322
323
 
324
.next:
325
           add edi, 0x1000
326
           add esi, 4
327
           dec ecx
328
           jnz @B
329
           mov [pg_data.pages_free], ebp
291 serge 330
           and [pg_data.pg_mutex],0
279 serge 331
           pop ebp
291 serge 332
           ret
279 serge 333
334
 
335
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
188 serge 336
           mov ebx, [lin_addr]
164 serge 337
           shr ebx, 22
338
           mov eax, [phis_addr]
339
           and eax, not 0xFFF
340
           or eax, PG_UW          ;+PG_NOCACHE
341
           mov dword [current_pgdir+ebx*4], eax
188 serge 342
           mov eax, [lin_addr]
164 serge 343
           shr eax, 10
344
           add eax, pages_tab
345
           invlpg [eax]
346
           ret
347
endp
348
349
 
350
proc init_LFB
351
           cmp dword [LFBAddress], -1
352
           jne @f
353
           mov [0x2f0000+0x901c],byte 2
201 serge 354
           stdcall kernel_alloc, 0x280000
164 serge 355
           mov [LFBAddress], eax
356
           ret
357
@@:
358
           test [SCR_MODE],word 0100000000000000b
359
           jnz @f
211 serge 360
           mov [0x2f0000+0x901c],byte 2
361
           ret
362
@@:
363
           call map_LFB
164 serge 364
           ret
365
endp
366
367
 
368
proc map_LFB
369
           locals
370
             pg_count dd ?
371
           endl
372
373
 
374
           mov esi, [LFBAddress]
375
           mov dword [exp_lfb+4], esi
214 serge 376
377
 
164 serge 378
           mov [pg_count], edi
379
           shr edi, 10
380
381
 
382
           jnc .map_page_tables
383
           mov ebx, esi
384
           or esi, PG_LARGE+PG_UW
385
           shr ebx, 20
386
           mov ecx, ebx
387
@@:
388
           mov [sys_pgdir+ebx], esi
389
           add ebx, 4
390
           add esi, 0x00400000
391
           dec edi
392
           jnz @B
393
394
 
207 serge 395
           jnc @F
396
           or dword [sys_pgdir+ecx], PG_GLOBAL
164 serge 397
@@:
207 serge 398
           mov eax, cr3       ;flush TLB
164 serge 399
           mov cr3, eax
400
           ret
401
402
 
403
404
 
405
           call alloc_page
406
           stdcall map_page_table, esi, eax
188 serge 407
           add esi, 0x00400000
164 serge 408
           dec edi
409
           jnz @B
410
411
 
412
           mov esi, eax
413
           shr esi, 10
414
           add esi, pages_tab
415
           or eax, PG_UW
416
           mov ecx, [pg_count]
417
           shr ecx, 2
418
.map:
419
           mov [esi], eax
420
           add eax, 0x1000
421
           mov [esi+4], eax
422
           add eax, 0x1000
423
           mov [esi+8], eax
424
           add eax, 0x1000
425
           mov [esi+12], eax
426
           add eax, 0x1000
427
           add esi, 16
428
           sub ecx, 1
429
           jnz .map
430
431
 
432
           mov cr3, eax
433
434
 
435
endp
436
437
 
438
proc new_mem_resize stdcall, new_size:dword
439
440
 
276 serge 441
           call wait_mutex    ;ebx
442
164 serge 443
 
444
           add edi,4095
445
           and edi,not 4095
446
           mov [new_size], edi
447
448
 
449
           shl edx,8
450
           cmp [PROC_BASE+APPDATA.heap_base+edx],0
172 serge 451
           jne .exit
452
453
 
454
           add esi, 4095
164 serge 455
           and esi, not 4095
456
457
 
458
           jae .expand
459
460
 
461
           shr esi, 12
462
@@:
463
           mov eax, [pages_tab+0x00181000+edi*4]
464
           test eax, 1
465
           jz .next
466
           mov dword [pages_tab+0x00181000+edi*4], 2
467
           mov ebx, edi
468
           shl ebx, 12
469
           invlpg [ebx+std_application_base_address]
470
           call free_page
471
472
 
473
           cmp edi, esi
474
           jb @B
475
476
 
477
478
 
479
           mov    [PROC_BASE+0x8c+edx],ebx
480
481
 
482
;application memory size infomation
483
           mov    ecx,[PROC_BASE+0xb8+edx]
484
           mov    eax,2
485
486
 
487
;eax = current slot
488
;ebx = new memory size
489
;ecx = page directory
490
           cmp    eax,[TASK_COUNT]
491
           jg     .search_threads_end
492
           mov    edx,eax
493
           shl    edx,5
494
           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
495
           jz     .search_threads_next
496
           shl    edx,3
497
           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
498
           jnz    .search_threads_next
499
           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
500
.search_threads_next:
501
           inc    eax
502
           jmp    .search_threads
503
.search_threads_end:
504
           xor eax, eax
505
           dec [pg_data.pg_mutex]
506
           ret
507
508
 
509
           add edi, new_app_base
510
           add esi, new_app_base
511
512
 
513
           push edi
514
515
 
516
           and edi, not(0x3FFFFF)
517
           add esi, 0x3FFFFF
518
           and esi, not(0x3FFFFF)
519
520
 
521
           jae .grow
522
523
 
524
525
 
526
           call alloc_page
527
           test eax, eax
528
           jz .exit
529
530
 
188 serge 531
164 serge 532
 
533
           shr edi, 10
534
           add edi, pages_tab
535
           mov ecx, 1024
536
           xor eax, eax
537
           cld
538
           rep stosd
539
           pop edi
540
541
 
542
           cmp edi, esi
543
           jb @B
544
.grow:
545
           pop edi
546
           pop esi
547
@@:
548
           call alloc_page
549
           test eax, eax
550
           jz .exit
551
           stdcall map_page,esi,eax,dword PG_UW
552
553
 
554
           mov edi, esi
555
           xor eax, eax
556
           mov ecx, 1024
557
           cld
558
           rep stosd
559
           pop edi
560
561
 
562
           cmp esi, edi
563
           jna @B
564
565
 
566
.exit:
567
           xor eax, eax
568
           inc eax
569
           dec [pg_data.pg_mutex]
570
           ret
571
endp
572
573
 
285 serge 574
;  eax= linear address
575
;
576
; retval
577
;  eax= phisical page address
578
579
 
164 serge 580
get_pg_addr:
285 serge 581
           shr eax, 12
582
           mov eax, [pages_tab+eax*4]
583
           and eax, 0xFFFFF000
164 serge 584
           ret
585
586
 
188 serge 587
proc page_fault_handler
164 serge 588
           pushad
589
590
 
591
           mov eax, cr2
592
           push eax
172 serge 593
           push ds
164 serge 594
           push es
188 serge 595
164 serge 596
 
597
           mov ds, ax
598
           mov es, ax
188 serge 599
164 serge 600
 
188 serge 601
602
 
164 serge 603
604
 
605
           jae .lfb_addr
606
607
 
608
           jae .user_space
609
610
 
188 serge 611
           jae .alloc
612
613
 
164 serge 614
           jae .tab_space
615
616
 
617
618
 
619
           shr ebx, 12
620
           mov ecx, ebx
172 serge 621
           shr ecx, 10
622
           mov edx, [master_tab+ecx*4]
623
           test edx, 1
624
           jz .fail
625
626
 
164 serge 627
           test eax, 2
628
           jz .fail
172 serge 629
.alloc:
188 serge 630
           call alloc_page
164 serge 631
           and eax, eax
632
           jz .exit
633
634
 
635
636
 
188 serge 637
           and edi, 0xFFFFF000
638
           mov ecx, 1024
164 serge 639
           xor eax, eax
640
           cld
188 serge 641
           rep stosd
642
.exit:
164 serge 643
           pop es
188 serge 644
           pop ds
164 serge 645
           mov esp, ebp
646
           popad
647
           add esp, 4
648
           iretd
649
.fail:
172 serge 650
           pop es
188 serge 651
           pop ds
172 serge 652
           mov esp, ebp
653
           popad
654
           add esp, 4
655
164 serge 656
 
172 serge 657
658
 
659
           jmp exc_c
660
           iretd
661
662
 
164 serge 663
;           shr ebx, 12
188 serge 664
;           mov eax, [pages_tab+ebx*4]
665
;           shr ebx, 10
666
;           mov eax, [master_tab+ebx*4]
667
           jmp .exit
668
.old_addr:
164 serge 669
;           shr ebx, 12
188 serge 670
;           mov eax, [pages_tab+ebx*4]
164 serge 671
;           shr ebx, 10
188 serge 672
;           mov eax, [master_tab+ebx*4]
673
           jmp .exit
674
.lfb_addr:
164 serge 675
;           shr ebx, 22
188 serge 676
;           ;mov ecx, [sys_page_dir]
677
;           mov eax, [master_tab+ebx*4]
678
           jmp .exit
679
.tab_space:
164 serge 680
;           shr ebx, 12
188 serge 681
;           mov eax, [pages_tab+ebx*4]
164 serge 682
;           shr ebx, 10
188 serge 683
;           ;mov ecx, [sys_page_dir]
684
;           mov eax, [master_tab+ebx*4]
685
           jmp .exit
686
endp
164 serge 687
688
 
689
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
690
                      ofs:dword,buf_size:dword
691
           mov eax, [buf_size]
692
           test eax, eax
693
           jz .exit
694
695
 
696
           and eax, 0xFFFFF000
697
698
 
699
           mov ebx, [ofs]
700
           shr ebx, 22
701
           mov esi, [ipc_pdir]
702
           mov edi, [ipc_ptab]
703
           mov eax, [esi+ebx*4]
704
           and eax, 0xFFFFF000
705
           test eax, eax
706
           jz .exit
707
           stdcall map_page,edi,eax,dword PG_UW
708
;           inc ebx
709
;           add edi, 0x1000
710
;           mov eax, [esi+ebx*4]
711
;           test eax, eax
712
;           jz @f
713
;          and eax, 0xFFFFF000
714
;           stdcall map_page, edi, eax
715
716
 
717
           and edi, 0xFFFFF000
718
           mov ecx, [buf_size]
719
           add ecx, 4095
720
           shr ecx, 12
721
           inc ecx
722
723
 
724
           shr edx, 12
725
           and edx, 0x3FF
726
           mov esi, [ipc_ptab]
727
728
 
729
           and eax, 0xFFFFF000
730
           test eax, eax
731
           jz .exit
732
           stdcall map_page,edi,eax,dword PG_UW
733
           add edi, 0x1000
734
           inc edx
735
           dec ecx
736
           jnz .map
737
738
 
739
           ret
740
endp
741
742
 
743
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
744
                        ofs:dword,buf_size:dword
745
           mov eax, [buf_size]
746
           test eax, eax
747
           jz .exit
748
749
 
750
           and eax, 0xFFFFF000
751
752
 
753
           mov ebx, [ofs]
754
           shr ebx, 22
755
           mov esi, [proc_mem_pdir]
756
           mov edi, [proc_mem_tab]
757
           mov eax, [esi+ebx*4]
758
           and eax, 0xFFFFF000
759
           test eax, eax
760
           jz .exit
761
           stdcall map_page,edi,eax,dword PG_UW
762
763
 
764
           and edi, 0xFFFFF000
765
           mov ecx, [buf_size]
766
           add ecx, 4095
767
           shr ecx, 12
768
           inc ecx
769
770
 
771
           shr edx, 12
772
           and edx, 0x3FF
773
           mov esi, [proc_mem_tab]
774
775
 
776
;           and eax, 0xFFFFF000
777
;           test eax, eax
778
;           jz .exit
779
           stdcall map_page,edi,eax,dword PG_UW
780
           add edi, 0x1000
781
           inc edx
782
           dec ecx
783
           jnz .map
784
.exit:
785
           ret
786
endp
787
788
 
789
 
790
 
791
 
792
;input:
793
;  eax=1 - set ipc buffer area
794
;    ebx=address of buffer
795
;    ecx=size of buffer
796
;  eax=2 - send message
797
;    ebx=PID
798
;    ecx=address of message
799
;    edx=size of message
800
801
 
802
           jne @f
803
           call set_ipc_buff
804
           mov [esp+36], eax
805
           ret
806
@@:
807
           cmp eax, 2
808
           jne @f
809
           stdcall sys_ipc_send, ebx, ecx, edx
810
           mov [esp+36], eax
811
           ret
812
@@:
813
           xor eax, eax
814
           not eax
815
           mov [esp+36], eax
816
           ret
817
818
 
819
proc set_ipc_buff
820
821
 
822
           shl  eax,8
823
           add  eax, PROC_BASE
824
           pushf
825
           cli
826
           mov  [eax+0xA0],ebx     ;set fields in extended information area
827
           mov  [eax+0xA4],ecx
828
829
 
830
           add ecx, ebx
831
           add ecx, 4095
832
           and ecx, not 4095
833
834
 
835
           add ebx, 0x1000
836
           cmp ebx, ecx
837
           jna .touch
838
839
 
840
           xor eax, eax
841
           ret
842
endp
843
844
 
845
           locals
846
             dst_slot   dd ?
847
             dst_offset dd ?
848
             buf_size   dd ?
849
           endl
850
851
 
852
           cli
853
854
 
855
           call pid_to_slot
856
           test eax,eax
857
           jz   .no_pid
858
859
 
860
           shl  eax,8
861
           mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
862
           test edi,edi
863
           jz   .no_ipc_area
864
865
 
866
           add edi, new_app_base
867
           and ebx, 0xFFF
868
           mov [dst_offset], ebx
869
870
 
871
           mov [buf_size], esi
872
873
 
874
                             edi, esi
875
876
 
877
           add edi, [ipc_tmp]
878
           cmp dword [edi], 0
879
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
880
227 serge 881
 
164 serge 882
           mov edx, ebx
883
           add ebx, 8
884
           add ebx, [msg_size]
885
           cmp ebx, [buf_size]
886
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
887
227 serge 888
 
164 serge 889
           mov eax,[TASK_BASE]
890
           mov eax, [eax+0x04]         ;eax - our PID
891
           mov edi, [dst_offset]
892
           add edi, [ipc_tmp]
893
           add edi, edx
894
           mov [edi], eax
895
           mov ecx, [msg_size]
896
897
 
898
           add edi, 8
899
           mov esi, [msg_addr]
900
           add esi, new_app_base
901
           cld
902
           rep movsb
903
904
 
905
           mov edx, ebx
906
           shr ebx, 12
907
           xor eax, eax
908
           mov [pages_tab+ebx*4], eax
909
           invlpg [edx]
910
911
 
912
           mov edx, ebx
913
           shr ebx, 12
914
           xor eax, eax
915
           mov [pages_tab+ebx*4], eax
916
           invlpg [edx]
917
918
 
919
           mov edx, ebx
920
           shr ebx, 12
921
           xor eax, eax
922
           mov [pages_tab+ebx*4], eax
923
           invlpg [edx]
924
925
 
926
           shl eax, 8
927
           or   [eax+PROC_BASE+0xA8],dword 0x40
928
           cmp  dword [check_idle_semaphore],20
929
           jge  .ipc_no_cis
930
931
 
932
.ipc_no_cis:
933
           popf
934
           xor eax, eax
935
           ret
936
.no_pid:
937
           popf
938
           mov  eax, 4
939
           ret
940
.no_ipc_area:
941
           popf
942
           xor eax, eax
943
           inc eax
944
           ret
945
.ipc_blocked:
946
           popf
947
           mov  eax, 2
948
           ret
949
.buffer_overflow:
950
           popf
951
           mov  eax, 3
952
           ret
953
endp
954
955
 
956
sysfn_meminfo:
170 serge 957
164 serge 958
 
170 serge 959
           cmp ebx, new_app_base
172 serge 960
           jb .fail
961
962
 
164 serge 963
           mov [ebx], eax
170 serge 964
           shl eax, 12
172 serge 965
           mov [esp+36], eax
966
           mov ecx, [pg_data.pages_free]
170 serge 967
           mov [ebx+4], ecx
968
           mov edx, [pg_data.pages_faults]
969
           mov [ebx+8], edx
970
           mov esi, [heap_size]
971
           mov [ebx+12], esi
972
           mov edi, [heap_free]
973
           mov [ebx+16], edi
974
           mov eax, [heap_blocks]
975
           mov [ebx+20], eax
976
           mov ecx, [free_blocks]
977
           mov [ebx+24], ecx
978
           ret
164 serge 979
.fail:
172 serge 980
           mov dword [esp+36], -1
981
           ret
982
164 serge 983
 
984
new_services:
985
986
 
987
           jle  sys_sheduler
988
989
 
170 serge 990
           jb .fail
164 serge 991
           ja @f
992
993
 
188 serge 994
           mov [esp+36], eax
164 serge 995
           ret
996
@@:
997
           cmp eax, 12
998
           ja @f
999
1000
 
1001
           mov [esp+36], eax
1002
           ret
1003
@@:
1004
           cmp eax, 13
1005
           ja @f
1006
           add ebx, new_app_base
188 serge 1007
           stdcall user_free, ebx
164 serge 1008
           mov [esp+36], eax
1009
           ret
1010
@@:
1011
           cmp eax, 14
1012
           ja @f
1013
           add ebx, new_app_base
227 serge 1014
           cmp ebx, new_app_base
172 serge 1015
           jb .fail
1016
           stdcall get_event_ex, ebx, ecx
227 serge 1017
           mov [esp+36], eax
1018
           ret
164 serge 1019
@@:
1020
           cmp eax, 15
1021
           ja @f
1022
           mov ecx, [CURRENT_TASK]
1023
           shl ecx, 8
1024
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
1025
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
1026
           mov [esp+36], eax
1027
           ret
1028
@@:
1029
           cmp eax, 16
1030
           ja @f
1031
1032
 
188 serge 1033
           jz .fail
1034
           add ebx, new_app_base
164 serge 1035
           cmp ebx, new_app_base
172 serge 1036
           jb .fail
1037
           stdcall get_service, ebx
164 serge 1038
           mov [esp+36], eax
1039
           ret
1040
@@:
1041
           cmp eax, 17
1042
           ja @f
1043
           stdcall srv_handlerEx, ebx
1044
           mov [esp+36], eax
1045
           ret
1046
@@:
168 serge 1047
           cmp eax, 18
1048
           ja @f
1049
           mov ecx, [CURRENT_TASK]
1050
           shl ecx, 8
1051
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
1052
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
1053
           mov [esp+36], eax
1054
           ret
1055
@@:
164 serge 1056
           cmp eax, 19
198 serge 1057
           ja .fail
227 serge 1058
           add ebx, new_app_base
198 serge 1059
           cmp ebx, new_app_base
1060
           jb .fail
1061
           stdcall load_library, ebx
1062
           mov [esp+36], eax
1063
           ret
1064
227 serge 1065
 
164 serge 1066
           xor eax, eax
1067
           mov [esp+36], eax
1068
           ret
1069
1070
 
1071
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1072
1073
 
1074
          jecxz .end
1075
1076
 
1077
1078
 
1079
          mov esi,edi
1080
          xor eax,eax
1081
          repne scasb
1082
          neg ecx             ; cx = count - strlen
1083
          add ecx,ebx         ; strlen + count - strlen
1084
1085
 
1086
          mov edi,esi
1087
          mov esi,[str2]
1088
          repe cmpsb
1089
          mov al,[esi-1]
1090
          xor ecx,ecx
1091
1092
 
1093
          ja .str2_big
1094
          je .end
1095
1096
 
1097
          sub ecx,2
1098
1099
 
1100
          not ecx
1101
.end:
1102
          mov eax,ecx
1103
          ret
1104
endp
1105
1106
 
1107
proc test_cpu
1108
           locals
1109
              cpu_type   dd ?
166 serge 1110
              cpu_id     dd ?
1111
              cpu_Intel  dd ?
1112
              cpu_AMD    dd ?
1113
           endl
164 serge 1114
1115
 
1116
           xor eax, eax
211 serge 1117
           mov [cpu_caps], eax
1118
           mov [cpu_caps+4], eax
1119
164 serge 1120
 
1121
           pop eax
1122
           mov ecx, eax
1123
           xor eax, 0x40000
1124
           push eax
1125
           popfd
1126
           pushfd
1127
           pop eax
1128
           xor eax, ecx
1129
           mov [cpu_type], CPU_386
1130
           jz .end_cpuid
221 serge 1131
           push ecx
164 serge 1132
           popfd
1133
1134
 
1135
           mov eax, ecx
1136
           xor eax, 0x200000
1137
           push eax
1138
           popfd
1139
           pushfd
1140
           pop eax
1141
           xor eax, ecx
1142
           je .end_cpuid
221 serge 1143
           mov [cpu_id], 1
164 serge 1144
1145
 
1146
           cpuid
1147
           mov [cpu_vendor], ebx
1148
           mov [cpu_vendor+4], edx
1149
           mov [cpu_vendor+8], ecx
1150
           cmp ebx, dword [intel_str]
1151
           jne .check_AMD
1152
           cmp edx, dword [intel_str+4]
1153
           jne .check_AMD
1154
           cmp ecx, dword [intel_str+8]
1155
           jne .check_AMD
1156
           mov [cpu_Intel], 1
1157
           cmp eax, 1
1158
           jl .end_cpuid
1159
           mov eax, 1
1160
           cpuid
1161
           mov [cpu_sign], eax
1162
           mov [cpu_info],  ebx
1163
           mov [cpu_caps],  edx
1164
           mov [cpu_caps+4],ecx
1165
1166
 
1167
           and eax, 0x0f
1168
           ret
1169
.end_cpuid:
1170
           mov eax, [cpu_type]
1171
           ret
1172
1173
 
1174
           cmp ebx, dword [AMD_str]
1175
           jne .unknown
221 serge 1176
           cmp edx, dword [AMD_str+4]
164 serge 1177
           jne .unknown
221 serge 1178
           cmp ecx, dword [AMD_str+8]
164 serge 1179
           jne .unknown
221 serge 1180
           mov [cpu_AMD], 1
164 serge 1181
           cmp eax, 1
1182
           jl .unknown
221 serge 1183
           mov eax, 1
164 serge 1184
           cpuid
1185
           mov [cpu_sign], eax
1186
           mov [cpu_info],  ebx
1187
           mov [cpu_caps],  edx
1188
           mov [cpu_caps+4],ecx
1189
           shr eax, 8
1190
           and eax, 0x0f
1191
           ret
1192
.unknown:
221 serge 1193
           mov eax, 1
1194
           cpuid
1195
           mov [cpu_sign], eax
1196
           mov [cpu_info],  ebx
1197
           mov [cpu_caps],  edx
1198
           mov [cpu_caps+4],ecx
1199
           shr eax, 8
1200
           and eax, 0x0f
1201
           ret
1202
endp
164 serge 1203
1204
 
1205
MEM_WC     equ 1               ;write combined memory
1206
MEM_UC     equ 0               ;uncached memory
1207
1208
 
1209
proc init_mtrr
1210
1211
 
1212
           je  .exit
1213
1214
 
211 serge 1215
           jnc .exit
1216
1217
 
164 serge 1218
           or eax, 0x60000000   ;disable caching
1219
           mov cr0, eax
1220
           wbinvd               ;invalidate cache
1221
1222
 
1223
           rdmsr                ;
1224
           push eax
1225
1226
 
1227
           xor eax, eax
1228
           mov ecx, 0x2FF
1229
           wrmsr                ;disable all MTRR
1230
1231
 
1232
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1233
           xor edx, edx
1234
           xor eax, eax
1235
           mov ecx, 0x204
1236
           mov ebx, 6
1237
@@:
1238
           wrmsr                ;disable unused MTRR
1239
           inc ecx
1240
           wrmsr
1241
           inc ecx
1242
           dec ebx
1243
           jnz @b
1244
1245
 
1246
1247
 
1248
           or eax, 0x800        ;set default memtype to UC
1249
           and al, 0xF0
1250
           mov ecx, 0x2FF
1251
           wrmsr                ;and enable MTRR
1252
1253
 
1254
           and eax, not 0x60000000
1255
           mov cr0, eax         ; enable caching
1256
.exit:
1257
           ret
1258
endp
1259
1260
 
1261
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1262
1263
 
1264
           mov eax, [base]
1265
           or eax, [mem_type]
1266
           mov ecx, [reg]
1267
           lea ecx, [0x200+ecx*2]
1268
           wrmsr
1269
1270
 
1271
           dec ebx
1272
           mov eax, 0xFFFFFFFF
1273
           mov edx, 0x0000000F
1274
           sub eax, ebx
1275
           sbb edx, 0
1276
           or eax, 0x800
1277
           inc ecx
1278
           wrmsr
1279
           ret
1280
endp
1281
1282
 
172 serge 1283
proc stall stdcall, delay:dword
1284
           push ecx
1285
           push edx
1286
           push ebx
1287
           push eax
1288
1289
 
1290
           mul [stall_mcs]
1291
           mov ebx, eax       ;low
1292
           mov ecx, edx       ;high
1293
           rdtsc
1294
           add ebx, eax
1295
           adc ecx,edx
1296
@@:
1297
           rdtsc
1298
           sub eax, ebx
1299
           sbb edx, ecx
1300
           jb @B
1301
1302
 
1303
           pop ebx
1304
           pop edx
1305
           pop ecx
1306
           ret
1307
endp
1308
1309
 
164 serge 1310
align 4
1311
  intel_str    db "GenuineIntel",0
1312
  AMD_str      db "AuthenticAMD",0
1313
endg
1314
1315
 
1316
align 16
1317
  irq_tab           rd 16
1318
1319
 
1320
 
1321
1322
 
1323
  ipc_pdir          rd 1
1324
  ipc_ptab          rd 1
1325
1326
 
1327
  proc_mem_pdir     rd 1
1328
  proc_mem_tab      rd 1
1329
1330
 
1331
  tmp_task_ptab     rd 1
1332
  tmp_task_data     rd 1
1333
1334
 
1335
  fdd_buff          rd 1
1336
  LFBSize           rd 1
214 serge 1337
164 serge 1338
 
172 serge 1339
;;CPUID information
164 serge 1340
1341
 
1342
  cpu_sign          rd 1
1343
  cpu_info          rd 1
1344
1345
 
221 serge 1346
1347
 
1348
cur_saved_data   rb 4096
1349
1350
 
276 serge 1351
;cursor_map       rd 2
1352
;cursor_start     rd 1
1353
;cursor_end       rd 1
1354
221 serge 1355
 
1356
hw_cursor        rd 1
233 serge 1357
221 serge 1358
 
1359
scr_height       rd 1
1360
1361
 
1362
cur_saved_base   rd 1
1363
cur_saved_interl rd 1
1364
cur_saved_w      rd 1
1365
cur_saved_h      rd 1
1366
1367
 
164 serge 1368
1369
 
1370
align 16
1371
227 serge 1372
 
276 serge 1373
1374
 
278 serge 1375
;   srv_tab         rb 36*32
1376
   mem_block_map   rb 512
227 serge 1377
   event_map       rb 128
1378
   mem_block_list  rd 64
1379
   mem_block_mask  rd 2
1380
1381
 
278 serge 1382
;   srv_map         rd 1
1383
164 serge 1384
 
278 serge 1385
   srv.bk          rd 1
1386
1387
 
164 serge 1388
   mem_block_arr   rd 1
1389
   mem_block_start rd 1
1390
   mem_block_end   rd 1
1391
279 serge 1392
 
1393
   heap_size       rd 1
170 serge 1394
   heap_free       rd 1
1395
   heap_blocks     rd 1
1396
   free_blocks     rd 1
1397
164 serge 1398
 
1399
   page_end        rd 1
1400
   events          rd 1
227 serge 1401
   event_start     rd 1
1402
   event_end       rd 1
1403
1404
 
164 serge 1405
endg
1406
1407
 
1408
 
1409
;     push edx
1410
;     mov edx, 0x400   ;bocsh
1411
;     mov al,0xff      ;bocsh
1412
;     out dx, al       ;bocsh
1413
;     pop edx
1414
;     pop eax
1415
1416
 
237 serge 1417
 
1418
k_strrchr:
1419
        push eax
1420
        xor eax,eax
1421
        or  ecx,-1
1422
        repne scasb
1423
        add ecx,1
1424
        neg ecx
1425
        sub edi,1
1426
        pop eax
1427
        std
1428
        repne scasb
1429
        cld
1430
        add edi,1
1431
1432
 
1433
        jne @F
1434
        mov eax,edi
1435
        ret
1436
@@:
1437
        xor eax,eax
1438
        ret
1439
1440
 
1441
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
1442
        mov eax, [dest]
1443
        mov esi, [src]
1444
        mov ecx, [maxlen]
1445
        test eax, eax
1446
        jz .L9
1447
        test esi, esi
1448
        jz .L9
1449
        test ecx, ecx
1450
        jz .L9
1451
1452
 
1453
        jmp .L1
1454
1455
 
1456
.L2:
1457
        mov edx, [esi+eax]
1458
        mov [eax], dl
1459
        test dl, dl
1460
        jz .L7
1461
1462
 
1463
        test dh, dh
1464
        jz .L6
1465
1466
 
1467
        mov [eax+2],dl
1468
        test dl, dl
1469
        jz .L5
1470
1471
 
1472
        test dh, dh
1473
        jz .L4
1474
        add eax, 4
1475
.L1:
1476
        sub ecx, 4
1477
        jae .L2
1478
1479
 
1480
        jz .L9
1481
1482
 
1483
        mov [eax], dl
1484
        test dl, dl
1485
        jz .L3
1486
1487
 
1488
        dec ecx
1489
        jz .L9
1490
1491
 
1492
        mov [eax], dl
1493
        test dl, dl
1494
        jz .L3
1495
1496
 
1497
        dec ecx
1498
        jz .L9
1499
1500
 
1501
        mov [eax], dl
1502
        test dl, dl
1503
        jz .L3
1504
1505
 
1506
        jmp .L9
1507
1508
 
1509
        inc eax
1510
1511
 
1512
        inc eax
1513
1514
 
1515
        inc eax
1516
.L7:
1517
        add ecx,3
1518
        jz .L9
1519
.L8:
1520
        mov byte [ecx+eax], 0
1521
.L3:
1522
        dec ecx
1523
        jnz .L8
1524
.L9:
1525
	ret
1526
endp
1527
1528
 
1529
1530
 
1531
1532
 
1533
        mov eax,[esp+4]
1534
        mov edx, 3
1535
1536
 
1537
        jz .L1
1538
        jp .L0
1539
1540
 
1541
        je .L2
1542
1543
 
1544
        cmp dh, byte [eax]
1545
1546
 
1547
1548
 
1549
        xor edx, 2
1550
1551
 
1552
.L0:
1553
        cmp dh, [eax]
1554
        je .L2
1555
1556
 
1557
        xor edx, edx
1558
1559
 
1560
        mov ecx, [eax]
1561
        add eax, 4
1562
1563
 
1564
        add ecx, magic
1565
1566
 
1567
        jnc .L3
1568
1569
 
1570
        and edx, not magic
1571
        jne .L3
1572
1573
 
1574
        add eax, 4
1575
1576
 
1577
        add ecx, magic
1578
        dec edx
1579
        jnc .L3
1580
1581
 
1582
        and edx, not magic
1583
        jne .L3
1584
1585
 
1586
        add eax, 4
1587
1588
 
1589
        add ecx, magic
1590
1591
 
1592
        jnc .L3
1593
1594
 
1595
1596
 
1597
        jne .L3
1598
1599
 
1600
        add eax, 4
1601
1602
 
1603
        add ecx, magic
1604
1605
 
1606
        jnc .L3
1607
1608
 
1609
1610
 
1611
        je .L1
1612
1613
 
1614
        sub ecx, magic
1615
1616
 
1617
        jz .L2
1618
1619
 
1620
        test ch, ch
1621
        jz .L2
1622
1623
 
1624
        inc eax
1625
1626
 
1627
        jz .L2
1628
1629
 
1630
1631
 
1632
        sub eax, [esp+4]
1633
	ret
1634
1635
 
1636