aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2018-11-27 21:40:51 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2018-11-27 21:40:51 +0000
commit32b083531ff504a49e03be47059d4bd53d518e8a (patch)
treef6027a287fa86f9d0a886d29105474271aa10515 /sys/amd64
parentfbec776de09a24e5ee7026ab07717df4e4cbdaa2 (diff)
downloadsrc-32b083531ff504a49e03be47059d4bd53d518e8a.tar.gz
src-32b083531ff504a49e03be47059d4bd53d518e8a.zip
Fix assert condition in pmap_large_unmap().
pmap_large_unmap() asserts that an unmapping request covers the entirety of a 2M or 1G page. The logic in the asserts was out of date with the loop logic. Correct the test to actually check that destroying the current superpage mapping does not unmap addresses beyond those requested by the caller. Submitted by: D Scott Phillips <d.scott.phillips@intel.com> Reviewed by: alc MFC after: 1 week Differential revision: https://reviews.freebsd.org/D18345
Notes
Notes: svn path=/head/; revision=341096
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/pmap.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index bd72f801ca97..737dc632e3ce 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -8441,9 +8441,10 @@ pmap_large_unmap(void *svaa, vm_size_t len)
KASSERT((va & PDPMASK) == 0,
("PDPMASK bit set, va %#lx pdpe %#lx pdp %#lx", va,
(u_long)pdpe, pdp));
- KASSERT(len <= NBPDP,
- ("len < NBPDP, sva %#lx va %#lx pdpe %#lx pdp %#lx "
- "len %#lx", sva, va, (u_long)pdpe, pdp, len));
+ KASSERT(va + NBPDP <= sva + len,
+ ("unmap covers partial 1GB page, sva %#lx va %#lx "
+ "pdpe %#lx pdp %#lx len %#lx", sva, va,
+ (u_long)pdpe, pdp, len));
*pdpe = 0;
inc = NBPDP;
continue;
@@ -8457,9 +8458,10 @@ pmap_large_unmap(void *svaa, vm_size_t len)
KASSERT((va & PDRMASK) == 0,
("PDRMASK bit set, va %#lx pde %#lx pd %#lx", va,
(u_long)pde, pd));
- KASSERT(len <= NBPDR,
- ("len < NBPDR, sva %#lx va %#lx pde %#lx pd %#lx "
- "len %#lx", sva, va, (u_long)pde, pd, len));
+ KASSERT(va + NBPDR <= sva + len,
+ ("unmap covers partial 2MB page, sva %#lx va %#lx "
+ "pde %#lx pd %#lx len %#lx", sva, va, (u_long)pde,
+ pd, len));
pde_store(pde, 0);
inc = NBPDR;
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));