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