Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 43511
b: refs/heads/master
c: a8605ae
h: refs/heads/master
i:
  43509: 387bf4d
  43507: 5250c60
  43503: 103c8f0
v: v3
  • Loading branch information
Judith Lebzelter authored and Linus Torvalds committed Dec 8, 2006
1 parent fd56e5b commit 6f464ea
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 59 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e182c965b6ce0dffed0967a1be2173825a2ede2f
refs/heads/master: a8605aef813f8eb3ef4b80d32cba6a671ef8deb0
5 changes: 5 additions & 0 deletions trunk/arch/ppc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ config ARCH_MAY_HAVE_PC_FDC
bool
default y

config GENERIC_BUG
bool
default y
depends on BUG

source "init/Kconfig"

menu "Processor"
Expand Down
64 changes: 6 additions & 58 deletions trunk/arch/ppc/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/prctl.h>
#include <linux/bug.h>

#include <asm/pgtable.h>
#include <asm/uaccess.h>
Expand Down Expand Up @@ -559,64 +560,9 @@ static void emulate_single_step(struct pt_regs *regs)
}
}

/*
* 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;

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)
int is_valid_bugaddr(unsigned long addr)
{
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;
return addr >= PAGE_OFFSET;
}

void program_check_exception(struct pt_regs *regs)
Expand Down Expand Up @@ -671,7 +617,9 @@ void program_check_exception(struct pt_regs *regs)
/* trap exception */
if (debugger_bpt(regs))
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;
return;
}
Expand Down

0 comments on commit 6f464ea

Please sign in to comment.