s390/stacktrace: save full stack traces
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 1 Feb 2016 13:14:04 +0000 (14:14 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 10 Feb 2016 08:25:21 +0000 (09:25 +0100)
save_stack_trace() only saves the stack trace of the current context
(interrupt or process context). This is different to what other
architectures like x86 do, which save the full stack trace across
different contexts.

Also extract a __save_stack_trace() helper function which will be used
by a follow on patch.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Tested-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/stacktrace.c

index 75e6ea930692b4462e7346db10b7b724b81011e2..e0fec2d8ac405802839702e86f5e8cd396587dd7 100644 (file)
@@ -59,26 +59,29 @@ static unsigned long save_context_stack(struct stack_trace *trace,
        }
 }
 
-void save_stack_trace(struct stack_trace *trace)
+static void __save_stack_trace(struct stack_trace *trace, unsigned long sp)
 {
-       register unsigned long sp asm ("15");
-       unsigned long orig_sp, new_sp, frame_size;
+       unsigned long new_sp, frame_size;
 
        frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
-       orig_sp = sp;
-       new_sp = save_context_stack(trace, orig_sp,
+       new_sp = save_context_stack(trace, sp,
                        S390_lowcore.panic_stack + frame_size - PAGE_SIZE,
                        S390_lowcore.panic_stack + frame_size, 1);
-       if (new_sp != orig_sp)
-               return;
        new_sp = save_context_stack(trace, new_sp,
                        S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
                        S390_lowcore.async_stack + frame_size, 1);
-       if (new_sp != orig_sp)
-               return;
        save_context_stack(trace, new_sp,
                           S390_lowcore.thread_info,
                           S390_lowcore.thread_info + THREAD_SIZE, 1);
+}
+
+void save_stack_trace(struct stack_trace *trace)
+{
+       register unsigned long r15 asm ("15");
+       unsigned long sp;
+
+       sp = r15;
+       __save_stack_trace(trace, sp);
        if (trace->nr_entries < trace->max_entries)
                trace->entries[trace->nr_entries++] = ULONG_MAX;
 }