mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 20:56:23 +00:00
[PATCH] lockdep: beautify x86_64 stacktraces
Beautify x86_64 stacktraces to be more readable. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Acked-by: Andi Kleen <ak@muc.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e4d9191885
commit
3ac94932a2
4 changed files with 33 additions and 42 deletions
|
@ -296,7 +296,7 @@ void __show_regs(struct pt_regs * regs)
|
||||||
system_utsname.version);
|
system_utsname.version);
|
||||||
printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip);
|
printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip);
|
||||||
printk_address(regs->rip);
|
printk_address(regs->rip);
|
||||||
printk("\nRSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->rsp,
|
printk("RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->rsp,
|
||||||
regs->eflags);
|
regs->eflags);
|
||||||
printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
|
printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
|
||||||
regs->rax, regs->rbx, regs->rcx);
|
regs->rax, regs->rbx, regs->rcx);
|
||||||
|
|
|
@ -111,7 +111,7 @@ static int call_trace = 1;
|
||||||
|
|
||||||
#ifdef CONFIG_KALLSYMS
|
#ifdef CONFIG_KALLSYMS
|
||||||
# include <linux/kallsyms.h>
|
# include <linux/kallsyms.h>
|
||||||
int printk_address(unsigned long address)
|
void printk_address(unsigned long address)
|
||||||
{
|
{
|
||||||
unsigned long offset = 0, symsize;
|
unsigned long offset = 0, symsize;
|
||||||
const char *symname;
|
const char *symname;
|
||||||
|
@ -119,18 +119,21 @@ int printk_address(unsigned long address)
|
||||||
char *delim = ":";
|
char *delim = ":";
|
||||||
char namebuf[128];
|
char namebuf[128];
|
||||||
|
|
||||||
symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf);
|
symname = kallsyms_lookup(address, &symsize, &offset,
|
||||||
if (!symname)
|
&modname, namebuf);
|
||||||
return printk("[<%016lx>]", address);
|
if (!symname) {
|
||||||
|
printk(" [<%016lx>]\n", address);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!modname)
|
if (!modname)
|
||||||
modname = delim = "";
|
modname = delim = "";
|
||||||
return printk("<%016lx>{%s%s%s%s%+ld}",
|
printk(" [<%016lx>] %s%s%s%s+0x%lx/0x%lx\n",
|
||||||
address, delim, modname, delim, symname, offset);
|
address, delim, modname, delim, symname, offset, symsize);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int printk_address(unsigned long address)
|
void printk_address(unsigned long address)
|
||||||
{
|
{
|
||||||
return printk("[<%016lx>]", address);
|
printk(" [<%016lx>]\n", address);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -193,20 +196,14 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
||||||
|
|
||||||
static int show_trace_unwind(struct unwind_frame_info *info, void *context)
|
static int show_trace_unwind(struct unwind_frame_info *info, void *context)
|
||||||
{
|
{
|
||||||
int i = 11, n = 0;
|
int n = 0;
|
||||||
|
|
||||||
while (unwind(info) == 0 && UNW_PC(info)) {
|
while (unwind(info) == 0 && UNW_PC(info)) {
|
||||||
++n;
|
n++;
|
||||||
if (i > 50) {
|
printk_address(UNW_PC(info));
|
||||||
printk("\n ");
|
|
||||||
i = 7;
|
|
||||||
} else
|
|
||||||
i += printk(" ");
|
|
||||||
i += printk_address(UNW_PC(info));
|
|
||||||
if (arch_unw_user_mode(info))
|
if (arch_unw_user_mode(info))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printk("\n");
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,7 +221,7 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
||||||
int i = 11;
|
int i = 11;
|
||||||
unsigned used = 0;
|
unsigned used = 0;
|
||||||
|
|
||||||
printk("\nCall Trace:");
|
printk("\nCall Trace:\n");
|
||||||
|
|
||||||
if (!tsk)
|
if (!tsk)
|
||||||
tsk = current;
|
tsk = current;
|
||||||
|
@ -254,12 +251,6 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
||||||
do while (cond) { \
|
do while (cond) { \
|
||||||
unsigned long addr = *stack++; \
|
unsigned long addr = *stack++; \
|
||||||
if (kernel_text_address(addr)) { \
|
if (kernel_text_address(addr)) { \
|
||||||
if (i > 50) { \
|
|
||||||
printk("\n "); \
|
|
||||||
i = 0; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
i += printk(" "); \
|
|
||||||
/* \
|
/* \
|
||||||
* If the address is either in the text segment of the \
|
* If the address is either in the text segment of the \
|
||||||
* kernel, or in the region which contains vmalloc'ed \
|
* kernel, or in the region which contains vmalloc'ed \
|
||||||
|
@ -268,7 +259,7 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
||||||
* down the cause of the crash will be able to figure \
|
* down the cause of the crash will be able to figure \
|
||||||
* out the call path that was taken. \
|
* out the call path that was taken. \
|
||||||
*/ \
|
*/ \
|
||||||
i += printk_address(addr); \
|
printk_address(addr); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -279,9 +270,9 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
||||||
&used, &id);
|
&used, &id);
|
||||||
|
|
||||||
if (estack_end) {
|
if (estack_end) {
|
||||||
i += printk(" <%s>", id);
|
printk(" <%s>", id);
|
||||||
HANDLE_STACK (stack < estack_end);
|
HANDLE_STACK (stack < estack_end);
|
||||||
i += printk(" <EOE>");
|
printk(" <EOE>");
|
||||||
stack = (unsigned long *) estack_end[-2];
|
stack = (unsigned long *) estack_end[-2];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -291,11 +282,11 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
||||||
(IRQSTACKSIZE - 64) / sizeof(*irqstack);
|
(IRQSTACKSIZE - 64) / sizeof(*irqstack);
|
||||||
|
|
||||||
if (stack >= irqstack && stack < irqstack_end) {
|
if (stack >= irqstack && stack < irqstack_end) {
|
||||||
i += printk(" <IRQ>");
|
printk(" <IRQ>");
|
||||||
HANDLE_STACK (stack < irqstack_end);
|
HANDLE_STACK (stack < irqstack_end);
|
||||||
stack = (unsigned long *) (irqstack_end[-1]);
|
stack = (unsigned long *) (irqstack_end[-1]);
|
||||||
irqstack_end = NULL;
|
irqstack_end = NULL;
|
||||||
i += printk(" <EOI>");
|
printk(" <EOI>");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -304,6 +295,7 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
||||||
|
|
||||||
HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
|
HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
|
||||||
#undef HANDLE_STACK
|
#undef HANDLE_STACK
|
||||||
|
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -570,7 +570,6 @@ no_context:
|
||||||
printk(KERN_ALERT "Unable to handle kernel paging request");
|
printk(KERN_ALERT "Unable to handle kernel paging request");
|
||||||
printk(" at %016lx RIP: \n" KERN_ALERT,address);
|
printk(" at %016lx RIP: \n" KERN_ALERT,address);
|
||||||
printk_address(regs->rip);
|
printk_address(regs->rip);
|
||||||
printk("\n");
|
|
||||||
dump_pagetable(address);
|
dump_pagetable(address);
|
||||||
tsk->thread.cr2 = address;
|
tsk->thread.cr2 = address;
|
||||||
tsk->thread.trap_no = 14;
|
tsk->thread.trap_no = 14;
|
||||||
|
|
|
@ -49,7 +49,7 @@ static inline int notify_die(enum die_val val, const char *str,
|
||||||
return atomic_notifier_call_chain(&die_chain, val, &args);
|
return atomic_notifier_call_chain(&die_chain, val, &args);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int printk_address(unsigned long address);
|
extern void printk_address(unsigned long address);
|
||||||
extern void die(const char *,struct pt_regs *,long);
|
extern void die(const char *,struct pt_regs *,long);
|
||||||
extern void __die(const char *,struct pt_regs *,long);
|
extern void __die(const char *,struct pt_regs *,long);
|
||||||
extern void show_registers(struct pt_regs *regs);
|
extern void show_registers(struct pt_regs *regs);
|
||||||
|
|
Loading…
Reference in a new issue