diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-08-14 01:03:30 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-08-14 01:03:30 +0200 |
commit | 0858a1817f58a002945c4c58fea196f2b14ba460 (patch) | |
tree | cdab5212e520895b38766b877ad5ab4652d7209a /i386/intel | |
parent | f22235e8d190cb6467aa755dc83bf85e7e95af04 (diff) | |
download | gnumach-0858a1817f58a002945c4c58fea196f2b14ba460.tar.gz gnumach-0858a1817f58a002945c4c58fea196f2b14ba460.tar.bz2 gnumach-0858a1817f58a002945c4c58fea196f2b14ba460.zip |
x86_64: Fix memory leak on pmap destruction
We do need to go through the whole page table, to release the pdpt-s and
pdet-s that map the kernel. Only the ptpt-s that map the kernel are shared
between tasks.
Diffstat (limited to 'i386/intel')
-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; |