diff options
author | 2020-08-25 17:49:58 +0000 | |
---|---|---|
committer | 2020-08-25 17:49:58 +0000 | |
commit | 502a56d12303fcc4987373ac4094027c62a63a91 (patch) | |
tree | c5bcfd3437f6399e1b0ce346c5101b7c451f3a6f | |
parent | Fix undefined symbol. (diff) | |
download | wireguard-openbsd-502a56d12303fcc4987373ac4094027c62a63a91.tar.xz wireguard-openbsd-502a56d12303fcc4987373ac4094027c62a63a91.zip |
Clear user SLB upon context switch.
-rw-r--r-- | sys/arch/powerpc64/include/pmap.h | 3 | ||||
-rw-r--r-- | sys/arch/powerpc64/powerpc64/machdep.c | 4 | ||||
-rw-r--r-- | sys/arch/powerpc64/powerpc64/pmap.c | 13 |
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. |