Subversion Repositories Kolibri OS

Rev

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