diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack_64.c')
| -rw-r--r-- | arch/x86/kernel/dumpstack_64.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index a071e6be177e..8e740934bd1f 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -10,26 +10,28 @@ | |||
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 11 | #include <linux/ptrace.h> | 11 | #include <linux/ptrace.h> |
| 12 | #include <linux/kexec.h> | 12 | #include <linux/kexec.h> |
| 13 | #include <linux/sysfs.h> | ||
| 13 | #include <linux/bug.h> | 14 | #include <linux/bug.h> |
| 14 | #include <linux/nmi.h> | 15 | #include <linux/nmi.h> |
| 15 | #include <linux/sysfs.h> | ||
| 16 | 16 | ||
| 17 | #include <asm/stacktrace.h> | 17 | #include <asm/stacktrace.h> |
| 18 | 18 | ||
| 19 | #include "dumpstack.h" | 19 | #include "dumpstack.h" |
| 20 | 20 | ||
| 21 | #define N_EXCEPTION_STACKS_END \ | ||
| 22 | (N_EXCEPTION_STACKS + DEBUG_STKSZ/EXCEPTION_STKSZ - 2) | ||
| 21 | 23 | ||
| 22 | static char x86_stack_ids[][8] = { | 24 | static char x86_stack_ids[][8] = { |
| 23 | [DEBUG_STACK - 1] = "#DB", | 25 | [ DEBUG_STACK-1 ] = "#DB", |
| 24 | [NMI_STACK - 1] = "NMI", | 26 | [ NMI_STACK-1 ] = "NMI", |
| 25 | [DOUBLEFAULT_STACK - 1] = "#DF", | 27 | [ DOUBLEFAULT_STACK-1 ] = "#DF", |
| 26 | [STACKFAULT_STACK - 1] = "#SS", | 28 | [ STACKFAULT_STACK-1 ] = "#SS", |
| 27 | [MCE_STACK - 1] = "#MC", | 29 | [ MCE_STACK-1 ] = "#MC", |
| 28 | #if DEBUG_STKSZ > EXCEPTION_STKSZ | 30 | #if DEBUG_STKSZ > EXCEPTION_STKSZ |
| 29 | [N_EXCEPTION_STACKS ... | 31 | [ N_EXCEPTION_STACKS ... |
| 30 | N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]" | 32 | N_EXCEPTION_STACKS_END ] = "#DB[?]" |
| 31 | #endif | 33 | #endif |
| 32 | }; | 34 | }; |
| 33 | 35 | ||
| 34 | int x86_is_stack_id(int id, char *name) | 36 | int x86_is_stack_id(int id, char *name) |
| 35 | { | 37 | { |
| @@ -37,7 +39,7 @@ int x86_is_stack_id(int id, char *name) | |||
| 37 | } | 39 | } |
| 38 | 40 | ||
| 39 | static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, | 41 | static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, |
| 40 | unsigned *usedp, char **idp) | 42 | unsigned *usedp, char **idp) |
| 41 | { | 43 | { |
| 42 | unsigned k; | 44 | unsigned k; |
| 43 | 45 | ||
| @@ -202,21 +204,24 @@ EXPORT_SYMBOL(dump_trace); | |||
| 202 | 204 | ||
| 203 | void | 205 | void |
| 204 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 206 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 205 | unsigned long *sp, unsigned long bp, char *log_lvl) | 207 | unsigned long *sp, unsigned long bp, char *log_lvl) |
| 206 | { | 208 | { |
| 209 | unsigned long *irq_stack_end; | ||
| 210 | unsigned long *irq_stack; | ||
| 207 | unsigned long *stack; | 211 | unsigned long *stack; |
| 212 | int cpu; | ||
| 208 | int i; | 213 | int i; |
| 209 | const int cpu = smp_processor_id(); | 214 | |
| 210 | unsigned long *irq_stack_end = | 215 | preempt_disable(); |
| 211 | (unsigned long *)(per_cpu(irq_stack_ptr, cpu)); | 216 | cpu = smp_processor_id(); |
| 212 | unsigned long *irq_stack = | 217 | |
| 213 | (unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE); | 218 | irq_stack_end = (unsigned long *)(per_cpu(irq_stack_ptr, cpu)); |
| 219 | irq_stack = (unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE); | ||
| 214 | 220 | ||
| 215 | /* | 221 | /* |
| 216 | * debugging aid: "show_stack(NULL, NULL);" prints the | 222 | * Debugging aid: "show_stack(NULL, NULL);" prints the |
| 217 | * back trace for this cpu. | 223 | * back trace for this cpu: |
| 218 | */ | 224 | */ |
| 219 | |||
| 220 | if (sp == NULL) { | 225 | if (sp == NULL) { |
| 221 | if (task) | 226 | if (task) |
| 222 | sp = (unsigned long *)task->thread.sp; | 227 | sp = (unsigned long *)task->thread.sp; |
| @@ -240,6 +245,8 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 240 | printk(" %016lx", *stack++); | 245 | printk(" %016lx", *stack++); |
| 241 | touch_nmi_watchdog(); | 246 | touch_nmi_watchdog(); |
| 242 | } | 247 | } |
| 248 | preempt_enable(); | ||
| 249 | |||
| 243 | printk("\n"); | 250 | printk("\n"); |
| 244 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); | 251 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); |
| 245 | } | 252 | } |
| @@ -303,4 +310,3 @@ int is_valid_bugaddr(unsigned long ip) | |||
| 303 | 310 | ||
| 304 | return ud2 == 0x0b0f; | 311 | return ud2 == 0x0b0f; |
| 305 | } | 312 | } |
| 306 | |||
