-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sh: BUG() handling through trapa vector.
Previously we haven't been doing anything with verbose BUG() reporting, and we've been relying on the oops path for handling BUG()'s, which is rather sub-optimal. This switches BUG handling to use a fixed trapa vector (#0x3e) where we construct a small bug frame post trapa instruction to get the context right. This also makes it trivial to wire up a DIE_BUG for the atomic die chain, which we couldn't really do before. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
- Loading branch information
Paul Mundt
committed
Dec 11, 2006
1 parent
1b73e6a
commit dc34d31
Showing
3 changed files
with
89 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,54 @@ | ||
#ifndef __ASM_SH_BUG_H | ||
#define __ASM_SH_BUG_H | ||
|
||
|
||
#ifdef CONFIG_BUG | ||
/* | ||
* Tell the user there is some problem. | ||
*/ | ||
#define BUG() do { \ | ||
printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \ | ||
*(volatile int *)0 = 0; \ | ||
|
||
struct bug_frame { | ||
unsigned short opcode; | ||
unsigned short line; | ||
const char *file; | ||
const char *func; | ||
}; | ||
|
||
struct pt_regs; | ||
|
||
extern void handle_BUG(struct pt_regs *); | ||
|
||
#define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */ | ||
|
||
#ifdef CONFIG_DEBUG_BUGVERBOSE | ||
|
||
#define BUG() \ | ||
do { \ | ||
__asm__ __volatile__ ( \ | ||
".align 2\n\t" \ | ||
".short %O0\n\t" \ | ||
".short %O1\n\t" \ | ||
".long %O2\n\t" \ | ||
".long %O3\n\t" \ | ||
: \ | ||
: "n" (TRAPA_BUG_OPCODE), \ | ||
"i" (__LINE__), "X" (__FILE__), \ | ||
"X" (__FUNCTION__)); \ | ||
} while (0) | ||
|
||
#else | ||
|
||
#define BUG() \ | ||
do { \ | ||
__asm__ __volatile__ ( \ | ||
".align 2\n\t" \ | ||
".short %O0\n\t" \ | ||
: \ | ||
: "n" (TRAPA_BUG_OPCODE)); \ | ||
} while (0) | ||
|
||
#endif /* CONFIG_DEBUG_BUGVERBOSE */ | ||
|
||
#define HAVE_ARCH_BUG | ||
#endif | ||
|
||
#endif /* CONFIG_BUG */ | ||
|
||
#include <asm-generic/bug.h> | ||
|
||
#endif | ||
#endif /* __ASM_SH_BUG_H */ |