diff options
Diffstat (limited to 'arch/x86/um/sysrq_32.c')
-rw-r--r-- | arch/x86/um/sysrq_32.c | 66 |
1 files changed, 0 insertions, 66 deletions
diff --git a/arch/x86/um/sysrq_32.c b/arch/x86/um/sysrq_32.c index c9bee5b8c0d3..16ee0e450e3e 100644 --- a/arch/x86/um/sysrq_32.c +++ b/arch/x86/um/sysrq_32.c | |||
@@ -30,70 +30,4 @@ void show_regs(struct pt_regs *regs) | |||
30 | printk(" DS: %04lx ES: %04lx\n", | 30 | printk(" DS: %04lx ES: %04lx\n", |
31 | 0xffff & PT_REGS_DS(regs), | 31 | 0xffff & PT_REGS_DS(regs), |
32 | 0xffff & PT_REGS_ES(regs)); | 32 | 0xffff & PT_REGS_ES(regs)); |
33 | |||
34 | show_trace(NULL, (unsigned long *) ®s); | ||
35 | } | 33 | } |
36 | |||
37 | /* Copied from i386. */ | ||
38 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) | ||
39 | { | ||
40 | return p > (void *)tinfo && | ||
41 | p < (void *)tinfo + THREAD_SIZE - 3; | ||
42 | } | ||
43 | |||
44 | /* Adapted from i386 (we also print the address we read from). */ | ||
45 | static inline unsigned long print_context_stack(struct thread_info *tinfo, | ||
46 | unsigned long *stack, unsigned long ebp) | ||
47 | { | ||
48 | unsigned long addr; | ||
49 | |||
50 | #ifdef CONFIG_FRAME_POINTER | ||
51 | while (valid_stack_ptr(tinfo, (void *)ebp)) { | ||
52 | addr = *(unsigned long *)(ebp + 4); | ||
53 | printk("%08lx: [<%08lx>]", ebp + 4, addr); | ||
54 | print_symbol(" %s", addr); | ||
55 | printk("\n"); | ||
56 | ebp = *(unsigned long *)ebp; | ||
57 | } | ||
58 | #else | ||
59 | while (valid_stack_ptr(tinfo, stack)) { | ||
60 | addr = *stack; | ||
61 | if (__kernel_text_address(addr)) { | ||
62 | printk("%08lx: [<%08lx>]", (unsigned long) stack, addr); | ||
63 | print_symbol(" %s", addr); | ||
64 | printk("\n"); | ||
65 | } | ||
66 | stack++; | ||
67 | } | ||
68 | #endif | ||
69 | return ebp; | ||
70 | } | ||
71 | |||
72 | void show_trace(struct task_struct* task, unsigned long * stack) | ||
73 | { | ||
74 | unsigned long ebp; | ||
75 | struct thread_info *context; | ||
76 | |||
77 | /* Turn this into BUG_ON if possible. */ | ||
78 | if (!stack) { | ||
79 | stack = (unsigned long*) &stack; | ||
80 | printk("show_trace: got NULL stack, implicit assumption task == current"); | ||
81 | WARN_ON(1); | ||
82 | } | ||
83 | |||
84 | if (!task) | ||
85 | task = current; | ||
86 | |||
87 | if (task != current) { | ||
88 | ebp = (unsigned long) KSTK_EBP(task); | ||
89 | } else { | ||
90 | asm ("movl %%ebp, %0" : "=r" (ebp) : ); | ||
91 | } | ||
92 | |||
93 | context = (struct thread_info *) | ||
94 | ((unsigned long)stack & (~(THREAD_SIZE - 1))); | ||
95 | print_context_stack(context, stack, ebp); | ||
96 | |||
97 | printk("\n"); | ||
98 | } | ||
99 | |||