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