From f13b26eeb4f9afba3a1aed2516655b34139979aa Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Tue, 27 Apr 2021 19:02:17 +0200 Subject: Making kernel Higher-Half --- src/core/paging.cc | 62 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 22 deletions(-) (limited to 'src/core/paging.cc') diff --git a/src/core/paging.cc b/src/core/paging.cc index 8e58511..73a5c63 100644 --- a/src/core/paging.cc +++ b/src/core/paging.cc @@ -4,29 +4,50 @@ #include "libs/string.hpp" char paging_status[PAGING_MAX_PAGE / 8]; -u64* kpml4; +u64 kernel_vma,stack_pma,userspace_pma; +u64 kpages[MAX_TABLES][512] __attribute__((aligned(4096))); +int kpages_next=1; // First page is for the pml4 + +u64* paging_allocate_table(){ + u64 addr=(u64)kpages[kpages_next]; + u64* allocated=(u64*)(addr-kernel_vma); + kpages_next++; + return allocated; +} void paging_enable() { + // Init linker variables + asm("movq $__kernel_vma, %0":"=r"(kernel_vma)); + asm("movq $__userspace_pma, %0":"=r"(userspace_pma)); + asm("movq $__stack_pma, %0":"=r"(stack_pma)); + // Init status for (int i = 0; i < PAGING_MAX_PAGE / 8; i++) { paging_status[i] = 0; } + // Init tables + for(int i=0;i>39&0x1FF; u16 pdp=virt>>30&0x1FF; u16 pd=virt>>21&0x1FF; @@ -141,27 +157,29 @@ void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options){ if(pml4_table[pml4] == 0){ pml4_table[pml4]=(u64)paging_allocate_table(); pml4_table[pml4]|=options; - paging_allocate_addr(pml4_table,virt,phy,options); + paging_allocate_addr(pml4_table,virt,phy,options,offset); return; } + // Solve pd - u64* pdp_table=(u64*)PAGE(pml4_table[pml4]); + u64* pdp_table=(u64*)(PAGE(pml4_table[pml4])+offset); if(pdp_table[pdp] == 0){ pdp_table[pdp]=(u64)paging_allocate_table(); pdp_table[pdp]|=options; - paging_allocate_addr(pml4_table,virt,phy,options); + paging_allocate_addr(pml4_table,virt,phy,options,offset); return; } + // Solve pt - u64* pd_table=(u64*)PAGE(pdp_table[pdp]); + u64* pd_table=(u64*)(PAGE(pdp_table[pdp])+offset); if(pd_table[pd] == 0){ pd_table[pd]=(u64)paging_allocate_table(); pd_table[pd]|=options; - paging_allocate_addr(pml4_table,virt,phy,options); + paging_allocate_addr(pml4_table,virt,phy,options,offset); return; } // Solve address - u64* pt_table=(u64*)PAGE(pd_table[pd]); + u64* pt_table=(u64*)(PAGE(pd_table[pd])+offset); if(pt_table[pt] == 0){ pt_table[pt]=PAGE(phy); pt_table[pt]|=options; -- cgit v1.2.3