mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
![David Gibson](/assets/img/avatar_default.png)
This patch consolidates macros used to generate assembly for compatibility across different CPUs or configs. A new header, asm-powerpc/asm-compat.h contains the main compatibility macros. It uses some preprocessor magic to make the macros suitable both for use in .S files, and in inline asm in .c files. Headers (bitops.h, uaccess.h, atomic.h, bug.h) which had their own such compatibility macros are changed to use asm-compat.h. ppc_asm.h is now for use in .S files *only*, and a #error enforces that. As such, we're a lot more careless about namespace pollution here than in asm-compat.h. While we're at it, this patch adds a call to the PPC405_ERR77 macro in futex.h which should have had it already, but didn't. Built and booted on pSeries, Maple and iSeries (ARCH=powerpc). Built for 32-bit powermac (ARCH=powerpc) and Walnut (ARCH=ppc). Signed-off-by: David Gibson <dwg@au1.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
70 lines
1.7 KiB
C
70 lines
1.7 KiB
C
#ifndef _ASM_POWERPC_BUG_H
|
|
#define _ASM_POWERPC_BUG_H
|
|
|
|
#include <asm/asm-compat.h>
|
|
/*
|
|
* Define an illegal instr to trap on the bug.
|
|
* We don't use 0 because that marks the end of a function
|
|
* in the ELF ABI. That's "Boo Boo" in case you wonder...
|
|
*/
|
|
#define BUG_OPCODE .long 0x00b00b00 /* For asm */
|
|
#define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
struct bug_entry {
|
|
unsigned long bug_addr;
|
|
long line;
|
|
const char *file;
|
|
const char *function;
|
|
};
|
|
|
|
struct bug_entry *find_bug(unsigned long bugaddr);
|
|
|
|
/*
|
|
* If this bit is set in the line number it means that the trap
|
|
* is for WARN_ON rather than BUG or BUG_ON.
|
|
*/
|
|
#define BUG_WARNING_TRAP 0x1000000
|
|
|
|
#ifdef CONFIG_BUG
|
|
|
|
#define BUG() do { \
|
|
__asm__ __volatile__( \
|
|
"1: twi 31,0,0\n" \
|
|
".section __bug_table,\"a\"\n" \
|
|
"\t"PPC_LONG" 1b,%0,%1,%2\n" \
|
|
".previous" \
|
|
: : "i" (__LINE__), "i" (__FILE__), "i" (__FUNCTION__)); \
|
|
} while (0)
|
|
|
|
#define BUG_ON(x) do { \
|
|
__asm__ __volatile__( \
|
|
"1: "PPC_TLNEI" %0,0\n" \
|
|
".section __bug_table,\"a\"\n" \
|
|
"\t"PPC_LONG" 1b,%1,%2,%3\n" \
|
|
".previous" \
|
|
: : "r" ((long)(x)), "i" (__LINE__), \
|
|
"i" (__FILE__), "i" (__FUNCTION__)); \
|
|
} while (0)
|
|
|
|
#define WARN_ON(x) do { \
|
|
__asm__ __volatile__( \
|
|
"1: "PPC_TLNEI" %0,0\n" \
|
|
".section __bug_table,\"a\"\n" \
|
|
"\t"PPC_LONG" 1b,%1,%2,%3\n" \
|
|
".previous" \
|
|
: : "r" ((long)(x)), \
|
|
"i" (__LINE__ + BUG_WARNING_TRAP), \
|
|
"i" (__FILE__), "i" (__FUNCTION__)); \
|
|
} while (0)
|
|
|
|
#define HAVE_ARCH_BUG
|
|
#define HAVE_ARCH_BUG_ON
|
|
#define HAVE_ARCH_WARN_ON
|
|
#endif /* CONFIG_BUG */
|
|
#endif /* __ASSEMBLY __ */
|
|
|
|
#include <asm-generic/bug.h>
|
|
|
|
#endif /* _ASM_POWERPC_BUG_H */
|