Rev 448 | Rev 490 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 448 | Rev 465 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | $Revision: 448 $ |
1 | $Revision: 465 $ |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
3 | ;; ;; |
3 | ;; ;; |
4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
6 | ;; ;; |
6 | ;; ;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 8... | Line -... | ||
8 | - | ||
9 | tmp_page_tab equ HEAP_BASE |
- | |
10 | - | ||
11 | align 4 |
- | |
12 | proc mem_test |
- | |
13 | - | ||
14 | mov eax, cr0 |
- | |
15 | and eax, not (CR0_CD+CR0_NW) |
- | |
16 | or eax, CR0_CD ;disable caching |
- | |
17 | mov cr0, eax |
- | |
18 | wbinvd ;invalidate cache |
- | |
19 | - | ||
20 | xor edi, edi |
- | |
21 | mov ebx, 'TEST' |
- | |
22 | @@: |
- | |
23 | add edi, 0x400000 |
- | |
24 | xchg ebx, dword [edi] |
- | |
25 | cmp dword [edi], 'TEST' |
- | |
26 | xchg ebx, dword [edi] |
- | |
27 | je @b |
- | |
28 | mov [MEM_AMOUNT], edi |
- | |
29 | - | ||
30 | and eax, not (CR0_CD+CR0_NW) ;enable caching |
- | |
31 | mov cr0, eax |
- | |
32 | mov eax, edi |
- | |
33 | mov [LFBSize], 0x00800000 |
- | |
34 | ret |
- | |
35 | endp |
- | |
36 | - | ||
37 | align 4 |
- | |
38 | proc init_mem |
- | |
39 | - | ||
40 | mov eax, [MEM_AMOUNT] |
- | |
41 | - | ||
42 | mov [pg_data.mem_amount], eax |
- | |
43 | mov [pg_data.kernel_max], eax |
- | |
44 | - | ||
45 | shr eax, 12 |
- | |
46 | mov edx, eax |
- | |
47 | mov [pg_data.pages_count], eax |
- | |
48 | mov [pg_data.kernel_pages], eax |
- | |
49 | - | ||
50 | shr eax, 3 |
- | |
51 | mov [pg_data.pagemap_size], eax |
- | |
52 | - | ||
53 | shr edx, 10 |
- | |
54 | cmp edx, 3 |
- | |
55 | ja @f |
- | |
56 | inc edx ;at least 4Mb for kernel heap |
- | |
57 | @@: |
- | |
58 | mov [pg_data.kernel_tables], edx |
- | |
59 | - | ||
60 | xor eax, eax |
- | |
61 | mov edi, sys_pgdir |
- | |
62 | mov ecx, 2048 |
- | |
63 | cld |
- | |
64 | rep stosd |
- | |
65 | - | ||
66 | mov edx, sys_pgdir |
- | |
67 | bt [cpu_caps], CAPS_PSE |
- | |
68 | jnc .no_PSE |
- | |
69 | - | ||
70 | mov ebx, cr4 |
- | |
71 | or ebx, CR4_PSE |
- | |
72 | mov eax, PG_LARGE+PG_SW |
- | |
73 | bt [cpu_caps], CAPS_PGE |
- | |
74 | jnc @F |
- | |
75 | or eax, PG_GLOBAL |
- | |
76 | or ebx, CR4_PGE |
- | |
77 | @@: |
- | |
78 | mov cr4, ebx |
- | |
79 | sub [pg_data.kernel_tables], 2 |
- | |
80 | - | ||
81 | mov [edx], eax |
- | |
82 | add eax, 0x00400000 |
- | |
83 | mov [edx+4], eax |
- | |
84 | add edx, 8 |
- | |
85 | - | ||
86 | mov eax, 0x800000+PG_SW |
- | |
87 | mov ecx, (HEAP_BASE-0x800000)/4096 |
- | |
88 | jmp .map_low |
- | |
89 | .no_PSE: |
- | |
90 | mov eax, PG_SW |
- | |
91 | mov ecx, HEAP_BASE/4096 |
- | |
92 | .map_low: |
- | |
93 | mov edi, tmp_page_tab |
- | |
94 | @@: ; |
- | |
95 | stosd |
- | |
96 | add eax, 0x1000 |
- | |
97 | dec ecx |
- | |
98 | jnz @B |
- | |
99 | - | ||
100 | mov ecx, [pg_data.kernel_tables] |
- | |
101 | shl ecx, 10 |
- | |
102 | xor eax, eax |
- | |
103 | rep stosd |
- | |
104 | - | ||
105 | mov ecx, [pg_data.kernel_tables] |
- | |
106 | mov eax, tmp_page_tab+PG_SW |
- | |
107 | mov edi, edx |
- | |
108 | - | ||
109 | .map_kernel_tabs: |
- | |
110 | - | ||
111 | stosd |
- | |
112 | add eax, 0x1000 |
- | |
113 | dec ecx |
- | |
114 | jnz .map_kernel_tabs |
- | |
115 | - | ||
116 | mov dword [sys_pgdir+(page_tabs shr 20)], sys_pgdir+PG_SW |
- | |
117 | ret |
- | |
118 | endp |
- | |
119 | - | ||
120 | align 4 |
- | |
121 | proc init_page_map |
- | |
122 | - | ||
123 | mov edi, sys_pgmap |
- | |
124 | mov ecx, (HEAP_BASE/4096)/32 ;384/4 |
- | |
125 | mov ebx, ecx |
- | |
126 | xor eax,eax |
- | |
127 | cld |
- | |
128 | rep stosd |
- | |
129 | - | ||
130 | not eax |
- | |
131 | mov ecx, [pg_data.pagemap_size] |
- | |
132 | sub ecx, ebx |
- | |
133 | shr ecx, 2 |
- | |
134 | rep stosd |
- | |
135 | - | ||
136 | lea edi, [sys_pgmap+ebx*4] ;+384 |
- | |
137 | mov edx, [pg_data.pages_count] |
- | |
138 | mov ecx, [pg_data.kernel_tables] |
- | |
139 | add ecx, (HEAP_BASE/4096) and 31 |
- | |
140 | sub edx, HEAP_BASE/4096 |
- | |
141 | sub edx, ecx |
- | |
142 | mov [pg_data.pages_free], edx |
- | |
143 | - | ||
144 | xor eax, eax |
- | |
145 | mov ebx, ecx |
- | |
146 | shr ecx, 5 |
- | |
147 | rep stosd |
- | |
148 | - | ||
149 | not eax |
- | |
150 | mov ecx, ebx |
- | |
151 | and ecx, 31 |
- | |
152 | shl eax, cl |
- | |
153 | mov [page_start], edi; sys_pgmap+384 |
- | |
154 | stosd |
- | |
155 | - | ||
156 | mov ebx, sys_pgmap |
- | |
157 | add ebx, [pg_data.pagemap_size] |
- | |
158 | mov [page_end], ebx |
- | |
159 | - | ||
160 | mov [pg_data.pg_mutex], 0 |
- | |
161 | - | ||
162 | ret |
- | |
163 | endp |
- | |
164 | 8 | ||
165 | align 4 |
9 | align 4 |
Line 166... | Line 10... | ||
166 | proc alloc_page |
10 | proc alloc_page |
167 | 11 | ||
Line 398... | Line 242... | ||
398 | mov [BOOT_VAR+0x901c],byte 2 |
242 | mov [BOOT_VAR+0x901c],byte 2 |
399 | ret |
243 | ret |
400 | @@: |
244 | @@: |
401 | mov edx, LFB_BASE |
245 | mov edx, LFB_BASE |
402 | mov esi, [LFBAddress] |
246 | mov esi, [LFBAddress] |
403 | mov edi, [LFBSize] |
247 | mov edi, 0x00800000 |
404 | mov dword [exp_lfb+4], edx |
248 | mov dword [exp_lfb+4], edx |
Line 405... | Line 249... | ||
405 | 249 | ||
406 | shr edi, 12 |
250 | shr edi, 12 |
407 | mov [pg_count], edi |
251 | mov [pg_count], edi |
Line 408... | Line 252... | ||
408 | shr edi, 10 |
252 | shr edi, 10 |
409 | 253 | ||
410 | bt [cpu_caps], CAPS_PSE |
254 | bt [cpu_caps], CAPS_PSE |
411 | jnc .map_page_tables |
- | |
412 | or esi, PG_LARGE+PG_UW |
255 | jnc .map_page_tables |
413 | shr edx, 20 |
256 | or esi, PG_LARGE+PG_UW |
414 | mov ecx, edx |
257 | mov edx, sys_pgdir+(LFB_BASE shr 20) |
415 | @@: |
258 | @@: |
416 | mov [sys_pgdir+edx], esi |
259 | mov [edx], esi |
417 | add edx, 4 |
260 | add edx, 4 |
418 | add esi, 0x00400000 |
261 | add esi, 0x00400000 |
Line 419... | Line 262... | ||
419 | dec edi |
262 | dec edi |
420 | jnz @B |
263 | jnz @B |
421 | 264 | ||
422 | bt [cpu_caps], CAPS_PGE |
265 | bt [cpu_caps], CAPS_PGE |
423 | jnc @F |
266 | jnc @F |
424 | or dword [sys_pgdir+ecx], PG_GLOBAL |
267 | or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL |
425 | @@: |
268 | @@: |
426 | mov dword [LFBAddress], LFB_BASE |
269 | mov dword [LFBAddress], LFB_BASE |
Line 427... | Line 270... | ||
427 | mov eax, cr3 ;flush TLB |
270 | mov eax, cr3 ;flush TLB |
Line -... | Line 271... | ||
- | 271 | mov cr3, eax |
|
428 | mov cr3, eax |
272 | ret |
429 | ret |
273 | |
430 | 274 | .map_page_tables: |
|
431 | .map_page_tables: |
275 | |
432 | 276 | @@: |
|
Line 433... | Line 277... | ||
433 | call alloc_page |
277 | call alloc_page |
434 | stdcall map_page_table, edx, eax |
278 | stdcall map_page_table, edx, eax |
435 | add edx, 0x00400000 |
279 | add edx, 0x00400000 |
436 | dec edi |
280 | dec edi |
Line 463... | Line 307... | ||
463 | mov edi, [new_size] |
307 | mov edi, [new_size] |
464 | add edi,4095 |
308 | add edi,4095 |
465 | and edi,not 4095 |
309 | and edi,not 4095 |
466 | mov [new_size], edi |
310 | mov [new_size], edi |
Line 467... | Line 311... | ||
467 | 311 | ||
468 | mov edx,[CURRENT_TASK] |
- | |
469 | shl edx,8 |
312 | mov edx,[current_slot] |
470 | cmp [SLOT_BASE+APPDATA.heap_base+edx],0 |
313 | cmp [edx+APPDATA.heap_base],0 |
Line 471... | Line 314... | ||
471 | jne .exit |
314 | jne .exit |
472 | 315 | ||
473 | mov esi, [SLOT_BASE+APPDATA.mem_size+edx] |
316 | mov esi, [edx+APPDATA.mem_size] |
Line 474... | Line 317... | ||
474 | add esi, 4095 |
317 | add esi, 4095 |
475 | and esi, not 4095 |
318 | and esi, not 4095 |
Line 498... | Line 341... | ||
498 | call update_mem_size |
341 | call update_mem_size |
Line 499... | Line 342... | ||
499 | 342 | ||
500 | xor eax, eax |
343 | xor eax, eax |
501 | dec [pg_data.pg_mutex] |
344 | dec [pg_data.pg_mutex] |
502 | ret |
- | |
503 | 345 | ret |
|
504 | .expand: |
- | |
505 | add edi, new_app_base |
- | |
Line 506... | Line 346... | ||
506 | add esi, new_app_base |
346 | .expand: |
507 | 347 | ||
Line 508... | Line 348... | ||
508 | push esi |
348 | push esi |
Line 565... | Line 405... | ||
565 | dec [pg_data.pg_mutex] |
405 | dec [pg_data.pg_mutex] |
566 | ret |
406 | ret |
567 | endp |
407 | endp |
Line 568... | Line 408... | ||
568 | 408 | ||
569 | update_mem_size: |
409 | update_mem_size: |
570 | ; in: edx = slot shl 8 |
410 | ; in: edx = slot base |
571 | ; ebx = new memory size |
411 | ; ebx = new memory size |
Line 572... | Line 412... | ||
572 | ; destroys eax,ecx,edx |
412 | ; destroys eax,ecx,edx |
573 | 413 | ||
574 | mov [SLOT_BASE+APPDATA.mem_size+edx],ebx |
414 | mov [APPDATA.mem_size+edx],ebx |
575 | ;search threads and update |
415 | ;search threads and update |
576 | ;application memory size infomation |
416 | ;application memory size infomation |
Line 577... | Line 417... | ||
577 | mov ecx,[SLOT_BASE+APPDATA.dir_table+edx] |
417 | mov ecx,[APPDATA.dir_table+edx] |
578 | mov eax,2 |
418 | mov eax,2 |
579 | 419 | ||
Line 608... | Line 448... | ||
608 | shr eax, 12 |
448 | shr eax, 12 |
609 | mov eax, [page_tabs+eax*4] |
449 | mov eax, [page_tabs+eax*4] |
610 | and eax, 0xFFFFF000 |
450 | and eax, 0xFFFFF000 |
611 | ret |
451 | ret |
Line -... | Line 452... | ||
- | 452 | ||
612 | 453 | ||
613 | align 4 |
454 | align 4 |
614 | proc page_fault_handler |
- | |
Line -... | Line 455... | ||
- | 455 | proc page_fault_handler |
|
- | 456 | ||
- | 457 | .err_code equ ebp+32 |
|
- | 458 | .err_addr equ ebp-4 |
|
615 | pushad |
459 | |
616 | 460 | pushad |
|
617 | mov ebp, esp |
461 | mov ebp, esp |
618 | mov eax, cr2 |
- | |
619 | push eax |
- | |
Line 620... | Line 462... | ||
620 | push ds |
462 | mov eax, cr2 |
621 | push es |
463 | push eax |
622 | 464 | ||
Line 623... | Line 465... | ||
623 | mov ax, 0x10 |
465 | mov ax, app_data |
Line -... | Line 466... | ||
- | 466 | mov ds, ax |
|
- | 467 | mov es, ax |
|
- | 468 | ||
- | 469 | inc [pg_data.pages_faults] |
|
624 | mov ds, ax |
470 | |
- | 471 | ; push eax |
|
- | 472 | ; push edx |
|
Line 625... | Line 473... | ||
625 | mov es, ax |
473 | ; mov edx, 0x400 ;bochs |
626 | 474 | ; mov al,0xff ;bochs |
|
Line 627... | Line 475... | ||
627 | inc [pg_data.pages_faults] |
475 | ; out dx, al ;bochs |
628 | 476 | ; pop edx |
|
Line 629... | Line 477... | ||
629 | mov ebx, [ebp-4] |
477 | ; pop eax |
630 | 478 | ||
631 | cmp ebx, 0x80000000 |
- | |
632 | jae .user_space |
- | |
633 | - | ||
Line 634... | Line 479... | ||
634 | cmp ebx, app_page_tabs |
479 | mov ebx, [.err_addr] |
- | 480 | mov eax, [.err_code] |
|
- | 481 | ||
- | 482 | cmp ebx, OS_BASE |
|
- | 483 | jb .user_space ;ñòðà Ãèöà â ïà ìÿòè ïðèëîæåÃèÿ ; |
|
- | 484 | ||
- | 485 | cmp ebx, page_tabs |
|
- | 486 | jb .kernel_space ;ñòðà Ãèöà â ïà ìÿòè ÿäðà |
|
- | 487 | ||
- | 488 | cmp ebx, kernel_tabs |
|
- | 489 | jb .alloc;.app_tabs ;òà áëèöû ñòðà Ãèö ïðèëîæåÃèÿ ; |
|
Line -... | Line 490... | ||
- | 490 | ;ïðîñòî ñîçäà äèì îäÃó |
|
635 | jae .alloc |
491 | |
- | 492 | cmp ebx, LFB_BASE |
|
- | 493 | jb .core_tabs ;òà áëèöû ñòðà Ãèö ÿäðà |
|
- | 494 | ;Îøèáêà |
|
- | 495 | .lfb: |
|
636 | 496 | ;îáëà ñòü LFB |
|
637 | cmp ebx, page_tabs |
497 | ;Îøèáêà |
638 | jae .tab_space |
498 | jmp .fail |
639 | 499 | ||
640 | cmp ebx, 0x7DC00000 |
500 | align 4 |
641 | jae .lfb_addr |
501 | .user_space: |
- | 502 | test eax, PG_MAP |
|
Line 642... | Line 503... | ||
642 | 503 | jnz .err_access ;Ñòðà Ãèöà ïðèñóòñòâóåò |
|
643 | jmp .kernel_space |
504 | ;Îøèáêà äîñòóïà ? |
644 | 505 | ||
- | 506 | shr ebx, 12 |
|
645 | .user_space: |
507 | mov ecx, ebx |
646 | shr ebx, 12 |
508 | shr ecx, 10 |
647 | mov ecx, ebx |
509 | mov edx, [master_tab+ecx*4] |
648 | shr ecx, 10 |
510 | test edx, PG_MAP |
Line 649... | Line 511... | ||
649 | mov edx, [master_tab+ecx*4] |
511 | jz .fail ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
Line 650... | Line 512... | ||
650 | test edx, 1 |
512 | ;ÃåâåðÃûé à äðåñ â ïðîãðà ììå |
651 | jz .fail |
513 | |
652 | 514 | mov eax, [page_tabs+ebx*4] |
|
653 | mov eax, [page_tabs+ebx*4] |
515 | test eax, 2 |
654 | test eax, 2 |
516 | jz .fail ;à äðåñ ÃÃ¥ çà ðåçåðâèðîâà à äëÿ ; |
655 | jz .fail |
517 | ;èñïîëüçîâà Ãèÿ. Îøèáêà |
656 | .alloc: |
518 | .alloc: |
657 | call alloc_page |
- | |
658 | and eax, eax |
- | |
659 | jz .exit |
519 | call alloc_page |
660 | 520 | and eax, eax |
|
661 | stdcall map_page,[ebp-4],eax,dword PG_UW |
521 | jz .fail |
662 | 522 | ||
- | 523 | stdcall map_page,[ebp-4],eax,dword PG_UW |
|
- | 524 | ||
- | 525 | mov edi, [ebp-4] |
|
- | 526 | and edi, 0xFFFFF000 |
|
- | 527 | mov ecx, 1024 |
|
- | 528 | xor eax, eax |
|
- | 529 | cld |
|
- | 530 | rep stosd |
|
- | 531 | .exit: |
|
- | 532 | mov esp, ebp |
|
- | 533 | popad |
|
- | 534 | add esp, 4 |
|
- | 535 | iretd |
|
- | 536 | ||
- | 537 | .err_access: |
|
- | 538 | ;Ãèêîãäà ÃÃ¥ ïðîèñõîäèò |
|
- | 539 | jmp .fail |
|
- | 540 | ||
- | 541 | .kernel_space: |
|
- | 542 | test eax, PG_MAP |
|
- | 543 | jz .fail ;ñòðà Ãèöà ÃÃ¥ ïðèñóòñòâóåò |
|
- | 544 | ||
- | 545 | test eax, 4 ;U/S |
|
- | 546 | jnz .fail ;ïðèëîæåÃèå îáðà òèëîñü ê ïà ìÿòè |
|
- | 547 | ;ÿäðà |
|
- | 548 | test eax, 8 |
|
- | 549 | jnz .fail ;óñòà Ãîâëåà çà ðåçåðâèðîâà ÃÃûé áèò |
|
- | 550 | ;â òà áëèöà õ ñòðà Ãèö. äîáà âëåÃî â P4/Xeon |
|
- | 551 | ||
- | 552 | ;ïîïûòêà çà ïèñè â çà ùèù¸ÃÃóþ ñòðà Ãèöó ÿäðà |
|
- | 553 | ||
- | 554 | cmp ebx, tss._io_map_0 |
|
- | 555 | jb .fail |
|
- | 556 | ||
- | 557 | cmp ebx, tss._io_map_0+8192 |
|
- | 558 | jae .fail |
|
- | 559 | ||
- | 560 | ; io permission map |
|
- | 561 | ; copy-on-write protection |
|
- | 562 | ||
- | 563 | call alloc_page |
|
- | 564 | and eax, eax |
|
- | 565 | jz .fail |
|
- | 566 | ||
- | 567 | push eax |
|
- | 568 | stdcall map_page,[ebp-4],eax,dword PG_SW |
|
- | 569 | pop eax |
|
- | 570 | mov edi, [.err_addr] |
|
- | 571 | and edi, -4096 |
|
- | 572 | lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0 |
|
- | 573 | ||
- | 574 | mov ebx, esi |
|
- | 575 | shr ebx, 12 |
|
- | 576 | mov edx, [current_slot] |
|
663 | mov edi, [ebp-4] |
577 | or eax, PG_SW |
664 | and edi, 0xFFFFF000 |
- | |
665 | mov ecx, 1024 |
- | |
666 | xor eax, eax |
578 | mov [edx+APPDATA.io_map+ebx*4], eax |
667 | cld |
579 | |
668 | rep stosd |
580 | add esi, [default_io_map] |
Line -... | Line 581... | ||
- | 581 | mov ecx, 4096/4 |
|
- | 582 | cld |
|
669 | .exit: |
583 | rep movsd |
Line 670... | Line 584... | ||
670 | pop es |
584 | jmp .exit |
671 | pop ds |
585 | |
672 | mov esp, ebp |
586 | |
673 | popad |
- | |
674 | add esp, 4 |
- | |
675 | iretd |
- | |
676 | .fail: |
- | |
677 | pop es |
- | |
678 | pop ds |
- | |
679 | mov esp, ebp |
- | |
680 | popad |
- | |
681 | add esp, 4 |
- | |
682 | - | ||
683 | save_ring3_context ;debugger support |
- | |
684 | - | ||
685 | mov bl, 14 |
- | |
686 | jmp exc_c |
- | |
687 | iretd |
- | |
688 | - | ||
689 | .kernel_space: |
- | |
690 | ; shr ebx, 12 |
- | |
691 | ; mov eax, [page_tabs+ebx*4] |
- | |
692 | ; shr ebx, 10 |
- | |
693 | ; mov eax, [master_tab+ebx*4] |
- | |
694 | jmp .exit |
- | |
695 | .old_addr: |
- | |
696 | ; shr ebx, 12 |
- | |
697 | ; mov eax, [page_tabs+ebx*4] |
- | |
698 | ; shr ebx, 10 |
587 | ;ÃÃ¥ îáðà áà òûâà åì. Îøèáêà |
Line 699... | Line 588... | ||
699 | ; mov eax, [master_tab+ebx*4] |
588 | |
700 | jmp .exit |
589 | .core_tabs: |
701 | .lfb_addr: |
590 | .fail: |
Line 843... | Line 732... | ||
843 | ret |
732 | ret |
Line 844... | Line 733... | ||
844 | 733 | ||
845 | align 4 |
734 | align 4 |
Line 846... | Line 735... | ||
846 | proc set_ipc_buff |
735 | proc set_ipc_buff |
847 | - | ||
848 | mov eax,[CURRENT_TASK] |
- | |
849 | shl eax,8 |
736 | |
850 | add eax, SLOT_BASE |
737 | mov eax,[current_slot] |
851 | pushf |
738 | pushf |
852 | cli |
739 | cli |
Line 853... | Line -... | ||
853 | mov [eax+0xA0],ebx ;set fields in extended information area |
- | |
854 | mov [eax+0xA4],ecx |
740 | mov [eax+APPDATA.ipc_start],ebx ;set fields in extended information area |
855 | 741 | mov [eax+APPDATA.ipc_size],ecx |
|
856 | add ebx, new_app_base |
742 | |
Line 857... | Line 743... | ||
857 | add ecx, ebx |
743 | add ecx, ebx |
Line 888... | Line 774... | ||
888 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
774 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
889 | test edi,edi |
775 | test edi,edi |
890 | jz .no_ipc_area |
776 | jz .no_ipc_area |
Line 891... | Line 777... | ||
891 | 777 | ||
892 | mov ebx, edi |
778 | mov ebx, edi |
893 | add edi, new_app_base |
779 | ; add edi, new_app_base |
894 | and ebx, 0xFFF |
780 | and ebx, 0xFFF |
Line 895... | Line 781... | ||
895 | mov [dst_offset], ebx |
781 | mov [dst_offset], ebx |
896 | 782 | ||
Line 922... | Line 808... | ||
922 | mov ecx, [msg_size] |
808 | mov ecx, [msg_size] |
Line 923... | Line 809... | ||
923 | 809 | ||
924 | mov [edi+4], ecx |
810 | mov [edi+4], ecx |
925 | add edi, 8 |
811 | add edi, 8 |
926 | mov esi, [msg_addr] |
812 | mov esi, [msg_addr] |
927 | add esi, new_app_base |
813 | ; add esi, new_app_base |
928 | cld |
814 | cld |
Line 929... | Line 815... | ||
929 | rep movsb |
815 | rep movsb |
930 | 816 | ||
Line 980... | Line 866... | ||
980 | endp |
866 | endp |
Line 981... | Line 867... | ||
981 | 867 | ||
982 | align 4 |
868 | align 4 |
Line 983... | Line 869... | ||
983 | sysfn_meminfo: |
869 | sysfn_meminfo: |
984 | 870 | ||
985 | add ebx, new_app_base |
871 | ; add ebx, new_app_base |
Line 986... | Line 872... | ||
986 | cmp ebx, new_app_base |
872 | cmp ebx, OS_BASE |
987 | jb .fail |
873 | jae .fail |
988 | 874 | ||
989 | mov eax, [pg_data.pages_count] |
875 | mov eax, [pg_data.pages_count] |
Line 1028... | Line 914... | ||
1028 | mov [esp+36], eax |
914 | mov [esp+36], eax |
1029 | ret |
915 | ret |
1030 | @@: |
916 | @@: |
1031 | cmp eax, 13 |
917 | cmp eax, 13 |
1032 | ja @f |
918 | ja @f |
1033 | add ebx, new_app_base |
- | |
1034 | stdcall user_free, ebx |
919 | stdcall user_free, ebx |
1035 | mov [esp+36], eax |
920 | mov [esp+36], eax |
1036 | ret |
921 | ret |
1037 | @@: |
922 | @@: |
1038 | cmp eax, 14 |
923 | cmp eax, 14 |
1039 | ja @f |
924 | ja @f |
1040 | add ebx, new_app_base |
- | |
1041 | cmp ebx, new_app_base |
925 | cmp ebx, OS_BASE |
1042 | jb .fail |
926 | jae .fail |
1043 | stdcall get_event_ex, ebx, ecx |
927 | stdcall get_event_ex, ebx, ecx |
1044 | mov [esp+36], eax |
928 | mov [esp+36], eax |
1045 | ret |
929 | ret |
1046 | @@: |
930 | @@: |
1047 | cmp eax, 15 |
931 | cmp eax, 15 |
1048 | ja @f |
932 | ja @f |
1049 | mov ecx, [CURRENT_TASK] |
933 | mov ecx, [current_slot] |
1050 | shl ecx, 8 |
- | |
1051 | mov eax, [ecx+SLOT_BASE+APPDATA.fpu_handler] |
934 | mov eax, [ecx+APPDATA.fpu_handler] |
1052 | mov [ecx+SLOT_BASE+APPDATA.fpu_handler], ebx |
935 | mov [ecx+APPDATA.fpu_handler], ebx |
1053 | mov [esp+36], eax |
936 | mov [esp+36], eax |
1054 | ret |
937 | ret |
1055 | @@: |
938 | @@: |
1056 | cmp eax, 16 |
939 | cmp eax, 16 |
1057 | ja @f |
940 | ja @f |
Line 1058... | Line 941... | ||
1058 | 941 | ||
1059 | test ebx, ebx |
942 | test ebx, ebx |
1060 | jz .fail |
- | |
1061 | add ebx, new_app_base |
943 | jz .fail |
1062 | cmp ebx, new_app_base |
944 | cmp ebx, OS_BASE |
1063 | jb .fail |
945 | jae .fail |
1064 | stdcall get_service, ebx |
946 | stdcall get_service, ebx |
1065 | mov [esp+36], eax |
947 | mov [esp+36], eax |
1066 | ret |
948 | ret |
1067 | @@: |
949 | @@: |
Line 1071... | Line 953... | ||
1071 | mov [esp+36], eax |
953 | mov [esp+36], eax |
1072 | ret |
954 | ret |
1073 | @@: |
955 | @@: |
1074 | cmp eax, 18 |
956 | cmp eax, 18 |
1075 | ja @f |
957 | ja @f |
1076 | mov ecx, [CURRENT_TASK] |
958 | mov ecx, [current_slot] |
1077 | shl ecx, 8 |
- | |
1078 | mov eax, [ecx+SLOT_BASE+APPDATA.sse_handler] |
959 | mov eax, [ecx+APPDATA.sse_handler] |
1079 | mov [ecx+SLOT_BASE+APPDATA.sse_handler], ebx |
960 | mov [ecx+APPDATA.sse_handler], ebx |
1080 | mov [esp+36], eax |
961 | mov [esp+36], eax |
1081 | ret |
962 | ret |
1082 | @@: |
963 | @@: |
1083 | cmp eax, 19 |
964 | cmp eax, 19 |
1084 | ja @f |
965 | ja @f |
1085 | add ebx, new_app_base |
- | |
1086 | cmp ebx, new_app_base |
966 | cmp ebx, OS_BASE |
1087 | jb .fail |
967 | jae .fail |
1088 | stdcall load_library, ebx |
968 | stdcall load_library, ebx |
1089 | mov [esp+36], eax |
969 | mov [esp+36], eax |
1090 | ret |
970 | ret |
Line 1091... | Line 971... | ||
1091 | 971 | ||
Line 1101... | Line 981... | ||
1101 | xor eax, eax |
981 | xor eax, eax |
1102 | mov [esp+36], eax |
982 | mov [esp+36], eax |
1103 | ret |
983 | ret |
Line 1104... | Line 984... | ||
1104 | 984 | ||
1105 | align 4 |
- | |
1106 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
- | |
1107 | - | ||
1108 | mov ecx,[count] |
- | |
1109 | jecxz .end |
- | |
1110 | - | ||
1111 | mov ebx,ecx |
- | |
1112 | - | ||
1113 | mov edi,[str1] |
- | |
1114 | mov esi,edi |
- | |
1115 | xor eax,eax |
- | |
1116 | repne scasb |
- | |
1117 | neg ecx ; cx = count - strlen |
- | |
1118 | add ecx,ebx ; strlen + count - strlen |
- | |
1119 | - | ||
1120 | .okay: |
- | |
1121 | mov edi,esi |
- | |
1122 | mov esi,[str2] |
- | |
1123 | repe cmpsb |
- | |
1124 | mov al,[esi-1] |
- | |
1125 | xor ecx,ecx |
- | |
1126 | - | ||
1127 | cmp al,[edi-1] |
- | |
1128 | ja .str2_big |
- | |
1129 | je .end |
- | |
1130 | - | ||
1131 | .str1_big: |
- | |
1132 | sub ecx,2 |
- | |
1133 | - | ||
1134 | .str2_big: |
- | |
1135 | not ecx |
- | |
1136 | .end: |
- | |
1137 | mov eax,ecx |
- | |
1138 | ret |
- | |
1139 | endp |
- | |
1140 | - | ||
1141 | align 4 |
- | |
1142 | proc test_cpu |
- | |
1143 | locals |
- | |
1144 | cpu_type dd ? |
- | |
1145 | cpu_id dd ? |
- | |
1146 | cpu_Intel dd ? |
- | |
1147 | cpu_AMD dd ? |
- | |
1148 | endl |
- | |
1149 | - | ||
1150 | mov [cpu_type], 0 |
- | |
1151 | xor eax, eax |
- | |
1152 | mov [cpu_caps], eax |
- | |
1153 | mov [cpu_caps+4], eax |
- | |
1154 | - | ||
1155 | pushfd |
- | |
1156 | pop eax |
- | |
1157 | mov ecx, eax |
- | |
1158 | xor eax, 0x40000 |
- | |
1159 | push eax |
- | |
1160 | popfd |
- | |
1161 | pushfd |
- | |
1162 | pop eax |
- | |
1163 | xor eax, ecx |
- | |
1164 | mov [cpu_type], CPU_386 |
- | |
1165 | jz .end_cpuid |
- | |
1166 | push ecx |
- | |
1167 | popfd |
- | |
1168 | - | ||
1169 | mov [cpu_type], CPU_486 |
- | |
1170 | mov eax, ecx |
- | |
1171 | xor eax, 0x200000 |
- | |
1172 | push eax |
- | |
1173 | popfd |
- | |
1174 | pushfd |
- | |
1175 | pop eax |
- | |
1176 | xor eax, ecx |
- | |
1177 | je .end_cpuid |
- | |
1178 | mov [cpu_id], 1 |
- | |
1179 | - | ||
1180 | xor eax, eax |
- | |
1181 | cpuid |
- | |
1182 | mov [cpu_vendor], ebx |
- | |
1183 | mov [cpu_vendor+4], edx |
- | |
1184 | mov [cpu_vendor+8], ecx |
- | |
1185 | cmp ebx, dword [intel_str] |
- | |
1186 | jne .check_AMD |
- | |
1187 | cmp edx, dword [intel_str+4] |
- | |
1188 | jne .check_AMD |
- | |
1189 | cmp ecx, dword [intel_str+8] |
- | |
1190 | jne .check_AMD |
- | |
1191 | mov [cpu_Intel], 1 |
- | |
1192 | cmp eax, 1 |
- | |
1193 | jl .end_cpuid |
- | |
1194 | mov eax, 1 |
- | |
1195 | cpuid |
- | |
1196 | mov [cpu_sign], eax |
- | |
1197 | mov [cpu_info], ebx |
- | |
1198 | mov [cpu_caps], edx |
- | |
1199 | mov [cpu_caps+4],ecx |
- | |
1200 | - | ||
1201 | shr eax, 8 |
- | |
1202 | and eax, 0x0f |
- | |
1203 | ret |
- | |
1204 | .end_cpuid: |
- | |
1205 | mov eax, [cpu_type] |
- | |
1206 | ret |
- | |
1207 | - | ||
1208 | .check_AMD: |
- | |
1209 | cmp ebx, dword [AMD_str] |
- | |
1210 | jne .unknown |
- | |
1211 | cmp edx, dword [AMD_str+4] |
- | |
1212 | jne .unknown |
- | |
1213 | cmp ecx, dword [AMD_str+8] |
- | |
1214 | jne .unknown |
- | |
1215 | mov [cpu_AMD], 1 |
- | |
1216 | cmp eax, 1 |
- | |
1217 | jl .unknown |
- | |
1218 | mov eax, 1 |
- | |
1219 | cpuid |
- | |
1220 | mov [cpu_sign], eax |
- | |
1221 | mov [cpu_info], ebx |
- | |
1222 | mov [cpu_caps], edx |
- | |
1223 | mov [cpu_caps+4],ecx |
- | |
1224 | shr eax, 8 |
- | |
1225 | and eax, 0x0f |
- | |
1226 | ret |
- | |
1227 | .unknown: |
- | |
1228 | mov eax, 1 |
- | |
1229 | cpuid |
- | |
1230 | mov [cpu_sign], eax |
- | |
1231 | mov [cpu_info], ebx |
- | |
1232 | mov [cpu_caps], edx |
- | |
1233 | mov [cpu_caps+4],ecx |
- | |
1234 | shr eax, 8 |
- | |
1235 | and eax, 0x0f |
- | |
1236 | ret |
- | |
1237 | endp |
- | |
1238 | - | ||
1239 | MEM_WB equ 6 ;write-back memory |
- | |
1240 | MEM_WC equ 1 ;write combined memory |
- | |
1241 | MEM_UC equ 0 ;uncached memory |
- | |
1242 | - | ||
1243 | align 4 |
985 | align 4 |
Line 1244... | Line 986... | ||
1244 | proc init_mtrr |
986 | proc init_mtrr |
1245 | 987 | ||
Line 1312... | Line 1054... | ||
1312 | inc ecx |
1054 | inc ecx |
1313 | wrmsr |
1055 | wrmsr |
1314 | ret |
1056 | ret |
1315 | endp |
1057 | endp |
Line -... | Line 1058... | ||
- | 1058 | ||
- | 1059 | ||
- | 1060 | align 4 |
|
- | 1061 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
|
- | 1062 | ||
- | 1063 | mov ecx,[count] |
|
- | 1064 | jecxz .end |
|
- | 1065 | ||
- | 1066 | mov ebx,ecx |
|
- | 1067 | ||
- | 1068 | mov edi,[str1] |
|
- | 1069 | mov esi,edi |
|
- | 1070 | xor eax,eax |
|
- | 1071 | repne scasb |
|
- | 1072 | neg ecx ; cx = count - strlen |
|
- | 1073 | add ecx,ebx ; strlen + count - strlen |
|
- | 1074 | ||
- | 1075 | .okay: |
|
- | 1076 | mov edi,esi |
|
- | 1077 | mov esi,[str2] |
|
- | 1078 | repe cmpsb |
|
- | 1079 | mov al,[esi-1] |
|
- | 1080 | xor ecx,ecx |
|
- | 1081 | ||
- | 1082 | cmp al,[edi-1] |
|
- | 1083 | ja .str2_big |
|
- | 1084 | je .end |
|
- | 1085 | ||
- | 1086 | .str1_big: |
|
- | 1087 | sub ecx,2 |
|
- | 1088 | ||
- | 1089 | .str2_big: |
|
- | 1090 | not ecx |
|
- | 1091 | .end: |
|
- | 1092 | mov eax,ecx |
|
- | 1093 | ret |
|
- | 1094 | endp |
|
1316 | 1095 | ||
1317 | align 4 |
1096 | align 4 |
1318 | proc stall stdcall, delay:dword |
1097 | proc stall stdcall, delay:dword |
1319 | push ecx |
1098 | push ecx |
1320 | push edx |
1099 | push edx |
Line 1339... | Line 1118... | ||
1339 | pop edx |
1118 | pop edx |
1340 | pop ecx |
1119 | pop ecx |
1341 | ret |
1120 | ret |
1342 | endp |
1121 | endp |
Line 1343... | Line -... | ||
1343 | - | ||
1344 | iglobal |
- | |
1345 | align 4 |
- | |
1346 | intel_str db "GenuineIntel",0 |
- | |
1347 | AMD_str db "AuthenticAMD",0 |
- | |
1348 | endg |
- | |
1349 | - | ||
1350 | uglobal |
- | |
1351 | align 16 |
- | |
1352 | irq_tab rd 16 |
- | |
1353 | - | ||
1354 | MEM_FreeSpace rd 1 |
- | |
1355 | - | ||
1356 | ipc_tmp rd 1 |
- | |
1357 | ipc_pdir rd 1 |
- | |
1358 | ipc_ptab rd 1 |
- | |
1359 | - | ||
1360 | proc_mem_map rd 1 |
- | |
1361 | proc_mem_pdir rd 1 |
- | |
1362 | proc_mem_tab rd 1 |
- | |
1363 | - | ||
1364 | tmp_task_pdir rd 1 |
- | |
1365 | tmp_task_ptab rd 1 |
- | |
1366 | - | ||
1367 | fdd_buff rd 1 |
- | |
1368 | LFBSize rd 1 |
- | |
1369 | - | ||
1370 | stall_mcs rd 1 |
- | |
1371 | ;;CPUID information |
- | |
1372 | - | ||
1373 | cpu_vendor rd 3 |
- | |
1374 | cpu_sign rd 1 |
- | |
1375 | cpu_info rd 1 |
- | |
1376 | - | ||
1377 | ;;;;; cursors data |
- | |
1378 | - | ||
1379 | align 16 |
- | |
1380 | cur_saved_data rb 4096 |
- | |
1381 | - | ||
1382 | def_cursor rd 1 |
- | |
1383 | hw_cursor rd 1 |
- | |
1384 | - | ||
1385 | scr_width rd 1 |
- | |
1386 | scr_height rd 1 |
- | |
1387 | - | ||
1388 | cur_def_interl rd 1 |
- | |
1389 | cur_saved_base rd 1 |
- | |
1390 | cur_saved_interl rd 1 |
- | |
1391 | cur_saved_w rd 1 |
- | |
1392 | cur_saved_h rd 1 |
- | |
1393 | - | ||
1394 | endg |
- | |
1395 | - | ||
1396 | uglobal |
- | |
1397 | align 16 |
- | |
1398 | fpu_data: |
- | |
1399 | rb 512 |
- | |
1400 | - | ||
1401 | mst MEM_STATE |
- | |
1402 | - | ||
1403 | mem_block_map rb 512 |
- | |
1404 | event_map rb 64 |
- | |
1405 | mem_block_list rd 64 |
- | |
1406 | mem_block_mask rd 2 |
- | |
1407 | - | ||
1408 | srv.fd rd 1 |
- | |
1409 | srv.bk rd 1 |
- | |
1410 | - | ||
1411 | mem_used.fd rd 1 |
- | |
1412 | mem_used.bk rd 1 |
- | |
1413 | - | ||
1414 | mem_block_arr rd 1 |
- | |
1415 | mem_block_start rd 1 |
- | |
1416 | mem_block_end rd 1 |
- | |
1417 | - | ||
1418 | heap_mutex rd 1 |
- | |
1419 | heap_size rd 1 |
- | |
1420 | heap_free rd 1 |
- | |
1421 | heap_blocks rd 1 |
- | |
1422 | free_blocks rd 1 |
- | |
1423 | - | ||
1424 | page_start rd 1 |
- | |
1425 | page_end rd 1 |
- | |
1426 | events rd 1 |
- | |
1427 | event_start rd 1 |
- | |
1428 | event_end rd 1 |
- | |
1429 | event_uid rd 1 |
- | |
1430 | sys_page_map rd 1 |
- | |
1431 | os_stack rd 1 |
- | |
1432 | endg |
- | |
1433 | - | ||
1434 | if 0 |
- | |
1435 | push eax |
- | |
1436 | push edx |
- | |
1437 | mov edx, 0x400 ;bocsh |
- | |
1438 | mov al,0xff ;bocsh |
- | |
1439 | out dx, al ;bocsh |
- | |
1440 | pop edx |
- | |
1441 | pop eax |
- | |
1442 | end if |
- | |
1443 | 1122 | ||
1444 | align 4 |
1123 | align 4 |
1445 | k_strrchr: |
1124 | k_strrchr: |
1446 | push eax |
1125 | push eax |
1447 | xor eax,eax |
1126 | xor eax,eax |
Line 1658... | Line 1337... | ||
1658 | .L2: |
1337 | .L2: |
1659 | sub eax, [esp+4] |
1338 | sub eax, [esp+4] |
1660 | ret |
1339 | ret |
Line 1661... | Line 1340... | ||
1661 | 1340 | ||
- | 1341 | end if |
|
- | 1342 | ||
- | 1343 | if 0 |
|
- | 1344 | push eax |
|
- | 1345 | push edx |
|
- | 1346 | mov edx, 0x400 ;bochs |
|
- | 1347 | mov al,0xff ;bochs |
|
- | 1348 | out dx, al ;bochs |
|
- | 1349 | pop edx |
|
- | 1350 | pop eax |
|
- | 1351 | end if0>> |
|
- | 1352 |