[PATCH] use generic BUG for ppc
Switch ppc over to using the generic BUG implementation. Signed-off-by: Judith Lebzelter <judith@osdl.org> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Michael Ellerman <michael@ellerman.id.au> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e182c965b6
commit
a8605aef81
|
@ -52,6 +52,11 @@ config ARCH_MAY_HAVE_PC_FDC
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config GENERIC_BUG
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
depends on BUG
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
|
|
||||||
menu "Processor"
|
menu "Processor"
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/prctl.h>
|
#include <linux/prctl.h>
|
||||||
|
#include <linux/bug.h>
|
||||||
|
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@ -559,64 +560,9 @@ static void emulate_single_step(struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
int is_valid_bugaddr(unsigned long addr)
|
||||||
* Look through the list of trap instructions that are used for BUG(),
|
|
||||||
* BUG_ON() and WARN_ON() and see if we hit one. At this point we know
|
|
||||||
* that the exception was caused by a trap instruction of some kind.
|
|
||||||
* Returns 1 if we should continue (i.e. it was a WARN_ON) or 0
|
|
||||||
* otherwise.
|
|
||||||
*/
|
|
||||||
extern struct bug_entry __start___bug_table[], __stop___bug_table[];
|
|
||||||
|
|
||||||
#ifndef CONFIG_MODULES
|
|
||||||
#define module_find_bug(x) NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct bug_entry *find_bug(unsigned long bugaddr)
|
|
||||||
{
|
{
|
||||||
struct bug_entry *bug;
|
return addr >= PAGE_OFFSET;
|
||||||
|
|
||||||
for (bug = __start___bug_table; bug < __stop___bug_table; ++bug)
|
|
||||||
if (bugaddr == bug->bug_addr)
|
|
||||||
return bug;
|
|
||||||
return module_find_bug(bugaddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_bug_trap(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
struct bug_entry *bug;
|
|
||||||
unsigned long addr;
|
|
||||||
|
|
||||||
if (regs->msr & MSR_PR)
|
|
||||||
return 0; /* not in kernel */
|
|
||||||
addr = regs->nip; /* address of trap instruction */
|
|
||||||
if (addr < PAGE_OFFSET)
|
|
||||||
return 0;
|
|
||||||
bug = find_bug(regs->nip);
|
|
||||||
if (bug == NULL)
|
|
||||||
return 0;
|
|
||||||
if (bug->line & BUG_WARNING_TRAP) {
|
|
||||||
/* this is a WARN_ON rather than BUG/BUG_ON */
|
|
||||||
#ifdef CONFIG_XMON
|
|
||||||
xmon_printf(KERN_ERR "Badness in %s at %s:%ld\n",
|
|
||||||
bug->function, bug->file,
|
|
||||||
bug->line & ~BUG_WARNING_TRAP);
|
|
||||||
#endif /* CONFIG_XMON */
|
|
||||||
printk(KERN_ERR "Badness in %s at %s:%ld\n",
|
|
||||||
bug->function, bug->file,
|
|
||||||
bug->line & ~BUG_WARNING_TRAP);
|
|
||||||
dump_stack();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_XMON
|
|
||||||
xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
|
|
||||||
bug->function, bug->file, bug->line);
|
|
||||||
xmon(regs);
|
|
||||||
#endif /* CONFIG_XMON */
|
|
||||||
printk(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
|
|
||||||
bug->function, bug->file, bug->line);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void program_check_exception(struct pt_regs *regs)
|
void program_check_exception(struct pt_regs *regs)
|
||||||
|
@ -671,7 +617,9 @@ void program_check_exception(struct pt_regs *regs)
|
||||||
/* trap exception */
|
/* trap exception */
|
||||||
if (debugger_bpt(regs))
|
if (debugger_bpt(regs))
|
||||||
return;
|
return;
|
||||||
if (check_bug_trap(regs)) {
|
|
||||||
|
if (!(regs->msr & MSR_PR) && /* not user-mode */
|
||||||
|
report_bug(regs->nip) == BUG_TRAP_TYPE_WARN) {
|
||||||
regs->nip += 4;
|
regs->nip += 4;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue