diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-29 17:36:41 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-29 17:36:41 +0200 |
| commit | 717556178c2017e374ee1108e6b25a24507a1dde (patch) | |
| tree | 1ff935e5ee866a52ca09384a6ffa58ec334e8ac2 /src/core/paging.cc | |
| parent | f37f5d86b74870e878f69bd41a3c70a59c4ce1c1 (diff) | |
Update paging system
Diffstat (limited to 'src/core/paging.cc')
| -rw-r--r-- | src/core/paging.cc | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/core/paging.cc b/src/core/paging.cc index 7ae1b25..b21e660 100644 --- a/src/core/paging.cc +++ b/src/core/paging.cc @@ -136,7 +136,7 @@ void paging_deallocate_table(u64* table){ } } -void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options){ +void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options, char useKernelTables){ u16 pml4=virt>>39&0x1FF; u16 pdp=virt>>30&0x1FF; u16 pd=virt>>21&0x1FF; @@ -145,29 +145,30 @@ void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options){ // Solve pdp if(pml4_table[pml4] == 0){ - pml4_table[pml4]=(u64)paging_allocate_table(); + pml4_table[pml4]=(u64)(useKernelTables ? paging_allocate_table() : VIRT(PAGE_ALLOCATE())); pml4_table[pml4]|=options; - paging_allocate_addr(pml4_table,virt,phy,options); + paging_allocate_addr(pml4_table,virt,phy,options,useKernelTables); return; } - + // Solve pd u64* pdp_table=(u64*)(VIRT(PAGE(pml4_table[pml4]))); if(pdp_table[pdp] == 0){ - pdp_table[pdp]=(u64)paging_allocate_table(); + pdp_table[pdp]=(u64)(useKernelTables ? paging_allocate_table() : VIRT(PAGE_ALLOCATE())); pdp_table[pdp]|=options; - paging_allocate_addr(pml4_table,virt,phy,options); + paging_allocate_addr(pml4_table,virt,phy,options,useKernelTables); return; } - + // Solve pt u64* pd_table=(u64*)(VIRT(PAGE(pdp_table[pdp]))); if(pd_table[pd] == 0){ - pd_table[pd]=(u64)paging_allocate_table(); + pd_table[pd]=(u64)(useKernelTables ? paging_allocate_table() : VIRT(PAGE_ALLOCATE())); pd_table[pd]|=options; - paging_allocate_addr(pml4_table,virt,phy,options); + paging_allocate_addr(pml4_table,virt,phy,options,useKernelTables); return; } + // Solve address u64* pt_table=(u64*)(VIRT(PAGE(pd_table[pd]))); if(pt_table[pt] == 0){ @@ -175,4 +176,12 @@ void paging_allocate_addr(u64* pml4_table, u64 virt, u64 phy, u16 options){ pt_table[pt]|=options; return; } + +} + +u64* paging_create_task(int npages){ + u64 *pml4=VIRT(PAGE_ALLOCATE()); + u64 sum=(u64)pml4+kvar_kernel_vma; + paging_allocate_addr(pml4, 0, (u64)PAGE_ALLOCATE(), PAGING_OPT_P|PAGING_OPT_RW, 0); + return pml4; }
\ No newline at end of file |
