Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) | |
3 | * Licensed under the GPL | |
4 | */ | |
5 | ||
6 | #include "linux/sched.h" | |
7 | #include "linux/kernel.h" | |
8 | #include "linux/module.h" | |
9 | #include "linux/kallsyms.h" | |
10 | #include "asm/page.h" | |
11 | #include "asm/processor.h" | |
12 | #include "sysrq.h" | |
13 | #include "user_util.h" | |
14 | ||
b3461034 PBG |
15 | /* Catch non-i386 SUBARCH's. */ |
16 | #if !defined(CONFIG_UML_X86) || defined(CONFIG_64BIT) | |
17 | void show_trace(struct task_struct *task, unsigned long * stack) | |
1da177e4 | 18 | { |
1da177e4 LT |
19 | unsigned long addr; |
20 | ||
21 | if (!stack) { | |
b3461034 | 22 | stack = (unsigned long*) &stack; |
1da177e4 LT |
23 | WARN_ON(1); |
24 | } | |
25 | ||
26 | printk("Call Trace: \n"); | |
27 | while (((long) stack & (THREAD_SIZE-1)) != 0) { | |
28 | addr = *stack; | |
29 | if (__kernel_text_address(addr)) { | |
30 | printk("%08lx: [<%08lx>]", (unsigned long) stack, addr); | |
31 | print_symbol(" %s", addr); | |
32 | printk("\n"); | |
33 | } | |
34 | stack++; | |
35 | } | |
36 | printk("\n"); | |
37 | } | |
b3461034 | 38 | #endif |
1da177e4 LT |
39 | |
40 | /* | |
41 | * stack dumps generator - this is used by arch-independent code. | |
42 | * And this is identical to i386 currently. | |
43 | */ | |
44 | void dump_stack(void) | |
45 | { | |
46 | unsigned long stack; | |
47 | ||
b3461034 | 48 | show_trace(current, &stack); |
1da177e4 LT |
49 | } |
50 | EXPORT_SYMBOL(dump_stack); | |
51 | ||
52 | /*Stolen from arch/i386/kernel/traps.c */ | |
53 | static int kstack_depth_to_print = 24; | |
54 | ||
55 | /* This recently started being used in arch-independent code too, as in | |
56 | * kernel/sched.c.*/ | |
57 | void show_stack(struct task_struct *task, unsigned long *esp) | |
58 | { | |
59 | unsigned long *stack; | |
60 | int i; | |
61 | ||
62 | if (esp == NULL) { | |
b3461034 | 63 | if (task != current && task != NULL) { |
1da177e4 | 64 | esp = (unsigned long *) KSTK_ESP(task); |
1da177e4 LT |
65 | } else { |
66 | esp = (unsigned long *) &esp; | |
67 | } | |
68 | } | |
69 | ||
70 | stack = esp; | |
71 | for(i = 0; i < kstack_depth_to_print; i++) { | |
72 | if (kstack_end(stack)) | |
73 | break; | |
74 | if (i && ((i % 8) == 0)) | |
75 | printk("\n "); | |
76 | printk("%08lx ", *stack++); | |
77 | } | |
78 | ||
b3461034 | 79 | printk("Call Trace: \n"); |
fad1c45c | 80 | show_trace(task, esp); |
1da177e4 | 81 | } |