^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_SH_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __ASM_SH_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define BUGFLAG_UNWINDER (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #ifdef CONFIG_GENERIC_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define HAVE_ARCH_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define HAVE_ARCH_WARN_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * _EMIT_BUG_ENTRY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * %1 - __FILE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * %2 - __LINE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * %3 - trap type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * %4 - sizeof(struct bug_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * The trapa opcode itself sits in %0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * The %O notation is used to avoid # generation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * The offending file and line are encoded in the __bug_table section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #ifdef CONFIG_DEBUG_BUGVERBOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) "\t.pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) "2:\t.long 1b, %O1\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) "\t.short %O2, %O3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) "\t.org 2b+%O4\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) "\t.popsection\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) "\t.pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) "2:\t.long 1b\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) "\t.short %O3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) "\t.org 2b+%O4\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) "\t.popsection\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define BUG() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) __asm__ __volatile__ ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) "1:\t.short %O0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) : "n" (TRAPA_BUG_OPCODE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) "i" (__FILE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) "i" (__LINE__), "i" (0), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) "i" (sizeof(struct bug_entry))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) unreachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define __WARN_FLAGS(flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) __asm__ __volatile__ ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) "1:\t.short %O0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) : "n" (TRAPA_BUG_OPCODE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) "i" (__FILE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) "i" (BUGFLAG_WARNING|(flags)), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) "i" (sizeof(struct bug_entry))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define WARN_ON(x) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int __ret_warn_on = !!(x); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (__builtin_constant_p(__ret_warn_on)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) if (__ret_warn_on) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) __WARN(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (unlikely(__ret_warn_on)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) __WARN(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unlikely(__ret_warn_on); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define UNWINDER_BUG() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) __asm__ __volatile__ ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) "1:\t.short %O0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) _EMIT_BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) : "n" (TRAPA_BUG_OPCODE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) "i" (__FILE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) "i" (BUGFLAG_UNWINDER), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) "i" (sizeof(struct bug_entry))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define UNWINDER_BUG_ON(x) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) int __ret_unwinder_on = !!(x); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (__builtin_constant_p(__ret_unwinder_on)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (__ret_unwinder_on) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) UNWINDER_BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if (unlikely(__ret_unwinder_on)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) UNWINDER_BUG(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) unlikely(__ret_unwinder_on); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define UNWINDER_BUG BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define UNWINDER_BUG_ON BUG_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #endif /* CONFIG_GENERIC_BUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #include <asm-generic/bug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct pt_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /* arch/sh/kernel/traps.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) extern void die_if_kernel(const char *str, struct pt_regs *regs, long err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) extern void die_if_no_fixup(const char *str, struct pt_regs *regs, long err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #endif /* __ASM_SH_BUG_H */