^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 _PARISC_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _PARISC_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/kernel.h> /* for BUGFLAG_TAINT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Tell the user there is some problem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * The offending file and line are encoded in the __bug_table section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifdef CONFIG_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define HAVE_ARCH_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define HAVE_ARCH_WARN_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /* the break instruction is used as BUG() marker. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define PARISC_BUG_BREAK_ASM "break 0x1f, 0x1fff"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define PARISC_BUG_BREAK_INSN 0x03ffe01f /* PARISC_BUG_BREAK_ASM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #if defined(CONFIG_64BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define ASM_WORD_INSN ".dword\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define ASM_WORD_INSN ".word\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #endif
^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 BUG() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) asm volatile("\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) "1:\t" PARISC_BUG_BREAK_ASM "\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) "\t.pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) "2:\t" ASM_WORD_INSN "1b, %c0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) "\t.short %c1, %c2\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) "\t.org 2b+%c3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) "\t.popsection" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) : : "i" (__FILE__), "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) "i" (0), "i" (sizeof(struct bug_entry)) ); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) unreachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #else
^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(PARISC_BUG_BREAK_ASM : : ); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) unreachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #ifdef CONFIG_DEBUG_BUGVERBOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define __WARN_FLAGS(flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) asm volatile("\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) "1:\t" PARISC_BUG_BREAK_ASM "\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) "\t.pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) "2:\t" ASM_WORD_INSN "1b, %c0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) "\t.short %c1, %c2\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) "\t.org 2b+%c3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) "\t.popsection" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) : : "i" (__FILE__), "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) "i" (BUGFLAG_WARNING|(flags)), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) "i" (sizeof(struct bug_entry)) ); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define __WARN_FLAGS(flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) asm volatile("\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) "1:\t" PARISC_BUG_BREAK_ASM "\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) "\t.pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) "2:\t" ASM_WORD_INSN "1b\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) "\t.short %c0\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) "\t.org 2b+%c1\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) "\t.popsection" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) : : "i" (BUGFLAG_WARNING|(flags)), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) "i" (sizeof(struct bug_entry)) ); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) } while(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define WARN_ON(x) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int __ret_warn_on = !!(x); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (__builtin_constant_p(__ret_warn_on)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (__ret_warn_on) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) __WARN(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) } else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (unlikely(__ret_warn_on)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) __WARN(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) unlikely(__ret_warn_on); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #include <asm-generic/bug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)