blob: 0151af6c2a505a77c512110271e73f0c9c3fcd6e [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>
Benjamin Herrenschmidta58f0532008-12-14 19:44:13 +00006
Linus Torvalds1da177e2005-04-16 15:20:36 -07007/*
8 * Define an illegal instr to trap on the bug.
9 * We don't use 0 because that marks the end of a function
10 * in the ELF ABI. That's "Boo Boo" in case you wonder...
11 */
12#define BUG_OPCODE .long 0x00b00b00 /* For asm */
13#define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */
14
Matt Mackallc8538a72005-05-01 08:59:01 -070015#ifdef CONFIG_BUG
16
David Woodhouse007d88d2007-01-01 18:45:34 +000017#ifdef __ASSEMBLY__
Benjamin Herrenschmidta58f0532008-12-14 19:44:13 +000018#include <asm/asm-offsets.h>
David Woodhouse007d88d2007-01-01 18:45:34 +000019#ifdef CONFIG_DEBUG_BUGVERBOSE
20.macro EMIT_BUG_ENTRY addr,file,line,flags
21 .section __bug_table,"a"
225001: PPC_LONG \addr, 5002f
23 .short \line, \flags
24 .org 5001b+BUG_ENTRY_SIZE
25 .previous
26 .section .rodata,"a"
275002: .asciz "\file"
28 .previous
29.endm
30#else
Benjamin Herrenschmidta58f0532008-12-14 19:44:13 +000031.macro EMIT_BUG_ENTRY addr,file,line,flags
David Woodhouse007d88d2007-01-01 18:45:34 +000032 .section __bug_table,"a"
335001: PPC_LONG \addr
34 .short \flags
35 .org 5001b+BUG_ENTRY_SIZE
36 .previous
37.endm
38#endif /* verbose */
39
40#else /* !__ASSEMBLY__ */
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080041/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
42 sizeof(struct bug_entry), respectively */
43#ifdef CONFIG_DEBUG_BUGVERBOSE
44#define _EMIT_BUG_ENTRY \
45 ".section __bug_table,\"a\"\n" \
46 "2:\t" PPC_LONG "1b, %0\n" \
47 "\t.short %1, %2\n" \
48 ".org 2b+%3\n" \
49 ".previous\n"
50#else
51#define _EMIT_BUG_ENTRY \
52 ".section __bug_table,\"a\"\n" \
53 "2:\t" PPC_LONG "1b\n" \
54 "\t.short %2\n" \
55 ".org 2b+%3\n" \
56 ".previous\n"
57#endif
58
Michael Ellermane3f94b82006-03-23 23:32:24 +110059/*
60 * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
61 * optimisations. However depending on the complexity of the condition
62 * some compiler versions may not produce optimal results.
63 */
64
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080065#define BUG() do { \
66 __asm__ __volatile__( \
67 "1: twi 31,0,0\n" \
68 _EMIT_BUG_ENTRY \
69 : : "i" (__FILE__), "i" (__LINE__), \
70 "i" (0), "i" (sizeof(struct bug_entry))); \
David Daney01ae45b2009-12-10 07:28:19 +000071 unreachable(); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070072} while (0)
73
74#define BUG_ON(x) do { \
Michael Ellermane3f94b82006-03-23 23:32:24 +110075 if (__builtin_constant_p(x)) { \
76 if (x) \
77 BUG(); \
78 } else { \
79 __asm__ __volatile__( \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080080 "1: "PPC_TLNEI" %4,0\n" \
81 _EMIT_BUG_ENTRY \
82 : : "i" (__FILE__), "i" (__LINE__), "i" (0), \
83 "i" (sizeof(struct bug_entry)), \
Al Viro97f1e7f2007-07-26 17:35:49 +010084 "r" ((__force long)(x))); \
Michael Ellermane3f94b82006-03-23 23:32:24 +110085 } \
86} while (0)
87
Peter Zijlstra19d43622017-02-25 08:56:53 +010088#define __WARN_FLAGS(flags) do { \
Michael Ellermane3f94b82006-03-23 23:32:24 +110089 __asm__ __volatile__( \
90 "1: twi 31,0,0\n" \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080091 _EMIT_BUG_ENTRY \
92 : : "i" (__FILE__), "i" (__LINE__), \
Peter Zijlstra19d43622017-02-25 08:56:53 +010093 "i" (BUGFLAG_WARNING|(flags)), \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -080094 "i" (sizeof(struct bug_entry))); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070095} while (0)
96
Herbert Xu684f9782006-09-29 01:59:06 -070097#define WARN_ON(x) ({ \
Linus Torvalds8d4fbcf2007-07-31 21:12:07 -070098 int __ret_warn_on = !!(x); \
Herbert Xu684f9782006-09-29 01:59:06 -070099 if (__builtin_constant_p(__ret_warn_on)) { \
100 if (__ret_warn_on) \
Andrew Morton872345b2006-03-27 23:42:49 -0800101 __WARN(); \
Michael Ellermane3f94b82006-03-23 23:32:24 +1100102 } else { \
103 __asm__ __volatile__( \
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -0800104 "1: "PPC_TLNEI" %4,0\n" \
105 _EMIT_BUG_ENTRY \
106 : : "i" (__FILE__), "i" (__LINE__), \
Alexey Kardashevskiya093c922017-06-14 13:01:25 +1000107 "i" (BUGFLAG_WARNING|BUGFLAG_TAINT(TAINT_WARN)),\
Jeremy Fitzhardinge73c9cea2006-12-08 03:30:41 -0800108 "i" (sizeof(struct bug_entry)), \
109 "r" (__ret_warn_on)); \
Michael Ellermane3f94b82006-03-23 23:32:24 +1100110 } \
Herbert Xu684f9782006-09-29 01:59:06 -0700111 unlikely(__ret_warn_on); \
112})
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114#define HAVE_ARCH_BUG
115#define HAVE_ARCH_BUG_ON
116#define HAVE_ARCH_WARN_ON
Becky Bruce25433b12005-09-19 17:01:54 -0500117#endif /* __ASSEMBLY __ */
Benjamin Herrenschmidta58f0532008-12-14 19:44:13 +0000118#else
119#ifdef __ASSEMBLY__
120.macro EMIT_BUG_ENTRY addr,file,line,flags
121.endm
122#else /* !__ASSEMBLY__ */
123#define _EMIT_BUG_ENTRY
124#endif
David Woodhouse007d88d2007-01-01 18:45:34 +0000125#endif /* CONFIG_BUG */
Matt Mackallc8538a72005-05-01 08:59:01 -0700126
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127#include <asm-generic/bug.h>
128
David Howellsae3a1972012-03-28 18:30:02 +0100129#ifndef __ASSEMBLY__
130
131struct pt_regs;
132extern int do_page_fault(struct pt_regs *, unsigned long, unsigned long);
133extern void bad_page_fault(struct pt_regs *, unsigned long, int);
134extern void _exception(int, struct pt_regs *, int, unsigned long);
135extern void die(const char *, struct pt_regs *, long);
David Howellsae3a1972012-03-28 18:30:02 +0100136
137#endif /* !__ASSEMBLY__ */
138
Arnd Bergmann88ced032005-12-16 22:43:46 +0100139#endif /* __KERNEL__ */
Becky Bruce25433b12005-09-19 17:01:54 -0500140#endif /* _ASM_POWERPC_BUG_H */