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.cc38
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;