summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2020-07-11 12:17:59 +0000
committerkettenis <kettenis@openbsd.org>2020-07-11 12:17:59 +0000
commit17552403076f5d0ad12277fe80956c51aaff8761 (patch)
treebd4ca0d40eac027c441d9204655f1a8adb14f22d
parentImplement a machdep.altivec sysctl that always returns 1. This makes (diff)
downloadwireguard-openbsd-17552403076f5d0ad12277fe80956c51aaff8761.tar.xz
wireguard-openbsd-17552403076f5d0ad12277fe80956c51aaff8761.zip
Don't reload the FPU registers when they're already loaded.
Seems to fix the clang crashes I was seeing.
-rw-r--r--sys/arch/powerpc64/powerpc64/trap.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/arch/powerpc64/powerpc64/trap.c b/sys/arch/powerpc64/powerpc64/trap.c
index 46eecf2d8aa..a0cd9cb12ec 100644
--- a/sys/arch/powerpc64/powerpc64/trap.c
+++ b/sys/arch/powerpc64/powerpc64/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.26 2020/07/10 18:34:24 kettenis Exp $ */
+/* $OpenBSD: trap.c,v 1.27 2020/07/11 12:17:59 kettenis Exp $ */
/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -267,13 +267,15 @@ trap(struct trapframe *frame)
break;
case EXC_FPU|EXC_USER:
- restore_vsx(p);
+ if ((frame->srr1 & (PSL_FP|PSL_VEC|PSL_VSX)) == 0)
+ restore_vsx(p);
curpcb->pcb_flags |= PCB_FP;
frame->srr1 |= PSL_FP;
break;
case EXC_VEC|EXC_USER:
- restore_vsx(p);
+ if ((frame->srr1 & (PSL_FP|PSL_VEC|PSL_VSX)) == 0)
+ restore_vsx(p);
curpcb->pcb_flags |= PCB_VEC;
frame->srr1 |= PSL_VEC;
break;