Files

122 lines
2.8 KiB
C
Raw Permalink Normal View History

/* SPDX-License-Identifier: GPL-2.0 */
2005-04-16 15:20:36 -07:00
#ifndef __ASM_SH_BUG_H
#define __ASM_SH_BUG_H
2012-03-28 18:30:03 +01:00
#include <linux/linkage.h>
2007-05-08 12:14:54 +09:00
#define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */
#define BUGFLAG_UNWINDER (1 << 1)
2007-05-08 12:14:54 +09:00
2007-11-08 18:58:00 +09:00
#ifdef CONFIG_GENERIC_BUG
2007-03-08 19:41:21 +09:00
#define HAVE_ARCH_BUG
#define HAVE_ARCH_WARN_ON
2006-12-08 17:41:43 +09:00
2007-03-08 19:41:21 +09:00
/**
* _EMIT_BUG_ENTRY
* %1 - __FILE__
* %2 - __LINE__
* %3 - trap type
* %4 - sizeof(struct bug_entry)
*
* The trapa opcode itself sits in %0.
* The %O notation is used to avoid # generation.
*
* The offending file and line are encoded in the __bug_table section.
*/
2006-12-08 17:41:43 +09:00
#ifdef CONFIG_DEBUG_BUGVERBOSE
2007-03-08 19:41:21 +09:00
#define _EMIT_BUG_ENTRY \
2017-07-15 00:10:58 -05:00
"\t.pushsection __bug_table,\"aw\"\n" \
2007-03-08 19:41:21 +09:00
"2:\t.long 1b, %O1\n" \
"\t.short %O2, %O3\n" \
"\t.org 2b+%O4\n" \
"\t.popsection\n"
#else
#define _EMIT_BUG_ENTRY \
2017-07-15 00:10:58 -05:00
"\t.pushsection __bug_table,\"aw\"\n" \
2007-03-08 19:41:21 +09:00
"2:\t.long 1b\n" \
"\t.short %O3\n" \
"\t.org 2b+%O4\n" \
"\t.popsection\n"
#endif
2006-12-08 17:41:43 +09:00
#define BUG() \
do { \
__asm__ __volatile__ ( \
2007-03-08 19:41:21 +09:00
"1:\t.short %O0\n" \
_EMIT_BUG_ENTRY \
: \
: "n" (TRAPA_BUG_OPCODE), \
"i" (__FILE__), \
"i" (__LINE__), "i" (0), \
"i" (sizeof(struct bug_entry))); \
unreachable(); \
2005-04-16 15:20:36 -07:00
} while (0)
#define __WARN_FLAGS(cond_str, flags) \
2007-03-08 19:41:21 +09:00
do { \
__asm__ __volatile__ ( \
"1:\t.short %O0\n" \
_EMIT_BUG_ENTRY \
: \
: "n" (TRAPA_BUG_OPCODE), \
"i" (WARN_CONDITION_STR(cond_str) __FILE__), \
2007-03-08 19:41:21 +09:00
"i" (__LINE__), \
2017-02-25 08:56:53 +01:00
"i" (BUGFLAG_WARNING|(flags)), \
2007-03-08 19:41:21 +09:00
"i" (sizeof(struct bug_entry))); \
2006-12-08 17:41:43 +09:00
} while (0)
2007-03-08 19:41:21 +09:00
#define WARN_ON(x) ({ \
int __ret_warn_on = !!(x); \
2007-03-08 19:41:21 +09:00
if (__builtin_constant_p(__ret_warn_on)) { \
if (__ret_warn_on) \
__WARN(); \
} else { \
if (unlikely(__ret_warn_on)) \
__WARN(); \
} \
unlikely(__ret_warn_on); \
})
2006-12-08 17:41:43 +09:00
#define UNWINDER_BUG() \
do { \
__asm__ __volatile__ ( \
"1:\t.short %O0\n" \
_EMIT_BUG_ENTRY \
: \
: "n" (TRAPA_BUG_OPCODE), \
"i" (__FILE__), \
"i" (__LINE__), \
"i" (BUGFLAG_UNWINDER), \
"i" (sizeof(struct bug_entry))); \
} while (0)
#define UNWINDER_BUG_ON(x) ({ \
int __ret_unwinder_on = !!(x); \
if (__builtin_constant_p(__ret_unwinder_on)) { \
if (__ret_unwinder_on) \
UNWINDER_BUG(); \
} else { \
if (unlikely(__ret_unwinder_on)) \
UNWINDER_BUG(); \
} \
unlikely(__ret_unwinder_on); \
})
2009-08-22 05:31:45 +09:00
#else
#define UNWINDER_BUG BUG
#define UNWINDER_BUG_ON BUG_ON
2007-11-08 18:58:00 +09:00
#endif /* CONFIG_GENERIC_BUG */
2005-05-01 08:59:01 -07:00
2005-04-16 15:20:36 -07:00
#include <asm-generic/bug.h>
2012-03-28 18:30:03 +01:00
struct pt_regs;
/* arch/sh/kernel/traps.c */
2012-03-28 18:30:03 +01:00
extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn));
extern void die_if_kernel(const char *str, struct pt_regs *regs, long err);
extern void die_if_no_fixup(const char *str, struct pt_regs *regs, long err);
2012-03-28 18:30:03 +01:00
2006-12-08 17:41:43 +09:00
#endif /* __ASM_SH_BUG_H */