Commit e76e6961 authored by Vasily Gorbik's avatar Vasily Gorbik

s390/unwind: stop gracefully at task pt_regs

Consider reaching task pt_regs graceful unwinder termination. Task
pt_regs itself never contains a valid state to which a task might return
within the kernel context (user task pt_regs is a special case). Since
we already avoid printing user task pt_regs and in most cases we don't
even bother filling task pt_regs psw and r15 with something reasonable
simply skip task pt_regs altogether. With this change unwind_error() now
accurately represent whether unwinder reached task pt_regs successfully
or failed along the way.
Reviewed-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent cb7948e8
...@@ -36,6 +36,12 @@ static bool update_stack_info(struct unwind_state *state, unsigned long sp) ...@@ -36,6 +36,12 @@ static bool update_stack_info(struct unwind_state *state, unsigned long sp)
return true; return true;
} }
static inline bool is_task_pt_regs(struct unwind_state *state,
struct pt_regs *regs)
{
return task_pt_regs(state->task) == regs;
}
bool unwind_next_frame(struct unwind_state *state) bool unwind_next_frame(struct unwind_state *state)
{ {
struct stack_info *info = &state->stack_info; struct stack_info *info = &state->stack_info;
...@@ -69,7 +75,7 @@ bool unwind_next_frame(struct unwind_state *state) ...@@ -69,7 +75,7 @@ bool unwind_next_frame(struct unwind_state *state)
if (!on_stack(info, sp, sizeof(struct pt_regs))) if (!on_stack(info, sp, sizeof(struct pt_regs)))
goto out_err; goto out_err;
regs = (struct pt_regs *) sp; regs = (struct pt_regs *) sp;
if (READ_ONCE_NOCHECK(regs->psw.mask) & PSW_MASK_PSTATE) if (is_task_pt_regs(state, regs))
goto out_stop; goto out_stop;
ip = READ_ONCE_NOCHECK(regs->psw.addr); ip = READ_ONCE_NOCHECK(regs->psw.addr);
sp = READ_ONCE_NOCHECK(regs->gprs[15]); sp = READ_ONCE_NOCHECK(regs->gprs[15]);
......
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