diff options
Diffstat (limited to 'arch/parisc')
-rw-r--r-- | arch/parisc/kernel/traps.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index ce48c53fd275..9dc6dc42f9cf 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -51,6 +51,9 @@ | |||
51 | DEFINE_SPINLOCK(pa_dbit_lock); | 51 | DEFINE_SPINLOCK(pa_dbit_lock); |
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | void parisc_show_stack(struct task_struct *t, unsigned long *sp, | ||
55 | struct pt_regs *regs); | ||
56 | |||
54 | static int printbinary(char *buf, unsigned long x, int nbits) | 57 | static int printbinary(char *buf, unsigned long x, int nbits) |
55 | { | 58 | { |
56 | unsigned long mask = 1UL << (nbits - 1); | 59 | unsigned long mask = 1UL << (nbits - 1); |
@@ -149,7 +152,7 @@ void show_regs(struct pt_regs *regs) | |||
149 | printk(level); | 152 | printk(level); |
150 | print_symbol(" RP(r2): %s\n", regs->gr[2]); | 153 | print_symbol(" RP(r2): %s\n", regs->gr[2]); |
151 | 154 | ||
152 | dump_stack(); | 155 | parisc_show_stack(current, NULL, regs); |
153 | } | 156 | } |
154 | 157 | ||
155 | 158 | ||
@@ -183,11 +186,19 @@ static void do_show_stack(struct unwind_frame_info *info) | |||
183 | printk("\n"); | 186 | printk("\n"); |
184 | } | 187 | } |
185 | 188 | ||
186 | void show_stack(struct task_struct *task, unsigned long *s) | 189 | void parisc_show_stack(struct task_struct *task, unsigned long *sp, |
190 | struct pt_regs *regs) | ||
187 | { | 191 | { |
188 | struct unwind_frame_info info; | 192 | struct unwind_frame_info info; |
193 | struct task_struct *t; | ||
194 | |||
195 | t = task ? task : current; | ||
196 | if (regs) { | ||
197 | unwind_frame_init(&info, t, regs); | ||
198 | goto show_stack; | ||
199 | } | ||
189 | 200 | ||
190 | if (!task) { | 201 | if (t == current) { |
191 | unsigned long sp; | 202 | unsigned long sp; |
192 | 203 | ||
193 | HERE: | 204 | HERE: |
@@ -203,12 +214,18 @@ HERE: | |||
203 | unwind_frame_init(&info, current, &r); | 214 | unwind_frame_init(&info, current, &r); |
204 | } | 215 | } |
205 | } else { | 216 | } else { |
206 | unwind_frame_init_from_blocked_task(&info, task); | 217 | unwind_frame_init_from_blocked_task(&info, t); |
207 | } | 218 | } |
208 | 219 | ||
220 | show_stack: | ||
209 | do_show_stack(&info); | 221 | do_show_stack(&info); |
210 | } | 222 | } |
211 | 223 | ||
224 | void show_stack(struct task_struct *t, unsigned long *sp) | ||
225 | { | ||
226 | return parisc_show_stack(t, sp, NULL); | ||
227 | } | ||
228 | |||
212 | int is_valid_bugaddr(unsigned long iaoq) | 229 | int is_valid_bugaddr(unsigned long iaoq) |
213 | { | 230 | { |
214 | return 1; | 231 | return 1; |