^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_POWERPC_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_POWERPC_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <asm/asm-compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifdef CONFIG_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #ifdef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/asm-offsets.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifdef CONFIG_DEBUG_BUGVERBOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) .macro EMIT_BUG_ENTRY addr,file,line,flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .section __bug_table,"aw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) 5001: PPC_LONG \addr, 5002f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .short \line, \flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) .org 5001b+BUG_ENTRY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .section .rodata,"a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 5002: .asciz "\file"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) .macro EMIT_BUG_ENTRY addr,file,line,flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) .section __bug_table,"aw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 5001: PPC_LONG \addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .short \flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .org 5001b+BUG_ENTRY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #endif /* verbose */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #else /* !__ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) sizeof(struct bug_entry), respectively */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #ifdef CONFIG_DEBUG_BUGVERBOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ".section __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) "2:\t" PPC_LONG "1b, %0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) "\t.short %1, %2\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ".org 2b+%3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ".previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ".section __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) "2:\t" PPC_LONG "1b\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) "\t.short %2\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ".org 2b+%3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ".previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define BUG_ENTRY(insn, flags, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) __asm__ __volatile__( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) "1: " insn "\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) : : "i" (__FILE__), "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) "i" (flags), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) "i" (sizeof(struct bug_entry)), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * optimisations. However depending on the complexity of the condition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * some compiler versions may not produce optimal results.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define BUG() do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) BUG_ENTRY("twi 31, 0, 0", 0); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) unreachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define BUG_ON(x) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) if (__builtin_constant_p(x)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) BUG_ENTRY(PPC_TLNEI " %4, 0", 0, "r" ((__force long)(x))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define __WARN_FLAGS(flags) BUG_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define WARN_ON(x) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) int __ret_warn_on = !!(x); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (__builtin_constant_p(__ret_warn_on)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (__ret_warn_on) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) __WARN(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) BUG_ENTRY(PPC_TLNEI " %4, 0", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) BUGFLAG_WARNING | BUGFLAG_TAINT(TAINT_WARN), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) "r" (__ret_warn_on)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) unlikely(__ret_warn_on); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define HAVE_ARCH_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define HAVE_ARCH_BUG_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define HAVE_ARCH_WARN_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #endif /* __ASSEMBLY __ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #ifdef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .macro EMIT_BUG_ENTRY addr,file,line,flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #else /* !__ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define _EMIT_BUG_ENTRY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #endif /* CONFIG_BUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #include <asm-generic/bug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct pt_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) extern int do_page_fault(struct pt_regs *, unsigned long, unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) extern void bad_page_fault(struct pt_regs *, unsigned long, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) extern void _exception(int, struct pt_regs *, int, unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) extern void _exception_pkey(struct pt_regs *, unsigned long, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) extern void die(const char *, struct pt_regs *, long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) extern bool die_will_crash(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) extern void panic_flush_kmsg_start(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) extern void panic_flush_kmsg_end(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #endif /* !__ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #endif /* __KERNEL__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #endif /* _ASM_POWERPC_BUG_H */