diff options
author | Luca Dariz <luca@orpolo.org> | 2023-02-12 18:28:10 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-02-12 18:37:00 +0100 |
commit | 7150aa22ccc847af70a69cd8f53b3195825e2d0e (patch) | |
tree | 47c084fb9ca828ecfec3f5f58f5a4dc1a2528e2f /i386 | |
parent | 4c903ebfdd47b3556d81d34a3752c9a1afb7d7e4 (diff) | |
download | gnumach-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')
-rw-r--r-- | i386/intel/pmap.c | 28 |
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); |