blob: e55d1f66b86fca4646f702355e15beaea10f6b65 [file] [log] [blame]
Becky Bruce25433b12005-09-19 17:01:54 -05001#ifndef _ASM_POWERPC_BUG_H
2#define _ASM_POWERPC_BUG_H
Arnd Bergmann88ced032005-12-16 22:43:46 +01003#ifdef __KERNEL__
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
David Gibson3ddfbcf2005-11-10 12:56:55 +11005#include <asm/asm-compat.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07006/*
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
Matt Mackallc8538a72005-05-01 08:59:01 -070014#ifdef CONFIG_BUG
15
David Woodhouse007d88d2007-01-01 18:45:34 +000016#ifdef __ASSEMBLY__
17#ifdef CONFIG_DEBUG_BUGVERBOSE
18.macro EMIT_BUG_ENTRY addr,file,line,flags
19 .section __bug_table,"a"
205001: PPC_LONG \addr, 5002f
21 .short \line, \flags
22 .org 5001b+BUG_ENTRY_SIZE
23 .previous
24 .section .rodata,"a"
255002: .asciz "\file"
26 .previous
27.endm
28#else
29 .macro EMIT_BUG_ENTRY addr,file,line,flags
30 .section __bug_table,"a"
315001: PPC_LONG \addr
32 .short \flags
33 .org 5001b+BUG_ENTRY_SIZE
34 .previous
35.endm
36#endif /* verbose */
37
38#else /* !__ASSEMBLY__ */
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080039/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
40 sizeof(struct bug_entry), respectively */
41#ifdef CONFIG_DEBUG_BUGVERBOSE
42#define _EMIT_BUG_ENTRY \
43 ".section __bug_table,\"a\"\n" \
44 "2:\t" PPC_LONG "1b, %0\n" \
45 "\t.short %1, %2\n" \
46 ".org 2b+%3\n" \
47 ".previous\n"
48#else
49#define _EMIT_BUG_ENTRY \
50 ".section __bug_table,\"a\"\n" \
51 "2:\t" PPC_LONG "1b\n" \
52 "\t.short %2\n" \
53 ".org 2b+%3\n" \
54 ".previous\n"
55#endif
56
Michael Ellermane3f94b82006-03-23 23:32:24 +110057/*
58 * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
59 * optimisations. However depending on the complexity of the condition
60 * some compiler versions may not produce optimal results.
61 */
62
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080063#define BUG() do { \
64 __asm__ __volatile__( \
65 "1: twi 31,0,0\n" \
66 _EMIT_BUG_ENTRY \
67 : : "i" (__FILE__), "i" (__LINE__), \
68 "i" (0), "i" (sizeof(struct bug_entry))); \
69 for(;;) ; \
Linus Torvalds1da177e2005-04-16 15:20:36 -070070} while (0)
71
72#define BUG_ON(x) do { \
Michael Ellermane3f94b82006-03-23 23:32:24 +110073 if (__builtin_constant_p(x)) { \
74 if (x) \
75 BUG(); \
76 } else { \
77 __asm__ __volatile__( \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080078 "1: "PPC_TLNEI" %4,0\n" \
79 _EMIT_BUG_ENTRY \
80 : : "i" (__FILE__), "i" (__LINE__), "i" (0), \
81 "i" (sizeof(struct bug_entry)), \
Al Viro97f1e7f2007-07-26 17:35:49 +010082 "r" ((__force long)(x))); \
Michael Ellermane3f94b82006-03-23 23:32:24 +110083 } \
84} while (0)
85
Andrew Morton872345b2006-03-27 23:42:49 -080086#define __WARN() do { \
Michael Ellermane3f94b82006-03-23 23:32:24 +110087 __asm__ __volatile__( \
88 "1: twi 31,0,0\n" \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080089 _EMIT_BUG_ENTRY \
90 : : "i" (__FILE__), "i" (__LINE__), \
91 "i" (BUGFLAG_WARNING), \
92 "i" (sizeof(struct bug_entry))); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070093} while (0)
94
Herbert Xu684f9782006-09-29 01:59:06 -070095#define WARN_ON(x) ({ \
Linus Torvalds8d4fbcf2007-07-31 21:12:07 -070096 int __ret_warn_on = !!(x); \
Herbert Xu684f9782006-09-29 01:59:06 -070097 if (__builtin_constant_p(__ret_warn_on)) { \
98 if (__ret_warn_on) \
Andrew Morton872345b2006-03-27 23:42:49 -080099 __WARN(); \
Michael Ellermane3f94b82006-03-23 23:32:24 +1100100 } else { \
101 __asm__ __volatile__( \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -0800102 "1: "PPC_TLNEI" %4,0\n" \
103 _EMIT_BUG_ENTRY \
104 : : "i" (__FILE__), "i" (__LINE__), \
105 "i" (BUGFLAG_WARNING), \
106 "i" (sizeof(struct bug_entry)), \
107 "r" (__ret_warn_on)); \
Michael Ellermane3f94b82006-03-23 23:32:24 +1100108 } \
Herbert Xu684f9782006-09-29 01:59:06 -0700109 unlikely(__ret_warn_on); \
110})
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112#define HAVE_ARCH_BUG
113#define HAVE_ARCH_BUG_ON
114#define HAVE_ARCH_WARN_ON
Becky Bruce25433b12005-09-19 17:01:54 -0500115#endif /* __ASSEMBLY __ */
David Woodhouse007d88d2007-01-01 18:45:34 +0000116#endif /* CONFIG_BUG */
Matt Mackallc8538a72005-05-01 08:59:01 -0700117
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118#include <asm-generic/bug.h>
119
Arnd Bergmann88ced032005-12-16 22:43:46 +0100120#endif /* __KERNEL__ */
Becky Bruce25433b12005-09-19 17:01:54 -0500121#endif /* _ASM_POWERPC_BUG_H */