Title: [6605] trunk/arch/blackfin: Blackfin: add support for GENERIC_BUG
- Revision
- 6605
- Author
- vapier
- Date
- 2009-06-07 16:24:10 -0500 (Sun, 07 Jun 2009)
Log Message
Blackfin: add support for GENERIC_BUG
Modified Paths
Diff
Modified: trunk/arch/blackfin/Kconfig (6604 => 6605)
--- trunk/arch/blackfin/Kconfig 2009-06-07 21:22:12 UTC (rev 6604)
+++ trunk/arch/blackfin/Kconfig 2009-06-07 21:24:10 UTC (rev 6605)
@@ -28,6 +28,9 @@
select HAVE_OPROFILE
select ARCH_WANT_OPTIONAL_GPIOLIB
+config GENERIC_BUG
+ def_bool y
+
config ZONE_DMA
bool
default y
Modified: trunk/arch/blackfin/include/asm/bug.h (6604 => 6605)
--- trunk/arch/blackfin/include/asm/bug.h 2009-06-07 21:22:12 UTC (rev 6604)
+++ trunk/arch/blackfin/include/asm/bug.h 2009-06-07 21:24:10 UTC (rev 6605)
@@ -2,14 +2,59 @@
#define _BLACKFIN_BUG_H
#ifdef CONFIG_BUG
+
+#define BFIN_BUG_OPCODE 0xefcd
+
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+
+#define _BUG_OR_WARN(flags) \
+ asm volatile( \
+ "1: .hword %0\n" \
+ " .section __bug_table,\"a\",@progbits\n" \
+ "2: .long 1b\n" \
+ " .long %1\n" \
+ " .short %2\n" \
+ " .short %3\n" \
+ " .org 2b + %4\n" \
+ " .previous" \
+ : \
+ : "i"(BFIN_BUG_OPCODE), "i"(__FILE__), \
+ "i"(__LINE__), "i"(flags), \
+ "i"(sizeof(struct bug_entry)))
+
+#else
+
+#define _BUG_OR_WARN(flags) \
+ asm volatile( \
+ "1: .hword %0\n" \
+ " .section __bug_table,\"a\",@progbits\n" \
+ "2: .long 1b\n" \
+ " .short %1\n" \
+ " .org 2b + %2\n" \
+ " .previous" \
+ : \
+ : "i"(BFIN_BUG_OPCODE), "i"(flags), \
+ "i"(sizeof(struct bug_entry)))
+
+#endif /* CONFIG_DEBUG_BUGVERBOSE */
+
+#define BUG() \
+ do { \
+ _BUG_OR_WARN(0); \
+ for (;;); \
+ } while (0)
+
+#define WARN_ON(condition) \
+ ({ \
+ int __ret_warn_on = !!(condition); \
+ if (unlikely(__ret_warn_on)) \
+ _BUG_OR_WARN(BUGFLAG_WARNING); \
+ unlikely(__ret_warn_on); \
+ })
+
#define HAVE_ARCH_BUG
+#define HAVE_ARCH_WARN_ON
-#define BUG() do { \
- dump_bfin_trace_buffer(); \
- printk(KERN_EMERG "BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
- panic("BUG!"); \
-} while (0)
-
#endif
#include <asm-generic/bug.h>
Modified: trunk/arch/blackfin/kernel/traps.c (6604 => 6605)
--- trunk/arch/blackfin/kernel/traps.c 2009-06-07 21:22:12 UTC (rev 6604)
+++ trunk/arch/blackfin/kernel/traps.c 2009-06-07 21:24:10 UTC (rev 6605)
@@ -27,6 +27,7 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <linux/bug.h>
#include <linux/uaccess.h>
#include <linux/interrupt.h>
#include <linux/module.h>
@@ -367,6 +368,23 @@
/* 0x20 - Reserved, Caught by default */
/* 0x21 - Undefined Instruction, handled here */
case VEC_UNDEF_I:
+#ifdef CONFIG_BUG
+ if (kernel_mode_regs(fp)) {
+ switch (report_bug(fp->pc, fp)) {
+ case BUG_TRAP_TYPE_NONE:
+ break;
+ case BUG_TRAP_TYPE_WARN:
+ dump_bfin_trace_buffer();
+ fp->pc += 2;
+ goto traps_done;
+ case BUG_TRAP_TYPE_BUG:
+ /* call to panic() will dump trace, and it is
+ * off at this point, so it won't be clobbered
+ */
+ panic("BUG()");
+ }
+ }
+#endif
info.si_code = ILL_ILLOPC;
sig = SIGILL;
strerror = KERN_NOTICE EXC_0x21(KERN_NOTICE);
@@ -756,6 +774,18 @@
}
EXPORT_SYMBOL(dump_bfin_trace_buffer);
+#ifdef CONFIG_BUG
+int is_valid_bugaddr(unsigned long addr)
+{
+ unsigned short opcode;
+
+ if (!get_instruction(&opcode, (unsigned short *)addr))
+ return 0;
+
+ return opcode == BFIN_BUG_OPCODE;
+}
+#endif
+
/*
* Checks to see if the address pointed to is either a
* 16-bit CALL instruction, or a 32-bit CALL instruction
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits