aboutsummaryrefslogtreecommitdiff
path: root/i386/intel
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-14 01:03:30 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-14 01:03:30 +0200
commit0858a1817f58a002945c4c58fea196f2b14ba460 (patch)
treecdab5212e520895b38766b877ad5ab4652d7209a /i386/intel
parentf22235e8d190cb6467aa755dc83bf85e7e95af04 (diff)
downloadgnumach-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.c11
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;