Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 */