summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2020-08-25 17:49:58 +0000
committerkettenis <kettenis@openbsd.org>2020-08-25 17:49:58 +0000
commit502a56d12303fcc4987373ac4094027c62a63a91 (patch)
treec5bcfd3437f6399e1b0ce346c5101b7c451f3a6f
parentFix undefined symbol. (diff)
downloadwireguard-openbsd-502a56d12303fcc4987373ac4094027c62a63a91.tar.xz
wireguard-openbsd-502a56d12303fcc4987373ac4094027c62a63a91.zip
Clear user SLB upon context switch.
-rw-r--r--sys/arch/powerpc64/include/pmap.h3
-rw-r--r--sys/arch/powerpc64/powerpc64/machdep.c4
-rw-r--r--sys/arch/powerpc64/powerpc64/pmap.c13
3 files changed, 14 insertions, 6 deletions
diff --git a/sys/arch/powerpc64/include/pmap.h b/sys/arch/powerpc64/include/pmap.h
index 14316fe5fd0..06d44eddb1a 100644
--- a/sys/arch/powerpc64/include/pmap.h
+++ b/sys/arch/powerpc64/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.14 2020/08/17 16:55:41 kettenis Exp $ */
+/* $OpenBSD: pmap.h,v 1.15 2020/08/25 17:49:58 kettenis Exp $ */
/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -69,6 +69,7 @@ void pmap_bootstrap_cpu(void);
int pmap_slbd_fault(pmap_t, vaddr_t);
int pmap_set_user_slb(pmap_t, vaddr_t, vaddr_t *, vsize_t *);
+void pmap_clear_user_slb(void);
void pmap_unset_user_slb(void);
#ifdef DDB
diff --git a/sys/arch/powerpc64/powerpc64/machdep.c b/sys/arch/powerpc64/powerpc64/machdep.c
index 96e36a550c1..58f894c7a0d 100644
--- a/sys/arch/powerpc64/powerpc64/machdep.c
+++ b/sys/arch/powerpc64/powerpc64/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.57 2020/08/23 10:07:51 kettenis Exp $ */
+/* $OpenBSD: machdep.c,v 1.58 2020/08/25 17:49:58 kettenis Exp $ */
/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -888,6 +888,8 @@ cpu_switchto(struct proc *old, struct proc *new)
tf->srr1 &= ~(PSL_FP|PSL_VEC|PSL_VSX);
save_vsx(old);
}
+
+ pmap_clear_user_slb();
}
cpu_switchto_asm(old, new);
diff --git a/sys/arch/powerpc64/powerpc64/pmap.c b/sys/arch/powerpc64/powerpc64/pmap.c
index 6dfee10cace..9449b55645f 100644
--- a/sys/arch/powerpc64/powerpc64/pmap.c
+++ b/sys/arch/powerpc64/powerpc64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.43 2020/08/23 10:07:51 kettenis Exp $ */
+/* $OpenBSD: pmap.c,v 1.44 2020/08/25 17:49:58 kettenis Exp $ */
/*
* Copyright (c) 2015 Martin Pieuchot
@@ -452,12 +452,10 @@ pmap_set_user_slb(pmap_t pm, vaddr_t va, vaddr_t *kva, vsize_t *len)
}
void
-pmap_unset_user_slb(void)
+pmap_clear_user_slb(void)
{
struct cpu_info *ci = curcpu();
- curpcb->pcb_userva = 0;
-
if (ci->ci_kernel_slb[31].slb_slbe != 0) {
isync();
slbie(ci->ci_kernel_slb[31].slb_slbe);
@@ -468,6 +466,13 @@ pmap_unset_user_slb(void)
ci->ci_kernel_slb[31].slb_slbv = 0;
}
+void
+pmap_unset_user_slb(void)
+{
+ curpcb->pcb_userva = 0;
+ pmap_clear_user_slb();
+}
+
/*
* VP routines, virtual to physical translation information.
* These data structures are based off of the pmap, per process.