]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Blackfin arch: Better error handling of unknown exceptions
authorRobin Getz <rgetz@blackfin.uclinux.org>
Wed, 8 Oct 2008 06:43:47 +0000 (14:43 +0800)
committerBryan Wu <cooloney@kernel.org>
Wed, 8 Oct 2008 06:43:47 +0000 (14:43 +0800)
Better error handling of unknown exceptions, allows userspace to do a
EXCPT n instruction for a not installed exception handler, and the
kernel doesn't crash (like it use to before this).

Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
arch/blackfin/include/asm/traps.h
arch/blackfin/kernel/traps.c

index f0e5f940d9cae503d55be15fb74982c15be47a2a..34f7295fb0708c71f8823fd8fc709535629da42d 100644 (file)
@@ -59,6 +59,9 @@
        level "   or a 16-bit register is accessed with a 32-bit instruction.\n"
 #define HWC_x3(level) \
        "External Memory Addressing Error\n"
+#define EXC_0x04(level) \
+       "Unimplmented exception occured\n" \
+       level " - Maybe you forgot to install a custom exception handler?\n"
 #define HWC_x12(level) \
        "Performance Monitor Overflow\n"
 #define HWC_x18(level) \
@@ -84,7 +87,7 @@
        level "   a particular processor implementation.\n"
 #define EXC_0x22(level) \
        "Illegal instruction combination\n" \
-       level " - See section for multi-issue rules in the ADSP-BF53x Blackfin\n" \
+       level " - See section for multi-issue rules in the Blackfin\n" \
        level "   Processor Instruction Set Reference.\n"
 #define EXC_0x23(level) \
        "Data access CPLB protection violation\n" \
index 8d561baef896e9840e231ac294ca58535791a1d3..be5ae7fabc5f02f4c01479dc0271069313cd9972 100644 (file)
@@ -301,18 +301,28 @@ asmlinkage void trap_c(struct pt_regs *fp)
                printk(KERN_NOTICE EXC_0x03(KERN_NOTICE));
                CHK_DEBUGGER_TRAP_MAYBE();
                break;
-       /* 0x04 - User Defined, Caught by default */
-       /* 0x05 - User Defined, Caught by default */
-       /* 0x06 - User Defined, Caught by default */
-       /* 0x07 - User Defined, Caught by default */
-       /* 0x08 - User Defined, Caught by default */
-       /* 0x09 - User Defined, Caught by default */
-       /* 0x0A - User Defined, Caught by default */
-       /* 0x0B - User Defined, Caught by default */
-       /* 0x0C - User Defined, Caught by default */
-       /* 0x0D - User Defined, Caught by default */
-       /* 0x0E - User Defined, Caught by default */
-       /* 0x0F - User Defined, Caught by default */
+       /* 0x04 - User Defined */
+       /* 0x05 - User Defined */
+       /* 0x06 - User Defined */
+       /* 0x07 - User Defined */
+       /* 0x08 - User Defined */
+       /* 0x09 - User Defined */
+       /* 0x0A - User Defined */
+       /* 0x0B - User Defined */
+       /* 0x0C - User Defined */
+       /* 0x0D - User Defined */
+       /* 0x0E - User Defined */
+       /* 0x0F - User Defined */
+       /*
+        * If we got here, it is most likely that someone was trying to use a
+        * custom exception handler, and it is not actually installed properly
+        */
+       case VEC_EXCPT04 ... VEC_EXCPT15:
+               info.si_code = ILL_ILLPARAOP;
+               sig = SIGILL;
+               printk(KERN_NOTICE EXC_0x04(KERN_NOTICE));
+               CHK_DEBUGGER_TRAP_MAYBE();
+               break;
        /* 0x10 HW Single step, handled here */
        case VEC_STEP:
                info.si_code = TRAP_STEP;
@@ -507,9 +517,14 @@ asmlinkage void trap_c(struct pt_regs *fp)
                }
                CHK_DEBUGGER_TRAP_MAYBE();
                break;
+       /*
+        * We should be handling all known exception types above,
+        * if we get here we hit a reserved one, so panic
+        */
        default:
-               info.si_code = TRAP_ILLTRAP;
-               sig = SIGTRAP;
+               oops_in_progress = 1;
+               info.si_code = ILL_ILLPARAOP;
+               sig = SIGILL;
                printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx\n",
                        (fp->seqstat & SEQSTAT_EXCAUSE));
                CHK_DEBUGGER_TRAP_MAYBE();