diff options
author | kettenis <kettenis@openbsd.org> | 2020-07-11 12:17:59 +0000 |
---|---|---|
committer | kettenis <kettenis@openbsd.org> | 2020-07-11 12:17:59 +0000 |
commit | 17552403076f5d0ad12277fe80956c51aaff8761 (patch) | |
tree | bd4ca0d40eac027c441d9204655f1a8adb14f22d | |
parent | Implement a machdep.altivec sysctl that always returns 1. This makes (diff) | |
download | wireguard-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.c | 8 |
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; |