From ec17d5e06a4b65aab51f367ea6cbec32138c19d5 Mon Sep 17 00:00:00 2001 From: Justin Hibbits Date: Sun, 13 Oct 2019 19:33:00 +0000 Subject: [PATCH] powerpc/pmap: Tighten condition for removing tracked pages in Book-E pmap There are cases where there's no vm_page_t structure for a given physical address, such as the CCSR. In this case, trying to obtain the md.page_tracked struct member would lead to a NULL dereference, and panic. Tighten this up by checking for kernel_pmap AND that the page structure actually exists before dereferencing. The flag can only be set when it's tracked in the kernel pmap anyway. MFC after: 3 weeks --- sys/powerpc/booke/pmap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 1d141f75d0e..87ea234d9b6 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -1177,7 +1177,7 @@ pte_remove(mmu_t mmu, pmap_t pmap, vm_offset_t va, u_int8_t flags) /* Remove pv_entry from pv_list. */ pv_remove(pmap, va, m); - } else if (m->md.pv_tracked) { + } else if (pmap == kernel_pmap && m && m->md.pv_tracked) { pv_remove(pmap, va, m); if (TAILQ_EMPTY(&m->md.pv_list)) m->md.pv_tracked = false; @@ -1373,7 +1373,7 @@ pte_remove(mmu_t mmu, pmap_t pmap, vm_offset_t va, uint8_t flags) vm_page_aflag_set(m, PGA_REFERENCED); pv_remove(pmap, va, m); - } else if (m->md.pv_tracked) { + } else if (pmap == kernel_pmap && m && m->md.pv_tracked) { /* * Always pv_insert()/pv_remove() on MPC85XX, in case DPAA is * used. This is needed by the NCSW support code for fast