18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_S390_BUG_H
38c2ecf20Sopenharmony_ci#define _ASM_S390_BUG_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/compiler.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifdef CONFIG_BUG
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_BUGVERBOSE
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define __EMIT_BUG(x) do {					\
128c2ecf20Sopenharmony_ci	asm_inline volatile(					\
138c2ecf20Sopenharmony_ci		"0:	mc	0,0\n"				\
148c2ecf20Sopenharmony_ci		".section .rodata.str,\"aMS\",@progbits,1\n"	\
158c2ecf20Sopenharmony_ci		"1:	.asciz	\""__FILE__"\"\n"		\
168c2ecf20Sopenharmony_ci		".previous\n"					\
178c2ecf20Sopenharmony_ci		".section __bug_table,\"awM\",@progbits,%2\n"	\
188c2ecf20Sopenharmony_ci		"2:	.long	0b-2b,1b-2b\n"			\
198c2ecf20Sopenharmony_ci		"	.short	%0,%1\n"			\
208c2ecf20Sopenharmony_ci		"	.org	2b+%2\n"			\
218c2ecf20Sopenharmony_ci		".previous\n"					\
228c2ecf20Sopenharmony_ci		: : "i" (__LINE__),				\
238c2ecf20Sopenharmony_ci		    "i" (x),					\
248c2ecf20Sopenharmony_ci		    "i" (sizeof(struct bug_entry)));		\
258c2ecf20Sopenharmony_ci} while (0)
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#else /* CONFIG_DEBUG_BUGVERBOSE */
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define __EMIT_BUG(x) do {					\
308c2ecf20Sopenharmony_ci	asm_inline volatile(					\
318c2ecf20Sopenharmony_ci		"0:	mc	0,0\n"				\
328c2ecf20Sopenharmony_ci		".section __bug_table,\"awM\",@progbits,%1\n"	\
338c2ecf20Sopenharmony_ci		"1:	.long	0b-1b\n"			\
348c2ecf20Sopenharmony_ci		"	.short	%0\n"				\
358c2ecf20Sopenharmony_ci		"	.org	1b+%1\n"			\
368c2ecf20Sopenharmony_ci		".previous\n"					\
378c2ecf20Sopenharmony_ci		: : "i" (x),					\
388c2ecf20Sopenharmony_ci		    "i" (sizeof(struct bug_entry)));		\
398c2ecf20Sopenharmony_ci} while (0)
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#endif /* CONFIG_DEBUG_BUGVERBOSE */
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#define BUG() do {					\
448c2ecf20Sopenharmony_ci	__EMIT_BUG(0);					\
458c2ecf20Sopenharmony_ci	unreachable();					\
468c2ecf20Sopenharmony_ci} while (0)
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#define __WARN_FLAGS(flags) do {			\
498c2ecf20Sopenharmony_ci	__EMIT_BUG(BUGFLAG_WARNING|(flags));		\
508c2ecf20Sopenharmony_ci} while (0)
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci#define WARN_ON(x) ({					\
538c2ecf20Sopenharmony_ci	int __ret_warn_on = !!(x);			\
548c2ecf20Sopenharmony_ci	if (__builtin_constant_p(__ret_warn_on)) {	\
558c2ecf20Sopenharmony_ci		if (__ret_warn_on)			\
568c2ecf20Sopenharmony_ci			__WARN();			\
578c2ecf20Sopenharmony_ci	} else {					\
588c2ecf20Sopenharmony_ci		if (unlikely(__ret_warn_on))		\
598c2ecf20Sopenharmony_ci			__WARN();			\
608c2ecf20Sopenharmony_ci	}						\
618c2ecf20Sopenharmony_ci	unlikely(__ret_warn_on);			\
628c2ecf20Sopenharmony_ci})
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#define HAVE_ARCH_BUG
658c2ecf20Sopenharmony_ci#define HAVE_ARCH_WARN_ON
668c2ecf20Sopenharmony_ci#endif /* CONFIG_BUG */
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#include <asm-generic/bug.h>
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#endif /* _ASM_S390_BUG_H */
71