diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2024-03-03 11:14:35 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2024-03-03 11:14:35 +0000 |
commit | 5f82225fb9c44ba44ccd76969b3ac3791c65789d (patch) | |
tree | 7705eabcbc949673b80dde54cd30ae0c8231b9f5 /sys/arch/m88k | |
parent | ff85caf196e34729455e7d5fcf8507a6c963a624 (diff) |
Cope with the rare case of an imprecise FPU exception caught when
reenabling the FPU as part of the regular processing of another exception.
Diffstat (limited to 'sys/arch/m88k')
-rw-r--r-- | sys/arch/m88k/m88k/m88100_fp.c | 15 | ||||
-rw-r--r-- | sys/arch/m88k/m88k/trap.c | 11 |
2 files changed, 21 insertions, 5 deletions
diff --git a/sys/arch/m88k/m88k/m88100_fp.c b/sys/arch/m88k/m88k/m88100_fp.c index 250cfe3fc14..c227f8be328 100644 --- a/sys/arch/m88k/m88k/m88100_fp.c +++ b/sys/arch/m88k/m88k/m88100_fp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m88100_fp.c,v 1.6 2024/03/03 11:03:13 miod Exp $ */ +/* $OpenBSD: m88100_fp.c,v 1.7 2024/03/03 11:14:34 miod Exp $ */ /* * Copyright (c) 2007, 2014, Miodrag Vallat. @@ -442,9 +442,16 @@ m88100_fpu_imprecise_exception(struct trapframe *frame) */ __asm__ volatile ("fstcr %0, %%fcr62" :: "r"(frame->tf_fpsr)); - /* Check for a SIGFPE condition */ - if (frame->tf_fpsr & frame->tf_fpcr) - m88100_fpu_checksig(frame, SIGFPE, 0 /* SI_NOINFO */); + /* + * Check for a SIGFPE condition. + * + * XXX If the exception was caught while in kernel mode, we can't + * XXX send a signal at this point... what to do? + */ + if ((frame->tf_fpsr & PSR_MODE) == 0) { + if (frame->tf_fpsr & frame->tf_fpcr) + m88100_fpu_checksig(frame, SIGFPE, 0 /* SI_NOINFO */); + } } /* diff --git a/sys/arch/m88k/m88k/trap.c b/sys/arch/m88k/m88k/trap.c index 02fa56109ff..66677e280ee 100644 --- a/sys/arch/m88k/m88k/trap.c +++ b/sys/arch/m88k/m88k/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.134 2024/02/18 21:27:38 miod Exp $ */ +/* $OpenBSD: trap.c,v 1.135 2024/03/03 11:14:34 miod Exp $ */ /* * Copyright (c) 2004, Miodrag Vallat. * Copyright (c) 1998 Steve Murphree, Jr. @@ -511,6 +511,15 @@ user_fault: case T_FPEPFLT+T_USER: m88100_fpu_precise_exception(frame); goto userexit; + case T_FPEIFLT: + /* + * Although the kernel does not use FPU instructions, + * userland-triggered FPU imprecise exceptions may be + * raised during exception processing, when the FPU gets + * reenabled (i.e. immediately when returning to + * m88100_fpu_enable). + */ + /* FALLTHROUGH */ case T_FPEIFLT+T_USER: m88100_fpu_imprecise_exception(frame); goto userexit; |