aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2005-04-16 18:24:17 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:24:17 -0400
commite378cc16b0d3c1610857c4444345907020e03ece (patch)
tree0947c9f923f985319e81be3f9fe2018571e53d6b /arch/ppc
parent6460b4cceba0181308042c8d8794eb679bfa22e5 (diff)
[PATCH] ppc32: oops on kernel altivec assist exceptions
If we should happen to get an altivec assist exception while executing in the kernel, we will currently try to handle it and fail, and end up oopsing with (apparently) a segfault. (An altivec assist exception occurs for floating-point altivec instructions with denormalized inputs or outputs if the altivec unit is in java mode.) This patch checks explicitly if we are in user mode and prints a useful message if not. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/ppc')
-rw-r--r--arch/ppc/kernel/traps.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/ppc/kernel/traps.c b/arch/ppc/kernel/traps.c
index ed5c7acdca70..aec225b402ae 100644
--- a/arch/ppc/kernel/traps.c
+++ b/arch/ppc/kernel/traps.c
@@ -805,6 +805,13 @@ void AltivecAssistException(struct pt_regs *regs)
805 if (regs->msr & MSR_VEC) 805 if (regs->msr & MSR_VEC)
806 giveup_altivec(current); 806 giveup_altivec(current);
807 preempt_enable(); 807 preempt_enable();
808 if (!user_mode(regs)) {
809 printk(KERN_ERR "altivec assist exception in kernel mode"
810 " at %lx\n", regs->nip);
811 debugger(regs);
812 die("altivec assist exception", regs, SIGFPE);
813 return;
814 }
808 815
809 err = emulate_altivec(regs); 816 err = emulate_altivec(regs);
810 if (err == 0) { 817 if (err == 0) {