aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel/traps.c')
-rw-r--r--arch/mips/kernel/traps.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index c8e291c83057..6379003f9d8d 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -606,6 +606,8 @@ asmlinkage void do_ov(struct pt_regs *regs)
606 */ 606 */
607asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31) 607asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
608{ 608{
609 siginfo_t info;
610
609 die_if_kernel("FP exception in kernel code", regs); 611 die_if_kernel("FP exception in kernel code", regs);
610 612
611 if (fcr31 & FPU_CSR_UNI_X) { 613 if (fcr31 & FPU_CSR_UNI_X) {
@@ -641,9 +643,22 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
641 force_sig(sig, current); 643 force_sig(sig, current);
642 644
643 return; 645 return;
644 } 646 } else if (fcr31 & FPU_CSR_INV_X)
645 647 info.si_code = FPE_FLTINV;
646 force_sig(SIGFPE, current); 648 else if (fcr31 & FPU_CSR_DIV_X)
649 info.si_code = FPE_FLTDIV;
650 else if (fcr31 & FPU_CSR_OVF_X)
651 info.si_code = FPE_FLTOVF;
652 else if (fcr31 & FPU_CSR_UDF_X)
653 info.si_code = FPE_FLTUND;
654 else if (fcr31 & FPU_CSR_INE_X)
655 info.si_code = FPE_FLTRES;
656 else
657 info.si_code = __SI_FAULT;
658 info.si_signo = SIGFPE;
659 info.si_errno = 0;
660 info.si_addr = (void __user *) regs->cp0_epc;
661 force_sig_info(SIGFPE, &info, current);
647} 662}
648 663
649asmlinkage void do_bp(struct pt_regs *regs) 664asmlinkage void do_bp(struct pt_regs *regs)
@@ -1035,19 +1050,11 @@ void ejtag_exception_handler(struct pt_regs *regs)
1035/* 1050/*
1036 * NMI exception handler. 1051 * NMI exception handler.
1037 */ 1052 */
1038void nmi_exception_handler(struct pt_regs *regs) 1053NORET_TYPE void ATTRIB_NORET nmi_exception_handler(struct pt_regs *regs)
1039{ 1054{
1040#ifdef CONFIG_MIPS_MT_SMTC
1041 unsigned long dvpret = dvpe();
1042 bust_spinlocks(1);
1043 printk("NMI taken!!!!\n");
1044 mips_mt_regdump(dvpret);
1045#else
1046 bust_spinlocks(1); 1055 bust_spinlocks(1);
1047 printk("NMI taken!!!!\n"); 1056 printk("NMI taken!!!!\n");
1048#endif /* CONFIG_MIPS_MT_SMTC */
1049 die("NMI", regs); 1057 die("NMI", regs);
1050 while(1) ;
1051} 1058}
1052 1059
1053#define VECTORSPACING 0x100 /* for EI/VI mode */ 1060#define VECTORSPACING 0x100 /* for EI/VI mode */