at v2.6.20-rc2 100 lines 2.6 kB view raw
1#ifndef _ASM_POWERPC_BUG_H 2#define _ASM_POWERPC_BUG_H 3#ifdef __KERNEL__ 4 5#include <asm/asm-compat.h> 6/* 7 * Define an illegal instr to trap on the bug. 8 * We don't use 0 because that marks the end of a function 9 * in the ELF ABI. That's "Boo Boo" in case you wonder... 10 */ 11#define BUG_OPCODE .long 0x00b00b00 /* For asm */ 12#define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */ 13 14#ifndef __ASSEMBLY__ 15 16#ifdef CONFIG_BUG 17 18/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and 19 sizeof(struct bug_entry), respectively */ 20#ifdef CONFIG_DEBUG_BUGVERBOSE 21#define _EMIT_BUG_ENTRY \ 22 ".section __bug_table,\"a\"\n" \ 23 "2:\t" PPC_LONG "1b, %0\n" \ 24 "\t.short %1, %2\n" \ 25 ".org 2b+%3\n" \ 26 ".previous\n" 27#else 28#define _EMIT_BUG_ENTRY \ 29 ".section __bug_table,\"a\"\n" \ 30 "2:\t" PPC_LONG "1b\n" \ 31 "\t.short %2\n" \ 32 ".org 2b+%3\n" \ 33 ".previous\n" 34#endif 35 36/* 37 * BUG_ON() and WARN_ON() do their best to cooperate with compile-time 38 * optimisations. However depending on the complexity of the condition 39 * some compiler versions may not produce optimal results. 40 */ 41 42#define BUG() do { \ 43 __asm__ __volatile__( \ 44 "1: twi 31,0,0\n" \ 45 _EMIT_BUG_ENTRY \ 46 : : "i" (__FILE__), "i" (__LINE__), \ 47 "i" (0), "i" (sizeof(struct bug_entry))); \ 48 for(;;) ; \ 49} while (0) 50 51#define BUG_ON(x) do { \ 52 if (__builtin_constant_p(x)) { \ 53 if (x) \ 54 BUG(); \ 55 } else { \ 56 __asm__ __volatile__( \ 57 "1: "PPC_TLNEI" %4,0\n" \ 58 _EMIT_BUG_ENTRY \ 59 : : "i" (__FILE__), "i" (__LINE__), "i" (0), \ 60 "i" (sizeof(struct bug_entry)), \ 61 "r" ((long)(x))); \ 62 } \ 63} while (0) 64 65#define __WARN() do { \ 66 __asm__ __volatile__( \ 67 "1: twi 31,0,0\n" \ 68 _EMIT_BUG_ENTRY \ 69 : : "i" (__FILE__), "i" (__LINE__), \ 70 "i" (BUGFLAG_WARNING), \ 71 "i" (sizeof(struct bug_entry))); \ 72} while (0) 73 74#define WARN_ON(x) ({ \ 75 typeof(x) __ret_warn_on = (x); \ 76 if (__builtin_constant_p(__ret_warn_on)) { \ 77 if (__ret_warn_on) \ 78 __WARN(); \ 79 } else { \ 80 __asm__ __volatile__( \ 81 "1: "PPC_TLNEI" %4,0\n" \ 82 _EMIT_BUG_ENTRY \ 83 : : "i" (__FILE__), "i" (__LINE__), \ 84 "i" (BUGFLAG_WARNING), \ 85 "i" (sizeof(struct bug_entry)), \ 86 "r" (__ret_warn_on)); \ 87 } \ 88 unlikely(__ret_warn_on); \ 89}) 90 91#define HAVE_ARCH_BUG 92#define HAVE_ARCH_BUG_ON 93#define HAVE_ARCH_WARN_ON 94#endif /* CONFIG_BUG */ 95#endif /* __ASSEMBLY __ */ 96 97#include <asm-generic/bug.h> 98 99#endif /* __KERNEL__ */ 100#endif /* _ASM_POWERPC_BUG_H */