Subversion Repositories Kolibri OS

Rev

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