aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-04-30 18:27:10 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 20:04:01 -0400
commit89e3f23da9c827bfa9806c3d4da83a12c1c8543a (patch)
treeb4eaba8afe11cf9cac42d0fd7cc5d49718a9c2d1 /arch/sparc
parenta77f2a4e6f03f0fe0aedb5b13b31be8f9d66d10d (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.c16
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
165void dump_stack(void) 167void 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
174EXPORT_SYMBOL(dump_stack); 172EXPORT_SYMBOL(dump_stack);