| 
									
										
										
										
											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 */
 | 
					
						
							| 
									
										
										
										
											2009-08-22 05:28:25 +09:00
										 |  |  | #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				\
 | 
					
						
							|  |  |  | 	"\t.pushsection __bug_table,\"a\"\n"	\ | 
					
						
							|  |  |  | 	"2:\t.long 1b, %O1\n"			\ | 
					
						
							|  |  |  | 	"\t.short %O2, %O3\n"			\ | 
					
						
							|  |  |  | 	"\t.org 2b+%O4\n"			\ | 
					
						
							|  |  |  | 	"\t.popsection\n" | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define _EMIT_BUG_ENTRY				\
 | 
					
						
							|  |  |  | 	"\t.pushsection __bug_table,\"a\"\n"	\ | 
					
						
							|  |  |  | 	"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)));	\ | 
					
						
							| 
									
										
										
										
											2006-12-08 17:41:43 +09:00
										 |  |  | } while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-03 19:34:56 +01:00
										 |  |  | #define __WARN_TAINT(taint)				\
 | 
					
						
							| 
									
										
										
										
											2007-03-08 19:41:21 +09:00
										 |  |  | do {							\ | 
					
						
							|  |  |  | 	__asm__ __volatile__ (				\ | 
					
						
							|  |  |  | 		"1:\t.short %O0\n"			\ | 
					
						
							|  |  |  | 		 _EMIT_BUG_ENTRY			\ | 
					
						
							|  |  |  | 		 :					\ | 
					
						
							|  |  |  | 		 : "n" (TRAPA_BUG_OPCODE),		\ | 
					
						
							|  |  |  | 		   "i" (__FILE__),			\ | 
					
						
							|  |  |  | 		   "i" (__LINE__),			\ | 
					
						
							| 
									
										
										
										
											2010-04-03 19:34:56 +01:00
										 |  |  | 		   "i" (BUGFLAG_TAINT(taint)),		\ | 
					
						
							| 
									
										
										
										
											2007-03-08 19:41:21 +09:00
										 |  |  | 		   "i" (sizeof(struct bug_entry)));	\ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-08 19:41:21 +09:00
										 |  |  | #define WARN_ON(x) ({						\
 | 
					
						
							| 
									
										
										
										
											2007-08-02 00:18:38 +02:00
										 |  |  | 	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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 05:28:25 +09:00
										 |  |  | #define UNWINDER_BUG()					\
 | 
					
						
							| 
									
										
										
										
											2009-08-16 21:54:48 +01:00
										 |  |  | do {							\ | 
					
						
							|  |  |  | 	__asm__ __volatile__ (				\ | 
					
						
							|  |  |  | 		"1:\t.short %O0\n"			\ | 
					
						
							| 
									
										
										
										
											2009-08-22 05:28:25 +09:00
										 |  |  | 		_EMIT_BUG_ENTRY				\ | 
					
						
							| 
									
										
										
										
											2009-08-16 21:54:48 +01:00
										 |  |  | 		 :					\ | 
					
						
							| 
									
										
										
										
											2009-08-22 05:28:25 +09:00
										 |  |  | 		 : "n" (TRAPA_BUG_OPCODE),		\ | 
					
						
							| 
									
										
										
										
											2009-08-16 21:54:48 +01:00
										 |  |  | 		   "i" (__FILE__),			\ | 
					
						
							| 
									
										
										
										
											2009-08-22 05:28:25 +09:00
										 |  |  | 		   "i" (__LINE__),			\ | 
					
						
							|  |  |  | 		   "i" (BUGFLAG_UNWINDER),		\ | 
					
						
							| 
									
										
										
										
											2009-08-16 21:54:48 +01:00
										 |  |  | 		   "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; | 
					
						
							| 
									
										
										
										
											2012-06-14 14:18:51 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* 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)); | 
					
						
							| 
									
										
										
										
											2012-06-14 14:18:51 +09:00
										 |  |  | 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 */
 |