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

Commit 8a541665 authored by Alexander van Heukelum's avatar Alexander van Heukelum Committed by Ingo Molnar
Browse files

dumpstack: x86: various small unification steps



- define STACKSLOTS_PER_LINE and use it
 - define get_bp macro to hide the %%ebp/%%rbp difference
 - i386: check task==NULL in dump_trace, like x86_64
 - i386: show_trace(NULL, ...) uses current automatically
 - x86_64: use [#%d] for die_counter, like i386
 - whitespace and comments

Signed-off-by: default avatarAlexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 802a67de
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -16,8 +16,11 @@

#include <asm/stacktrace.h>

#define STACKSLOTS_PER_LINE 8
#define get_bp(bp) asm("movl %%ebp, %0" : "=r" (bp) :)

int panic_on_unrecovered_nmi;
int kstack_depth_to_print = 24;
int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE;
static unsigned int code_bytes = 64;
static int die_counter;

@@ -82,7 +85,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
	if (!stack) {
		unsigned long dummy;
		stack = &dummy;
		if (task != current)
		if (task && task != current)
			stack = (unsigned long *)task->thread.sp;
	}

@@ -90,7 +93,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
	if (!bp) {
		if (task == current) {
			/* Grab bp right from our regs */
			asm("movl %%ebp, %0" : "=r" (bp) :);
			get_bp(bp);
		} else {
			/* bp is the last reg pushed by switch_to */
			bp = *(unsigned long *) task->thread.sp;
@@ -183,7 +186,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
	for (i = 0; i < kstack_depth_to_print; i++) {
		if (kstack_end(stack))
			break;
		if (i && ((i % 8) == 0))
		if (i && ((i % STACKSLOTS_PER_LINE) == 0))
			printk("\n%s", log_lvl);
		printk(" %08lx", *stack++);
		touch_nmi_watchdog();
@@ -207,7 +210,7 @@ void dump_stack(void)

#ifdef CONFIG_FRAME_POINTER
	if (!bp)
		asm("movl %%ebp, %0" : "=r" (bp):);
		get_bp(bp);
#endif

	printk("Pid: %d, comm: %.20s %s %s %.*s\n",
@@ -215,8 +218,7 @@ void dump_stack(void)
		init_utsname()->release,
		(int)strcspn(init_utsname()->version, " "),
		init_utsname()->version);

	show_trace(current, NULL, &stack, bp);
	show_trace(NULL, NULL, &stack, bp);
}

EXPORT_SYMBOL(dump_stack);
@@ -249,7 +251,7 @@ void show_registers(struct pt_regs *regs)

		ip = (u8 *)regs->ip - code_prologue;
		if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
			/* try starting at EIP */
			/* try starting at IP */
			ip = (u8 *)regs->ip;
			code_len = code_len - code_prologue + 1;
		}
@@ -317,13 +319,10 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr)

	if (kexec_should_crash(current))
		crash_kexec(regs);

	if (in_interrupt())
		panic("Fatal exception in interrupt");

	if (panic_on_oops)
		panic("Fatal exception");

	oops_exit();
	do_exit(signr);
}
+9 −6
Original line number Diff line number Diff line
@@ -16,8 +16,11 @@

#include <asm/stacktrace.h>

#define STACKSLOTS_PER_LINE 4
#define get_bp(bp) asm("movl %%rbp, %0" : "=r" (bp) :)

int panic_on_unrecovered_nmi;
int kstack_depth_to_print = 12;
int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE;
static unsigned int code_bytes = 64;
static int die_counter;

@@ -177,7 +180,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
	if (!bp) {
		if (task == current) {
			/* Grab bp right from our regs */
			asm("movq %%rbp, %0" : "=r" (bp) : );
			get_bp(bp);
		} else {
			/* bp is the last reg pushed by switch_to */
			bp = *(unsigned long *) task->thread.sp;
@@ -329,7 +332,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
		if (((long) stack & (THREAD_SIZE-1)) == 0)
			break;
		}
		if (i && ((i % 4) == 0))
		if (i && ((i % STACKSLOTS_PER_LINE) == 0))
			printk("\n%s", log_lvl);
		printk(" %016lx", *stack++);
		touch_nmi_watchdog();
@@ -353,7 +356,7 @@ void dump_stack(void)

#ifdef CONFIG_FRAME_POINTER
	if (!bp)
		asm("movq %%rbp, %0" : "=r" (bp) : );
		get_bp(bp);
#endif

	printk("Pid: %d, comm: %.20s %s %s %.*s\n",
@@ -396,7 +399,7 @@ void show_registers(struct pt_regs *regs)

		ip = (u8 *)regs->ip - code_prologue;
		if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
			/* try starting at RIP */
			/* try starting at IP */
			ip = (u8 *)regs->ip;
			code_len = code_len - code_prologue + 1;
		}
@@ -475,7 +478,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr)

int __kprobes __die(const char *str, struct pt_regs *regs, long err)
{
	printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff, ++die_counter);
	printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);
#ifdef CONFIG_PREEMPT
	printk("PREEMPT ");
#endif