mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
[PATCH] Generic BUG for i386
This makes i386 use the generic BUG machinery. There are no functional changes from the old i386 implementation. The main advantage in using the generic BUG machinery for i386 is that the inlined overhead of BUG is just the ud2a instruction; the file+line(+function) information are no longer inlined into the instruction stream. This reduces cache pollution, and makes disassembly work properly. Signed-off-by: Jeremy Fitzhardinge <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Hugh Dickens <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Rusty Russell <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
7664c5a1da
commit
91768d6c2b
6 changed files with 42 additions and 40 deletions
|
|
@ -49,6 +49,11 @@ config GENERIC_IOMAP
|
|||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_BUG
|
||||
bool
|
||||
default y
|
||||
depends on BUG
|
||||
|
||||
config GENERIC_HWEIGHT
|
||||
bool
|
||||
default y
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/fs.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
#if 0
|
||||
#define DEBUGP printk
|
||||
|
|
@ -141,10 +142,11 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
apply_paravirt(pseg, pseg + para->sh_size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return module_bug_finalize(hdr, sechdrs, me);
|
||||
}
|
||||
|
||||
void module_arch_cleanup(struct module *mod)
|
||||
{
|
||||
alternatives_smp_module_del(mod);
|
||||
module_bug_cleanup(mod);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/unwind.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
#ifdef CONFIG_EISA
|
||||
#include <linux/ioport.h>
|
||||
|
|
@ -420,43 +421,22 @@ void show_registers(struct pt_regs *regs)
|
|||
printk("\n");
|
||||
}
|
||||
|
||||
static void handle_BUG(struct pt_regs *regs)
|
||||
int is_valid_bugaddr(unsigned long eip)
|
||||
{
|
||||
unsigned long eip = regs->eip;
|
||||
unsigned short ud2;
|
||||
|
||||
if (eip < PAGE_OFFSET)
|
||||
return;
|
||||
return 0;
|
||||
if (probe_kernel_address((unsigned short *)eip, ud2))
|
||||
return;
|
||||
if (ud2 != 0x0b0f)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
printk(KERN_EMERG "------------[ cut here ]------------\n");
|
||||
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
do {
|
||||
unsigned short line;
|
||||
char *file;
|
||||
char c;
|
||||
|
||||
if (probe_kernel_address((unsigned short *)(eip + 2), line))
|
||||
break;
|
||||
if (probe_kernel_address((char **)(eip + 4), file) ||
|
||||
(unsigned long)file < PAGE_OFFSET ||
|
||||
probe_kernel_address(file, c))
|
||||
file = "<bad filename>";
|
||||
|
||||
printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line);
|
||||
return;
|
||||
} while (0);
|
||||
#endif
|
||||
printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n");
|
||||
return ud2 == 0x0b0f;
|
||||
}
|
||||
|
||||
/* This is gone through when something in the kernel
|
||||
* has done something bad and is about to be terminated.
|
||||
*/
|
||||
/*
|
||||
* This is gone through when something in the kernel has done something bad and
|
||||
* is about to be terminated.
|
||||
*/
|
||||
void die(const char * str, struct pt_regs * regs, long err)
|
||||
{
|
||||
static struct {
|
||||
|
|
@ -488,7 +468,8 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|||
unsigned long esp;
|
||||
unsigned short ss;
|
||||
|
||||
handle_BUG(regs);
|
||||
report_bug(regs->eip);
|
||||
|
||||
printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
|
||||
#ifdef CONFIG_PREEMPT
|
||||
printk(KERN_EMERG "PREEMPT ");
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ SECTIONS
|
|||
|
||||
RODATA
|
||||
|
||||
BUG_TABLE
|
||||
|
||||
. = ALIGN(4);
|
||||
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
|
||||
__tracedata_start = .;
|
||||
|
|
|
|||
Loading…
Reference in a new issue