diff options
author | Tejun Heo <tj@kernel.org> | 2013-04-30 18:27:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-30 20:04:01 -0400 |
commit | 89e3f23da9c827bfa9806c3d4da83a12c1c8543a (patch) | |
tree | b4eaba8afe11cf9cac42d0fd7cc5d49718a9c2d1 /arch/sparc | |
parent | a77f2a4e6f03f0fe0aedb5b13b31be8f9d66d10d (diff) |
sparc32: make show_stack() acquire %fp if @_ksp is not specified
show_stack(current or NULL, NULL) is used by arch-independent code to dump
backtrace of the current task; however, sparc32 show_stack() doesn't
implement it and wouldn't print any backtrace when NULL @_ksp is specfied.
Make show_stack() acquire and use %fp if @tsk is NULL or current and @_ksp
is NULL. This makes %fp fetching in dump_stack() unnecessary. Make it
use NULL for @_ksp instead.
Only compile tested.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: David S. Miller <davem@davemloft.net>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Fengguang Wu <fengguang.wu@intel.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Jesper Nilsson <jesper.nilsson@axis.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/kernel/process_32.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c index c85241006e32..2be4214b3905 100644 --- a/arch/sparc/kernel/process_32.c +++ b/arch/sparc/kernel/process_32.c | |||
@@ -142,11 +142,13 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) | |||
142 | struct reg_window32 *rw; | 142 | struct reg_window32 *rw; |
143 | int count = 0; | 143 | int count = 0; |
144 | 144 | ||
145 | if (tsk != NULL) | 145 | if (!tsk) |
146 | task_base = (unsigned long) task_stack_page(tsk); | 146 | tsk = current; |
147 | else | ||
148 | task_base = (unsigned long) current_thread_info(); | ||
149 | 147 | ||
148 | if (tsk == current && !_ksp) | ||
149 | __asm__ __volatile__("mov %%fp, %0" : "=r" (_ksp)); | ||
150 | |||
151 | task_base = (unsigned long) task_stack_page(tsk); | ||
150 | fp = (unsigned long) _ksp; | 152 | fp = (unsigned long) _ksp; |
151 | do { | 153 | do { |
152 | /* Bogus frame pointer? */ | 154 | /* Bogus frame pointer? */ |
@@ -164,11 +166,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) | |||
164 | 166 | ||
165 | void dump_stack(void) | 167 | void dump_stack(void) |
166 | { | 168 | { |
167 | unsigned long *ksp; | 169 | show_stack(current, NULL); |
168 | |||
169 | __asm__ __volatile__("mov %%fp, %0" | ||
170 | : "=r" (ksp)); | ||
171 | show_stack(current, ksp); | ||
172 | } | 170 | } |
173 | 171 | ||
174 | EXPORT_SYMBOL(dump_stack); | 172 | EXPORT_SYMBOL(dump_stack); |