aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2016-05-27 18:45:11 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2016-05-27 18:45:11 +0000
commit4230ac2fa524778c65a08c6f9ece4e18840cc9c7 (patch)
treee1183babf4087a05e1660259647a6e11a530ca97 /sys/amd64
parent7b8e76f4805c5c85257950a7f3b3c7f4c60a39af (diff)
downloadsrc-4230ac2fa524778c65a08c6f9ece4e18840cc9c7.tar.gz
src-4230ac2fa524778c65a08c6f9ece4e18840cc9c7.zip
In pmap_advise(), avoid leaking DI start for EPT pmaps which needs A/D
emulation. Assert that syscalls do not leak DI. Reported by: gjb Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=300863
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/pmap.c2
-rw-r--r--sys/amd64/amd64/trap.c4
2 files changed, 5 insertions, 1 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index cc769747a255..7a93e7605f3b 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -6060,7 +6060,6 @@ pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
if (advice != MADV_DONTNEED && advice != MADV_FREE)
return;
- pmap_delayed_invl_started();
/*
* A/D bit emulation requires an alternate code path when clearing
@@ -6077,6 +6076,7 @@ pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
PG_V = pmap_valid_bit(pmap);
PG_RW = pmap_rw_bit(pmap);
anychanged = FALSE;
+ pmap_delayed_invl_started();
PMAP_LOCK(pmap);
for (; sva < eva; sva = va_next) {
pml4e = pmap_pml4e(pmap, sva);
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 620a46185f63..1b85b3298daa 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -959,6 +959,10 @@ amd64_syscall(struct thread *td, int traced)
KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td),
("System call %s returning with mangled pcb_save",
syscallname(td->td_proc, sa.code)));
+ KASSERT(td->td_md.md_invl_gen.gen == 0,
+ ("System call %s returning with leaked invl_gen %lu",
+ syscallname(td->td_proc, sa.code), td->td_md.md_invl_gen.gen));
+
syscallret(td, error, &sa);