Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ac94932 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds
Browse files

[PATCH] lockdep: beautify x86_64 stacktraces



Beautify x86_64 stacktraces to be more readable.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Acked-by: default avatarAndi Kleen <ak@muc.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e4d91918
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -296,7 +296,7 @@ void __show_regs(struct pt_regs * regs)
		system_utsname.version);
	printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, 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);
	printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
	       regs->rax, regs->rbx, regs->rcx);
+31 −39
Original line number Diff line number Diff line
@@ -111,7 +111,7 @@ static int call_trace = 1;

#ifdef CONFIG_KALLSYMS
# include <linux/kallsyms.h>
int printk_address(unsigned long address)
void printk_address(unsigned long address)
{
	unsigned long offset = 0, symsize;
	const char *symname;
@@ -119,18 +119,21 @@ int printk_address(unsigned long address)
	char *delim = ":";
	char namebuf[128];

	symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf); 
	if (!symname) 
		return printk("[<%016lx>]", address);
	symname = kallsyms_lookup(address, &symsize, &offset,
					&modname, namebuf);
	if (!symname) {
		printk(" [<%016lx>]\n", address);
		return;
	}
	if (!modname)
		modname = delim = ""; 		
        return printk("<%016lx>{%s%s%s%s%+ld}",
		      address, delim, modname, delim, symname, offset); 
	printk(" [<%016lx>] %s%s%s%s+0x%lx/0x%lx\n",
		address, delim, modname, delim, symname, offset, symsize);
}
#else
int printk_address(unsigned long address)
void printk_address(unsigned long address)
{
	return printk("[<%016lx>]", address);
	printk(" [<%016lx>]\n", address);
}
#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)
{
	int i = 11, n = 0;
	int n = 0;

	while (unwind(info) == 0 && UNW_PC(info)) {
		++n;
		if (i > 50) {
			printk("\n       ");
			i = 7;
		} else
			i += printk(" ");
		i += printk_address(UNW_PC(info));
		n++;
		printk_address(UNW_PC(info));
		if (arch_unw_user_mode(info))
			break;
	}
	printk("\n");
	return n;
}

@@ -224,7 +221,7 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
	int i = 11;
	unsigned used = 0;

	printk("\nCall Trace:");
	printk("\nCall Trace:\n");

	if (!tsk)
		tsk = current;
@@ -254,12 +251,6 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
	do while (cond) { \
		unsigned long addr = *stack++; \
		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 \
			 * 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 \
			 * out the call path that was taken. \
			 */ \
			i += printk_address(addr); \
			printk_address(addr); \
		} \
	} while (0)

@@ -279,9 +270,9 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
						&used, &id);

		if (estack_end) {
			i += printk(" <%s>", id);
			printk(" <%s>", id);
			HANDLE_STACK (stack < estack_end);
			i += printk(" <EOE>");
			printk(" <EOE>");
			stack = (unsigned long *) estack_end[-2];
			continue;
		}
@@ -291,11 +282,11 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
				(IRQSTACKSIZE - 64) / sizeof(*irqstack);

			if (stack >= irqstack && stack < irqstack_end) {
				i += printk(" <IRQ>");
				printk(" <IRQ>");
				HANDLE_STACK (stack < irqstack_end);
				stack = (unsigned long *) (irqstack_end[-1]);
				irqstack_end = NULL;
				i += printk(" <EOI>");
				printk(" <EOI>");
				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);
#undef HANDLE_STACK

	printk("\n");
}

+0 −1
Original line number Diff line number Diff line
@@ -570,7 +570,6 @@ no_context:
		printk(KERN_ALERT "Unable to handle kernel paging request");
	printk(" at %016lx RIP: \n" KERN_ALERT,address);
	printk_address(regs->rip);
	printk("\n");
	dump_pagetable(address);
	tsk->thread.cr2 = address;
	tsk->thread.trap_no = 14;
+1 −1
Original line number Diff line number Diff line
@@ -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);
} 

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 show_registers(struct pt_regs *regs);