diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-05-21 21:14:32 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-05-21 21:14:32 +0200 |
commit | 659c109b6285632058bf9ca81bf450371165bd63 (patch) | |
tree | ce579b81ff65480ebf7028226a9d798ff4209df6 /i386/intel | |
parent | 222020cff440921e987dcd92e308dd775e5d543d (diff) | |
download | gnumach-659c109b6285632058bf9ca81bf450371165bd63.tar.gz gnumach-659c109b6285632058bf9ca81bf450371165bd63.tar.bz2 gnumach-659c109b6285632058bf9ca81bf450371165bd63.zip |
pmap: Simplify code
Notably, ptes_per_vm_page is meaninful for the pte level anyway.
Diffstat (limited to 'i386/intel')
-rw-r--r-- | i386/intel/pmap.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c index 3a30271e..18cfa18b 100644 --- a/i386/intel/pmap.c +++ b/i386/intel/pmap.c @@ -465,7 +465,7 @@ pmap_pde(const pmap_t pmap, vm_offset_t addr) #if PAE pt_entry_t *pdp_table; pdp_table = pmap_ptp(pmap, addr); - if (pdp_table == 0) + if (pdp_table == PT_ENTRY_NULL) return(PT_ENTRY_NULL); pt_entry_t pde = *pdp_table; if ((pde & INTEL_PTE_VALID) == 0) @@ -1463,44 +1463,38 @@ void pmap_destroy(pmap_t p) if (!(pdp & INTEL_PTE_VALID)) continue; pt_entry_t *pdpbase = (pt_entry_t*) ptetokv(pdp); - for (int l3i = 0; l3i < 512; l3i++) { + for (int l3i = 0; l3i < NPTES; l3i++) #else /* __x86_64__ */ pt_entry_t *pdpbase = p->pdpbase; - for (int l3i = 0; l3i < lin2pdpnum(VM_MAX_USER_ADDRESS); l3i++) { + for (int l3i = 0; l3i < lin2pdpnum(VM_MAX_USER_ADDRESS); l3i++) #endif /* __x86_64__ */ + { pt_entry_t pde = (pt_entry_t) pdpbase[l3i]; if (!(pde & INTEL_PTE_VALID)) continue; pt_entry_t *pdebase = (pt_entry_t*) ptetokv(pde); - for (int l2i = 0; l2i < 512; l2i++) { + for (int l2i = 0; l2i < NPTES; l2i++) #else /* PAE */ pt_entry_t *pdebase = p->dirbase; - for (int l2i = 0; l2i < lin2pdenum(VM_MAX_USER_ADDRESS); l2i++) { + for (int l2i = 0; l2i < lin2pdenum(VM_MAX_USER_ADDRESS); l2i++) #endif /* PAE */ + { pt_entry_t pte = (pt_entry_t) pdebase[l2i]; if (!(pte & INTEL_PTE_VALID)) continue; kmem_cache_free(&pt_cache, (vm_offset_t)ptetokv(pte)); } -#if PAE kmem_cache_free(&pd_cache, (vm_offset_t)pdebase); +#if PAE } -#ifdef __x86_64__ kmem_cache_free(&pdpt_cache, (vm_offset_t)pdpbase); - } -#endif /* __x86_64__ */ -#endif /* PAE */ - - /* Finally, free the page table tree root and the pmap itself */ -#if PAE #ifdef __x86_64__ + } kmem_cache_free(&l4_cache, (vm_offset_t) p->l4base); -#else /* __x86_64__ */ - kmem_cache_free(&pdpt_cache, (vm_offset_t) p->pdpbase); #endif /* __x86_64__ */ -#else /* PAE */ - kmem_cache_free(&pd_cache, (vm_offset_t) p->dirbase); #endif /* PAE */ + + /* Finally, free the pmap itself */ kmem_cache_free(&pmap_cache, (vm_offset_t) p); } @@ -2092,9 +2086,9 @@ static inline pt_entry_t* pmap_expand(pmap_t pmap, vm_offset_t v, int spl) { #ifdef PAE #ifdef __x86_64__ - pmap_expand_level(pmap, v, spl, pmap_ptp, pmap_l4base, ptes_per_vm_page, &pdpt_cache); + pmap_expand_level(pmap, v, spl, pmap_ptp, pmap_l4base, 1, &pdpt_cache); #endif /* __x86_64__ */ - pmap_expand_level(pmap, v, spl, pmap_pde, pmap_ptp, ptes_per_vm_page, &pd_cache); + pmap_expand_level(pmap, v, spl, pmap_pde, pmap_ptp, 1, &pd_cache); #endif /* PAE */ return pmap_expand_level(pmap, v, spl, pmap_pte, pmap_pde, ptes_per_vm_page, &pt_cache); } @@ -2471,20 +2465,22 @@ void pmap_collect(pmap_t p) if (!(pdp & INTEL_PTE_VALID)) continue; pt_entry_t *pdpbase = (pt_entry_t*) ptetokv(pdp); - for (int l3i = 0; l3i < 512; l3i++) { + for (int l3i = 0; l3i < NPTES; l3i++) #else /* __x86_64__ */ pt_entry_t *pdpbase = p->pdpbase; - for (int l3i = 0; l3i < lin2pdpnum(VM_MAX_USER_ADDRESS); l3i++) { + for (int l3i = 0; l3i < lin2pdpnum(VM_MAX_USER_ADDRESS); l3i++) #endif /* __x86_64__ */ + { pt_entry_t pde = (pt_entry_t ) pdpbase[l3i]; if (!(pde & INTEL_PTE_VALID)) continue; pt_entry_t *pdebase = (pt_entry_t*) ptetokv(pde); - for (int l2i = 0; l2i < 512; l2i++) { + for (int l2i = 0; l2i < NPTES; l2i++) #else /* PAE */ pt_entry_t *pdebase = p->dirbase; - for (int l2i = 0; l2i < lin2pdenum(VM_MAX_USER_ADDRESS); l2i++) { + for (int l2i = 0; l2i < lin2pdenum(VM_MAX_USER_ADDRESS); l2i++) #endif /* PAE */ + { pt_entry_t pte = (pt_entry_t) pdebase[l2i]; if (!(pte & INTEL_PTE_VALID)) continue; @@ -2551,10 +2547,10 @@ void pmap_collect(pmap_t p) } } #if PAE - // TODO check l2? + // TODO check l2 } #ifdef __x86_64__ - // TODO check l3? + // TODO check l3 } #endif /* __x86_64__ */ #endif /* PAE */ |