summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2004-05-03 04:13:31 +0000
committermarcel <marcel@FreeBSD.org>2004-05-03 04:13:31 +0000
commite99f44ed74133193d66ff3c313f3c389b92838fe (patch)
tree8b886cb71c4b8392b78da79cbb1827f9da014026
parent7f15aed8bdb45ef1c1d7835c4ac1e7c89a9f2570 (diff)
downloadFreeBSD-src-e99f44ed74133193d66ff3c313f3c389b92838fe.zip
FreeBSD-src-e99f44ed74133193d66ff3c313f3c389b92838fe.tar.gz
Floating-point faults and exceptions can happen in the kernel too.
Do not panic when it happens; handle them. Run into by: das
-rw-r--r--sys/ia64/ia64/trap.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/sys/ia64/ia64/trap.c b/sys/ia64/ia64/trap.c
index 41ddaed..324be68 100644
--- a/sys/ia64/ia64/trap.c
+++ b/sys/ia64/ia64/trap.c
@@ -668,11 +668,10 @@ trap(int vector, struct trapframe *tf)
FPSWA_BUNDLE bundle;
char *ip;
- /* Always fatal in kernel. Should never happen. */
- if (!user)
- trap_panic(vector, tf);
-
if (fpswa_interface == NULL) {
+ if (!user)
+ trap_panic(vector, tf);
+
sig = SIGFPE;
ucode = 0;
break;
@@ -682,12 +681,15 @@ trap(int vector, struct trapframe *tf)
if (vector == IA64_VEC_FLOATING_POINT_TRAP &&
(tf->tf_special.psr & IA64_PSR_RI) == 0)
ip -= 16;
- error = copyin(ip, &bundle, 16);
- if (error) {
- sig = SIGBUS; /* EFAULT, basically */
- ucode = 0; /* exception summary */
- break;
- }
+ if (user) {
+ error = copyin(ip, &bundle, 16);
+ if (error) {
+ sig = SIGBUS; /* EFAULT, basically */
+ ucode = 0; /* exception summary */
+ break;
+ }
+ } else
+ bcopy(ip, &bundle, 16);
/* f6-f15 are saved in exception_save */
fp_state.bitmask_low64 = 0xffc0; /* bits 6 - 15 */
@@ -739,11 +741,12 @@ trap(int vector, struct trapframe *tf)
printf("FATAL: FPSWA err1 %lx, err2 %lx, err3 %lx\n",
fpswa_ret.err1, fpswa_ret.err2, fpswa_ret.err3);
panic("fpswa fatal error on fp fault");
- } else {
+ } else if (user) {
sig = SIGFPE;
ucode = 0; /* XXX exception summary */
break;
- }
+ } else
+ goto out;
}
case IA64_VEC_IA32_EXCEPTION:
OpenPOWER on IntegriCloud