mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 20:23:57 +08:00
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: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
cb7948e8c3
commit
e76e69611e
@ -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)
|
|||||||
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]);
|
||||||
|
Loading…
Reference in New Issue
Block a user