^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012 Regents of the University of California
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef _ASM_RISCV_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define _ASM_RISCV_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/const.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/asm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define __INSN_LENGTH_MASK _UL(0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define __INSN_LENGTH_32 _UL(0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define __COMPRESSED_INSN_MASK _UL(0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define __BUG_INSN_32 _UL(0x00100073) /* ebreak */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define __BUG_INSN_16 _UL(0x9002) /* c.ebreak */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define GET_INSN_LENGTH(insn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) unsigned long __len; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) __len = ((insn & __INSN_LENGTH_MASK) == __INSN_LENGTH_32) ? \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 4UL : 2UL; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) __len; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) typedef u32 bug_insn_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define __BUG_ENTRY_ADDR RISCV_INT " 1b - 2b"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define __BUG_ENTRY_FILE RISCV_INT " %0 - 2b"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define __BUG_ENTRY_ADDR RISCV_PTR " 1b"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define __BUG_ENTRY_FILE RISCV_PTR " %0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #ifdef CONFIG_DEBUG_BUGVERBOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define __BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) __BUG_ENTRY_ADDR "\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) __BUG_ENTRY_FILE "\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) RISCV_SHORT " %1\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) RISCV_SHORT " %2"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define __BUG_ENTRY \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) __BUG_ENTRY_ADDR "\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) RISCV_SHORT " %2"
^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) #ifdef CONFIG_GENERIC_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define __BUG_FLAGS(flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) __asm__ __volatile__ ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) "1:\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) "ebreak\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ".pushsection __bug_table,\"aw\"\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) "2:\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) __BUG_ENTRY "\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ".org 2b + %3\n\t" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ".popsection" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) : "i" (__FILE__), "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) "i" (flags), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) "i" (sizeof(struct bug_entry))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #else /* CONFIG_GENERIC_BUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define __BUG_FLAGS(flags) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) __asm__ __volatile__ ("ebreak\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #endif /* CONFIG_GENERIC_BUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define BUG() do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) __BUG_FLAGS(0); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unreachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define __WARN_FLAGS(flags) __BUG_FLAGS(BUGFLAG_WARNING|(flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define HAVE_ARCH_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #include <asm-generic/bug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct pt_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct task_struct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) void die(struct pt_regs *regs, const char *str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #endif /* _ASM_RISCV_BUG_H */