Rev 172 | Rev 192 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 172 | Rev 188 | ||
---|---|---|---|
Line 99... | Line 99... | ||
99 | stdcall alloc_pages, dword 32 |
99 | stdcall alloc_pages, dword 32 |
100 | mov ecx, 32 |
100 | mov ecx, 32 |
101 | mov edx, eax |
101 | mov edx, eax |
102 | mov edi, HEAP_BASE |
102 | mov edi, HEAP_BASE |
103 | - | ||
104 | .l1: |
103 | .l1: |
105 | stdcall map_page,edi,edx,PG_SW |
104 | stdcall map_page,edi,edx,PG_SW |
106 | add edi, 0x1000 |
105 | add edi, 0x1000 |
107 | add edx, 0x1000 |
106 | add edx, 0x1000 |
108 | dec ecx |
107 | dec ecx |
Line 624... | Line 623... | ||
624 | restore block_flags |
623 | restore block_flags |
625 | 624 | ||
Line 626... | Line 625... | ||
626 | ;;;;;;;;;;;;;; USER ;;;;;;;;;;;;;;;;; |
625 | ;;;;;;;;;;;;;; USER ;;;;;;;;;;;;;;;;; |
Line -... | Line 626... | ||
- | 626 | ||
- | 627 | HEAP_TOP equ 0x5FC00000 |
|
627 | 628 | ||
628 | align 4 |
- | |
629 | proc init_heap stdcall, heap_size:dword |
- | |
630 | locals |
- | |
631 | tab_count dd ? |
629 | align 4 |
Line 632... | Line 630... | ||
632 | endl |
630 | proc init_heap |
633 | 631 | ||
634 | mov ebx,[CURRENT_TASK] |
632 | mov ebx,[CURRENT_TASK] |
635 | shl ebx,8 |
633 | shl ebx,8 |
636 | mov eax, [PROC_BASE+APPDATA.heap_top+ebx] |
634 | mov eax, [PROC_BASE+APPDATA.heap_top+ebx] |
637 | test eax, eax |
635 | test eax, eax |
638 | jz @F |
636 | jz @F |
639 | sub eax,[PROC_BASE+APPDATA.heap_base+ebx] |
637 | sub eax,[PROC_BASE+APPDATA.heap_base+ebx] |
640 | sub eax, 4096 |
638 | sub eax, 4096 |
641 | ret |
- | |
642 | @@: |
- | |
643 | mov edx, [heap_size] |
- | |
644 | and edx, edx |
- | |
645 | jz .exit |
- | |
646 | add edx, (4095+4096) |
- | |
647 | and edx, not 4095 |
- | |
648 | mov [heap_size], edx |
- | |
649 | add edx, 0x003FFFFF |
- | |
650 | and edx, not 0x003FFFFF |
- | |
651 | shr edx, 22 |
- | |
652 | mov [tab_count], edx |
639 | ret |
653 | 640 | @@: |
|
654 | mov esi, [PROC_BASE+APPDATA.mem_size+ebx] |
641 | mov esi, [PROC_BASE+APPDATA.mem_size+ebx] |
655 | add esi, 0x003FFFFF |
642 | add esi, 4095 |
656 | and esi, not 0x003FFFFF |
643 | and esi, not 4095 |
657 | mov edi, esi |
- | |
658 | mov [PROC_BASE+APPDATA.heap_base+ebx], esi |
644 | mov eax, HEAP_TOP |
659 | add esi, [heap_size] |
- | |
660 | mov [PROC_BASE+APPDATA.heap_top+ebx], esi |
- | |
661 | - | ||
662 | mov eax, cr3 |
- | |
663 | and eax, not 0xFFF |
- | |
664 | stdcall map_page,[current_pdir],eax,dword PG_SW |
- | |
665 | - | ||
666 | add edi, new_app_base |
- | |
667 | @@: |
- | |
668 | call alloc_page |
- | |
669 | test eax, eax |
- | |
670 | jz .exit |
- | |
671 | - | ||
672 | stdcall map_page_table, [current_pdir], edi, eax |
- | |
673 | add edi, 0x00400000 |
- | |
674 | dec edx |
- | |
675 | jnz @B |
- | |
676 | - | ||
677 | mov ecx, [tab_count] |
- | |
678 | shl ecx, 12-2 |
- | |
679 | mov ebx,[CURRENT_TASK] |
- | |
680 | shl ebx,8 |
- | |
681 | mov edi, [PROC_BASE+APPDATA.heap_base+ebx] |
- | |
682 | add edi, new_app_base |
- | |
683 | shr edi, 10 |
- | |
684 | mov esi, edi |
- | |
685 | add edi, pages_tab |
- | |
686 | xor eax, eax |
- | |
Line 687... | Line 645... | ||
687 | cld |
645 | mov [PROC_BASE+APPDATA.heap_base+ebx], esi |
688 | rep stosd |
- | |
689 | 646 | mov [PROC_BASE+APPDATA.heap_top+ebx], eax |
|
- | 647 | ||
690 | stdcall map_page,[current_pdir],dword PG_UNMAP |
648 | sub eax, esi |
691 | 649 | add esi, new_app_base |
|
692 | mov ebx, [heap_size] |
650 | shr esi, 10 |
693 | mov eax, ebx |
651 | mov ecx, eax |
694 | sub eax, 4096 |
652 | sub eax, 4096 |
695 | or ebx, FREE_BLOCK |
653 | or ecx, FREE_BLOCK |
696 | mov [pages_tab+esi], ebx |
654 | mov [pages_tab+esi], ecx |
697 | ret |
655 | ret |
698 | .exit: |
656 | .exit: |
Line 774... | Line 732... | ||
774 | sub esi, 4096 |
732 | sub esi, 4096 |
775 | shr esi, 12 |
733 | shr esi, 12 |
776 | mov eax, [pages_tab+esi*4] |
734 | mov eax, [pages_tab+esi*4] |
777 | test eax, USED_BLOCK |
735 | test eax, USED_BLOCK |
778 | jz @f |
736 | jz .not_used |
Line 779... | Line 737... | ||
779 | 737 | ||
780 | and eax, not 4095 |
738 | and eax, not 4095 |
781 | mov ecx, eax |
739 | mov ecx, eax |
782 | or eax, FREE_BLOCK |
740 | or eax, FREE_BLOCK |
783 | mov [pages_tab+esi*4], eax |
741 | mov [pages_tab+esi*4], eax |
784 | inc esi |
742 | inc esi |
785 | sub ecx, 4096 |
743 | sub ecx, 4096 |
786 | shr ecx, 12 |
744 | shr ecx, 12 |
- | 745 | .release: |
|
787 | .release: |
746 | xor eax, eax |
- | 747 | xchg eax, [pages_tab+esi*4] |
|
- | 748 | test eax, 1 |
|
788 | mov eax, [pages_tab+esi*4] |
749 | jz @F |
- | 750 | call free_page |
|
789 | call free_page |
751 | @@: |
790 | inc esi |
752 | inc esi |
791 | dec ecx |
753 | dec ecx |
792 | jnz .release |
754 | jnz .release |
793 | @@: |
755 | .not_used: |
794 | mov ebx, [CURRENT_TASK] |
756 | mov ebx, [CURRENT_TASK] |
795 | shl ebx, 8 |
757 | shl ebx, 8 |
796 | mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base |
758 | mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base |
797 | mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top |
759 | mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top |