diff options
Diffstat (limited to 'arch/parisc/kernel/traps.c')
-rw-r--r-- | arch/parisc/kernel/traps.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index fa0811295acc..949722540864 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -187,18 +187,19 @@ void show_stack(struct task_struct *task, unsigned long *s) | |||
187 | 187 | ||
188 | if (!task) { | 188 | if (!task) { |
189 | unsigned long sp; | 189 | unsigned long sp; |
190 | struct pt_regs *r; | ||
191 | 190 | ||
192 | HERE: | 191 | HERE: |
193 | asm volatile ("copy %%r30, %0" : "=r"(sp)); | 192 | asm volatile ("copy %%r30, %0" : "=r"(sp)); |
194 | r = kzalloc(sizeof(struct pt_regs), GFP_KERNEL); | 193 | { |
195 | if (!r) | 194 | struct pt_regs r; |
196 | return; | 195 | |
197 | r->iaoq[0] = (unsigned long)&&HERE; | 196 | memset(&r, 0, sizeof(struct pt_regs)); |
198 | r->gr[2] = (unsigned long)__builtin_return_address(0); | 197 | r.iaoq[0] = (unsigned long)&&HERE; |
199 | r->gr[30] = sp; | 198 | r.gr[2] = (unsigned long)__builtin_return_address(0); |
200 | unwind_frame_init(&info, current, r); | 199 | r.gr[30] = sp; |
201 | kfree(r); | 200 | |
201 | unwind_frame_init(&info, current, &r); | ||
202 | } | ||
202 | } else { | 203 | } else { |
203 | unwind_frame_init_from_blocked_task(&info, task); | 204 | unwind_frame_init_from_blocked_task(&info, task); |
204 | } | 205 | } |