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