diff options
author | marcel <marcel@FreeBSD.org> | 2004-05-03 04:13:31 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2004-05-03 04:13:31 +0000 |
commit | e99f44ed74133193d66ff3c313f3c389b92838fe (patch) | |
tree | 8b886cb71c4b8392b78da79cbb1827f9da014026 | |
parent | 7f15aed8bdb45ef1c1d7835c4ac1e7c89a9f2570 (diff) | |
download | FreeBSD-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.c | 27 |
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: |