aboutsummaryrefslogtreecommitdiff
path: root/src/core/paging.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/paging.cc')
-rw-r--r--src/core/paging.cc27
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