[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:
Ingo Molnar 2006-07-03 00:24:36 -07:00 committed by Linus Torvalds
parent e4d9191885
commit 3ac94932a2
4 changed files with 33 additions and 42 deletions

View file

@ -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);

View file

@ -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");
} }

View file

@ -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;

View file

@ -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);