瀏覽代碼

[S390] incomplete stack traces.

show_stack() passes a pointer to the current stack frame to show_trace().
Because of tail call optimization the pointer doesn't point to the original
stack frame anymory and therefore traces are wrong. Don't pass the pointer
of the current stack frame to show_trace(). Instead let show_trace()
calculate the pointer on its own.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Heiko Carstens 19 年之前
父節點
當前提交
7380534314
共有 1 個文件被更改,包括 3 次插入5 次删除
  1. 3 5
      arch/s390/kernel/traps.c

+ 3 - 5
arch/s390/kernel/traps.c

@@ -150,13 +150,11 @@ void show_stack(struct task_struct *task, unsigned long *sp)
 	unsigned long *stack;
 	unsigned long *stack;
 	int i;
 	int i;
 
 
-	// debugging aid: "show_stack(NULL);" prints the
-	// back trace for this cpu.
-
 	if (!sp)
 	if (!sp)
-		sp = task ? (unsigned long *) task->thread.ksp : __r15;
+		stack = task ? (unsigned long *) task->thread.ksp : __r15;
+	else
+		stack = sp;
 
 
-	stack = sp;
 	for (i = 0; i < kstack_depth_to_print; i++) {
 	for (i = 0; i < kstack_depth_to_print; i++) {
 		if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
 		if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
 			break;
 			break;