Module Name: src Committed By: rin Date: Tue Aug 30 10:55:06 UTC 2022
Modified Files: src/sys/arch/powerpc/fpu: fpu_emu.c Log Message: Fix mcrfs; Clear copied exception bits, and do not raise any exception. To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/sys/arch/powerpc/fpu/fpu_emu.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/powerpc/fpu/fpu_emu.c diff -u src/sys/arch/powerpc/fpu/fpu_emu.c:1.40 src/sys/arch/powerpc/fpu/fpu_emu.c:1.41 --- src/sys/arch/powerpc/fpu/fpu_emu.c:1.40 Tue Aug 30 10:53:12 2022 +++ src/sys/arch/powerpc/fpu/fpu_emu.c Tue Aug 30 10:55:06 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_emu.c,v 1.40 2022/08/30 10:53:12 rin Exp $ */ +/* $NetBSD: fpu_emu.c,v 1.41 2022/08/30 10:55:06 rin Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fpu_emu.c,v 1.40 2022/08/30 10:53:12 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu_emu.c,v 1.41 2022/08/30 10:55:06 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -150,6 +150,14 @@ FPU_EMU_EVCNT_DECL(fnmadd); #define FPSR_INV (FPSCR_VXSNAN|FPSCR_VXISI|FPSCR_VXIDI| \ FPSCR_VXZDZ|FPSCR_VXIMZ|FPSCR_VXVC|FPSCR_VXSOFT|\ FPSCR_VXSQRT|FPSCR_VXCVI) +#define MCRFS_MASK \ + ( \ + FPSCR_FX | FPSCR_OX | \ + FPSCR_UX | FPSCR_ZX | FPSCR_XX | FPSCR_VXSNAN | \ + FPSCR_VXISI | FPSCR_VXIDI | FPSCR_VXZDZ | FPSCR_VXIMZ | \ + FPSCR_VXVC | \ + FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI \ + ) int fpe_debug = 0; @@ -532,14 +540,13 @@ fpu_execute(struct trapframe *tf, struct rt &= 0x1c; ra &= 0x1c; /* Extract the bits we want */ - mask = (fe->fe_fpscr >> (28 - ra)) & 0xf; + bits = (fe->fe_fpscr >> (28 - ra)) & 0xf; /* Clear the bits we copied. */ - fe->fe_cx = - (FPSR_EX_MSK | (0xf << (28 - ra))); - fe->fe_fpscr &= fe->fe_cx; + mask = (0xf << (28 - ra)) & MCRFS_MASK; + fe->fe_fpscr &= ~mask; /* Now shove them in the right part of cr */ tf->tf_cr &= ~(0xf << (28 - rt)); - tf->tf_cr |= (mask << (28 - rt)); + tf->tf_cr |= bits << (28 - rt); break; case OPC63_MTFSB0: FPU_EMU_EVCNT_INCR(mtfsb0);