fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / asm-sh / bug.h
index 70508a3..2f89dd0 100644 (file)
@@ -1,20 +1,54 @@
 #ifndef __ASM_SH_BUG_H
 #define __ASM_SH_BUG_H
 
-#include <linux/config.h>
-
 #ifdef CONFIG_BUG
-/*
- * Tell the user there is some problem.
- */
-#define BUG() do { \
-       printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
-       *(volatile int *)0 = 0; \
+
+struct bug_frame {
+       unsigned short  opcode;
+       unsigned short  line;
+       const char      *file;
+       const char      *func;
+};
+
+struct pt_regs;
+
+extern void handle_BUG(struct pt_regs *);
+
+#define TRAPA_BUG_OPCODE       0xc33e  /* trapa #0x3e */
+
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+
+#define BUG()                                          \
+do {                                                   \
+       __asm__ __volatile__ (                          \
+               ".align 2\n\t"                          \
+               ".short %O0\n\t"                        \
+               ".short %O1\n\t"                        \
+               ".long  %O2\n\t"                        \
+               ".long  %O3\n\t"                        \
+               :                                       \
+               : "n" (TRAPA_BUG_OPCODE),               \
+                 "i" (__LINE__), "X" (__FILE__),       \
+                 "X" (__FUNCTION__));                  \
+} while (0)
+
+#else
+
+#define BUG()                                  \
+do {                                           \
+       __asm__ __volatile__ (                  \
+               ".align 2\n\t"                  \
+               ".short %O0\n\t"                \
+               :                               \
+               : "n" (TRAPA_BUG_OPCODE));      \
 } while (0)
 
+#endif /* CONFIG_DEBUG_BUGVERBOSE */
+
 #define HAVE_ARCH_BUG
-#endif
+
+#endif /* CONFIG_BUG */
 
 #include <asm-generic/bug.h>
 
-#endif
+#endif /* __ASM_SH_BUG_H */