Subversion Repositories Kolibri OS

Rev

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

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