Commit 66adce8f authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/stacktrace: save full stack traces

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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Tested-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent f6331aac
...@@ -59,26 +59,29 @@ static unsigned long save_context_stack(struct stack_trace *trace, ...@@ -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 new_sp, frame_size;
unsigned long orig_sp, new_sp, frame_size;
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
orig_sp = sp; new_sp = save_context_stack(trace, sp,
new_sp = save_context_stack(trace, orig_sp,
S390_lowcore.panic_stack + frame_size - PAGE_SIZE, S390_lowcore.panic_stack + frame_size - PAGE_SIZE,
S390_lowcore.panic_stack + frame_size, 1); S390_lowcore.panic_stack + frame_size, 1);
if (new_sp != orig_sp)
return;
new_sp = save_context_stack(trace, new_sp, new_sp = save_context_stack(trace, new_sp,
S390_lowcore.async_stack + frame_size - ASYNC_SIZE, S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
S390_lowcore.async_stack + frame_size, 1); S390_lowcore.async_stack + frame_size, 1);
if (new_sp != orig_sp)
return;
save_context_stack(trace, new_sp, save_context_stack(trace, new_sp,
S390_lowcore.thread_info, S390_lowcore.thread_info,
S390_lowcore.thread_info + THREAD_SIZE, 1); 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) if (trace->nr_entries < trace->max_entries)
trace->entries[trace->nr_entries++] = ULONG_MAX; trace->entries[trace->nr_entries++] = ULONG_MAX;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment