aboutsummaryrefslogtreecommitdiff
path: root/i386/intel
diff options
context:
space:
mode:
authorLuca Dariz <luca@orpolo.org>2023-02-12 18:28:10 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-02-12 18:37:00 +0100
commit7150aa22ccc847af70a69cd8f53b3195825e2d0e (patch)
tree47c084fb9ca828ecfec3f5f58f5a4dc1a2528e2f /i386/intel
parent4c903ebfdd47b3556d81d34a3752c9a1afb7d7e4 (diff)
downloadgnumach-7150aa22ccc847af70a69cd8f53b3195825e2d0e.tar.gz
gnumach-7150aa22ccc847af70a69cd8f53b3195825e2d0e.tar.bz2
gnumach-7150aa22ccc847af70a69cd8f53b3195825e2d0e.zip
prepare pmap helpers for full 64 bit memory map
* i386/intel/pmap.c: start walking the page table tree from the L4 table instead of the PDP table in pmap_pte() and pmap_pde(), preparing for the kernel to run on high addresses. Message-Id: <20230212172818.1511405-2-luca@orpolo.org>
Diffstat (limited to 'i386/intel')
-rw-r--r--i386/intel/pmap.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 1f1176c4..31e039c1 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -437,10 +437,22 @@ pmap_pde(const pmap_t pmap, vm_offset_t addr)
if (pmap == kernel_pmap)
addr = kvtolin(addr);
#if PAE
- page_dir = (pt_entry_t *) ptetokv(pmap->pdpbase[lin2pdpnum(addr)]);
-#else
+ pt_entry_t *pdp_table, pdp, pde;
+#ifdef __x86_64__
+ pdp = pmap->l4base[lin2l4num(addr)];
+ if ((pdp & INTEL_PTE_VALID) == 0)
+ return PT_ENTRY_NULL;
+ pdp_table = (pt_entry_t *) ptetokv(pdp);
+#else /* __x86_64__ */
+ pdp_table = pmap->pdpbase;
+#endif /* __x86_64__ */
+ pde = pdp_table[lin2pdpnum(addr)];
+ if ((pde & INTEL_PTE_VALID) == 0)
+ return PT_ENTRY_NULL;
+ page_dir = (pt_entry_t *) ptetokv(pde);
+#else /* PAE */
page_dir = pmap->dirbase;
-#endif
+#endif /* PAE */
return &page_dir[lin2pdenum(addr)];
}
@@ -457,14 +469,20 @@ pmap_pte(const pmap_t pmap, vm_offset_t addr)
pt_entry_t *ptp;
pt_entry_t pte;
-#if PAE
+#ifdef __x86_64__
+ if (pmap->l4base == 0)
+ return(PT_ENTRY_NULL);
+#elif PAE
if (pmap->pdpbase == 0)
return(PT_ENTRY_NULL);
#else
if (pmap->dirbase == 0)
return(PT_ENTRY_NULL);
#endif
- pte = *pmap_pde(pmap, addr);
+ ptp = pmap_pde(pmap, addr);
+ if (ptp == 0)
+ return(PT_ENTRY_NULL);
+ pte = *ptp;
if ((pte & INTEL_PTE_VALID) == 0)
return(PT_ENTRY_NULL);
ptp = (pt_entry_t *)ptetokv(pte);