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