at master 129 lines 3.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _ASM_S390_BUG_H 3#define _ASM_S390_BUG_H 4 5#include <linux/compiler.h> 6#include <linux/const.h> 7 8#define MONCODE_BUG _AC(0, U) 9#define MONCODE_BUG_ARG _AC(1, U) 10 11#ifndef __ASSEMBLER__ 12#if defined(CONFIG_BUG) && defined(CONFIG_CC_HAS_ASM_IMMEDIATE_STRINGS) 13 14#ifdef CONFIG_DEBUG_BUGVERBOSE 15#define __BUG_ENTRY_VERBOSE(format, file, line) \ 16 " .long " format " - . # bug_entry::format\n" \ 17 " .long " file " - . # bug_entry::file\n" \ 18 " .short " line " # bug_entry::line\n" 19#else 20#define __BUG_ENTRY_VERBOSE(format, file, line) 21#endif 22 23#ifdef CONFIG_DEBUG_BUGVERBOSE_DETAILED 24#define WARN_CONDITION_STR(cond_str) cond_str 25#else 26#define WARN_CONDITION_STR(cond_str) "" 27#endif 28 29#define __BUG_ENTRY(format, file, line, flags, size) \ 30 " .section __bug_table,\"aw\"\n" \ 31 "1: .long 0b - . # bug_entry::bug_addr\n" \ 32 __BUG_ENTRY_VERBOSE(format, file, line) \ 33 " .short "flags" # bug_entry::flags\n" \ 34 " .org 1b+"size"\n" \ 35 " .previous" 36 37#define __BUG_ASM(cond_str, flags) \ 38do { \ 39 asm_inline volatile("\n" \ 40 "0: mc %[monc](%%r0),0\n" \ 41 __BUG_ENTRY("%[frmt]", "%[file]", "%[line]", \ 42 "%[flgs]", "%[size]") \ 43 : \ 44 : [monc] "i" (MONCODE_BUG), \ 45 [frmt] "i" (WARN_CONDITION_STR(cond_str)), \ 46 [file] "i" (__FILE__), \ 47 [line] "i" (__LINE__), \ 48 [flgs] "i" (flags), \ 49 [size] "i" (sizeof(struct bug_entry))); \ 50} while (0) 51 52#define BUG() \ 53do { \ 54 __BUG_ASM("", 0); \ 55 unreachable(); \ 56} while (0) 57 58#define __WARN_FLAGS(cond_str, flags) \ 59do { \ 60 __BUG_ASM(cond_str, BUGFLAG_WARNING | (flags)); \ 61} while (0) 62 63#define __WARN_bug_entry(flags, format) \ 64({ \ 65 struct bug_entry *bug; \ 66 \ 67 asm_inline volatile("\n" \ 68 "0: larl %[bug],1f\n" \ 69 __BUG_ENTRY("%[frmt]", "%[file]", "%[line]", \ 70 "%[flgs]", "%[size]") \ 71 : [bug] "=d" (bug) \ 72 : [frmt] "i" (format), \ 73 [file] "i" (__FILE__), \ 74 [line] "i" (__LINE__), \ 75 [flgs] "i" (flags), \ 76 [size] "i" (sizeof(struct bug_entry))); \ 77 bug; \ 78}) 79 80/* 81 * Variable Argument List (va_list) as defined in ELF Application 82 * Binary Interface s390x Supplement documentation. 83 */ 84struct arch_va_list { 85 long __gpr; 86 long __fpr; 87 void *__overflow_arg_area; 88 void *__reg_save_area; 89}; 90 91struct bug_entry; 92struct pt_regs; 93 94void *__warn_args(struct arch_va_list *args, struct pt_regs *regs); 95void __WARN_trap(struct bug_entry *bug, ...); 96 97#define __WARN_print_arg(flags, format, arg...) \ 98do { \ 99 int __flags = (flags) | BUGFLAG_WARNING | BUGFLAG_ARGS; \ 100 \ 101 __WARN_trap(__WARN_bug_entry(__flags, format), ## arg); \ 102 /* prevent tail-call optimization */ \ 103 asm(""); \ 104} while (0) 105 106#define __WARN_printf(taint, fmt, arg...) \ 107 __WARN_print_arg(BUGFLAG_TAINT(taint), fmt, ## arg) 108 109#define WARN_ONCE(cond, format, arg...) \ 110({ \ 111 int __ret_warn_on = !!(cond); \ 112 \ 113 if (unlikely(__ret_warn_on)) { \ 114 __WARN_print_arg(BUGFLAG_ONCE|BUGFLAG_TAINT(TAINT_WARN),\ 115 format, ## arg); \ 116 } \ 117 __ret_warn_on; \ 118}) 119 120#define HAVE_ARCH_BUG 121#define HAVE_ARCH_BUG_FORMAT 122#define HAVE_ARCH_BUG_FORMAT_ARGS 123 124#endif /* CONFIG_BUG && CONFIG_CC_HAS_ASM_IMMEDIATE_STRINGS */ 125#endif /* __ASSEMBLER__ */ 126 127#include <asm-generic/bug.h> 128 129#endif /* _ASM_S390_BUG_H */