Subversion Repositories Kolibri OS

Rev

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