diff options
-rw-r--r-- | i386/intel/pmap.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c index 8aa27867..a9879340 100644 --- a/i386/intel/pmap.c +++ b/i386/intel/pmap.c @@ -1462,21 +1462,24 @@ void pmap_destroy(pmap_t p) */ #if PAE #ifdef __x86_64__ - for (int l4i = 0; l4i < lin2l4num(VM_MAX_USER_ADDRESS); l4i++) { + for (int l4i = 0; l4i < NPTES; l4i++) { pt_entry_t pdp = (pt_entry_t) p->l4base[l4i]; if (!(pdp & INTEL_PTE_VALID)) continue; pt_entry_t *pdpbase = (pt_entry_t*) ptetokv(pdp); - 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++) #endif /* __x86_64__ */ - { + for (int l3i = 0; l3i < NPTES; l3i++) { pt_entry_t pde = (pt_entry_t) pdpbase[l3i]; if (!(pde & INTEL_PTE_VALID)) continue; pt_entry_t *pdebase = (pt_entry_t*) ptetokv(pde); + if ( +#ifdef __x86_64__ + l4i <= lin2l4num(VM_MAX_USER_ADDRESS) && +#endif /* __x86_64__ */ + l3i <= lin2pdpnum(VM_MAX_USER_ADDRESS)) for (int l2i = 0; l2i < NPTES; l2i++) #else /* PAE */ pt_entry_t *pdebase = p->dirbase; |