diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-29 15:01:54 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-29 15:01:54 +0200 |
| commit | f37f5d86b74870e878f69bd41a3c70a59c4ce1c1 (patch) | |
| tree | 65620f0504fea111ba870457f32bc072dc27fe7a /src/core/paging.cc | |
| parent | fde8a1ab65d5e33d90123a3aaa9b5c15e249689f (diff) | |
Debug memory
Diffstat (limited to 'src/core/paging.cc')
| -rw-r--r-- | src/core/paging.cc | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/src/core/paging.cc b/src/core/paging.cc index c283c57..7ae1b25 100644 --- a/src/core/paging.cc +++ b/src/core/paging.cc @@ -11,11 +11,14 @@ u64* paging_allocate_table(){ u64 addr=(u64)kpages[kpages_next]; u64* allocated=(u64*)(addr-kvar_kernel_vma); kpages_next++; + if(kpages_next>=PAGING_MAX_PAGE){ + printk("Could not allocate more page structures. Kernel Panic!"); + while(1); + } return allocated; } void paging_enable() { - // Init status for (int i = 0; i < PAGING_MAX_PAGE / 8; i++) { paging_status[i] = 0; @@ -33,10 +36,11 @@ void paging_enable() { // Setting up new kernel address space for(u64 i=0;i<=0x10000000;i+=4096){ - paging_allocate_addr(kpages[0],kvar_kernel_vma+i,i, 0x3,0); // Identity map + PAGE_MAP(i); } + // 4096 bytes stack - paging_allocate_addr(kpages[0],kvar_kernel_vma-4096,kvar_stack_pma,0x3,0); + PAGE_MAP_PHY(-4096, kvar_stack_pma); // Load new pml4 u64 kpage_phy=((u64)kpages[0]-kvar_kernel_vma); @@ -46,18 +50,6 @@ void paging_enable() { :: "r" (kpage_phy)); } -u64 paging_as_phy(u64* pml4_table, u64 virt){ - u16 pml4=virt>>39&0x1FF; - u16 pdp=virt>>30&0x1FF; - u16 pd=virt>>21&0x1FF; - u16 pt=(virt>>12)&0x1FF; - - u64* pdp_table=(u64*)PAGE(pml4_table[pml4]); - u64* pd_table=(u64*)PAGE(pdp_table[pdp]); - u64* pt_table=(u64*)PAGE(pd_table[pd]); - return((PAGE(pt_table[pt]))|(virt&0xFFF)); -} - u64* paging_allocate_contiguous(int npages){ int n_contiguous=0; for (int i = 0; i < PAGING_MAX_PAGE / 8; i++) { @@ -94,6 +86,8 @@ void paging_deallocate(u64 addr){ paging_status[page_number/8]=byte&(~(1<<(page_number%8))); } + +/// TODO: Debug addess void paging_deallocate_pml4(u64* pml4){ for(int i=0;i<512;i++){ u64* pdp=(u64*)PAGE(pml4[i]); @@ -142,7 +136,7 @@ void paging_deallocate_table(u64* table){ } } -void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options, u64 offset){ +void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options){ u16 pml4=virt>>39&0x1FF; u16 pdp=virt>>30&0x1FF; u16 pd=virt>>21&0x1FF; @@ -153,29 +147,29 @@ void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options, u64 o if(pml4_table[pml4] == 0){ pml4_table[pml4]=(u64)paging_allocate_table(); pml4_table[pml4]|=options; - paging_allocate_addr(pml4_table,virt,phy,options,offset); + paging_allocate_addr(pml4_table,virt,phy,options); return; } // Solve pd - u64* pdp_table=(u64*)(PAGE(pml4_table[pml4])+offset); + u64* pdp_table=(u64*)(VIRT(PAGE(pml4_table[pml4]))); if(pdp_table[pdp] == 0){ pdp_table[pdp]=(u64)paging_allocate_table(); pdp_table[pdp]|=options; - paging_allocate_addr(pml4_table,virt,phy,options,offset); + paging_allocate_addr(pml4_table,virt,phy,options); return; } // Solve pt - u64* pd_table=(u64*)(PAGE(pdp_table[pdp])+offset); + u64* pd_table=(u64*)(VIRT(PAGE(pdp_table[pdp]))); if(pd_table[pd] == 0){ pd_table[pd]=(u64)paging_allocate_table(); pd_table[pd]|=options; - paging_allocate_addr(pml4_table,virt,phy,options,offset); + paging_allocate_addr(pml4_table,virt,phy,options); return; } // Solve address - u64* pt_table=(u64*)(PAGE(pd_table[pd])+offset); + u64* pt_table=(u64*)(VIRT(PAGE(pd_table[pd]))); if(pt_table[pt] == 0){ pt_table[pt]=PAGE(phy); pt_table[pt]|=options; |
