aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/dumpstack_64.c
diff options
context:
space:
mode:
authorAlexander van Heukelum <heukelum@fastmail.fm>2008-10-04 17:12:46 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-13 04:33:45 -0400
commit8a541665b9063c5006b370d4488cf9f6beb6083f (patch)
treefe3411f956e0be63f9eee4ca6c49df2276be4571 /arch/x86/kernel/dumpstack_64.c
parent802a67de0cbd1ef10df80ad48b840e2103b13e52 (diff)
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: Alexander van Heukelum <heukelum@fastmail.fm> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/dumpstack_64.c')
-rw-r--r--arch/x86/kernel/dumpstack_64.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
index 7fd32944ceac..13379a988292 100644
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -16,8 +16,11 @@
16 16
17#include <asm/stacktrace.h> 17#include <asm/stacktrace.h>
18 18
19#define STACKSLOTS_PER_LINE 4
20#define get_bp(bp) asm("movl %%rbp, %0" : "=r" (bp) :)
21
19int panic_on_unrecovered_nmi; 22int panic_on_unrecovered_nmi;
20int kstack_depth_to_print = 12; 23int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE;
21static unsigned int code_bytes = 64; 24static unsigned int code_bytes = 64;
22static int die_counter; 25static int die_counter;
23 26
@@ -177,7 +180,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
177 if (!bp) { 180 if (!bp) {
178 if (task == current) { 181 if (task == current) {
179 /* Grab bp right from our regs */ 182 /* Grab bp right from our regs */
180 asm("movq %%rbp, %0" : "=r" (bp) : ); 183 get_bp(bp);
181 } else { 184 } else {
182 /* bp is the last reg pushed by switch_to */ 185 /* bp is the last reg pushed by switch_to */
183 bp = *(unsigned long *) task->thread.sp; 186 bp = *(unsigned long *) task->thread.sp;
@@ -329,7 +332,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
329 if (((long) stack & (THREAD_SIZE-1)) == 0) 332 if (((long) stack & (THREAD_SIZE-1)) == 0)
330 break; 333 break;
331 } 334 }
332 if (i && ((i % 4) == 0)) 335 if (i && ((i % STACKSLOTS_PER_LINE) == 0))
333 printk("\n%s", log_lvl); 336 printk("\n%s", log_lvl);
334 printk(" %016lx", *stack++); 337 printk(" %016lx", *stack++);
335 touch_nmi_watchdog(); 338 touch_nmi_watchdog();
@@ -353,7 +356,7 @@ void dump_stack(void)
353 356
354#ifdef CONFIG_FRAME_POINTER 357#ifdef CONFIG_FRAME_POINTER
355 if (!bp) 358 if (!bp)
356 asm("movq %%rbp, %0" : "=r" (bp) : ); 359 get_bp(bp);
357#endif 360#endif
358 361
359 printk("Pid: %d, comm: %.20s %s %s %.*s\n", 362 printk("Pid: %d, comm: %.20s %s %s %.*s\n",
@@ -396,7 +399,7 @@ void show_registers(struct pt_regs *regs)
396 399
397 ip = (u8 *)regs->ip - code_prologue; 400 ip = (u8 *)regs->ip - code_prologue;
398 if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) { 401 if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
399 /* try starting at RIP */ 402 /* try starting at IP */
400 ip = (u8 *)regs->ip; 403 ip = (u8 *)regs->ip;
401 code_len = code_len - code_prologue + 1; 404 code_len = code_len - code_prologue + 1;
402 } 405 }
@@ -475,7 +478,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr)
475 478
476int __kprobes __die(const char *str, struct pt_regs *regs, long err) 479int __kprobes __die(const char *str, struct pt_regs *regs, long err)
477{ 480{
478 printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff, ++die_counter); 481 printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);
479#ifdef CONFIG_PREEMPT 482#ifdef CONFIG_PREEMPT
480 printk("PREEMPT "); 483 printk("PREEMPT ");
481#endif 484#endif