ARC: stack unwinding: reorganize how initial register state setup
This is a non-functional change, if anything a better fall-back handling. Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
e42404fa10
commit
f737561c70
@ -42,11 +42,23 @@ static int
|
|||||||
seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
|
seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
|
||||||
struct unwind_frame_info *frame_info)
|
struct unwind_frame_info *frame_info)
|
||||||
{
|
{
|
||||||
/*
|
if (regs) {
|
||||||
* synchronous unwinding (e.g. dump_stack)
|
/*
|
||||||
* - uses current values of SP and friends
|
* Asynchronous unwinding of intr/exception
|
||||||
*/
|
* - Just uses the pt_regs passed
|
||||||
if (regs == NULL && (tsk == NULL || tsk == current)) {
|
*/
|
||||||
|
frame_info->task = tsk;
|
||||||
|
|
||||||
|
frame_info->regs.r27 = regs->fp;
|
||||||
|
frame_info->regs.r28 = regs->sp;
|
||||||
|
frame_info->regs.r31 = regs->blink;
|
||||||
|
frame_info->regs.r63 = regs->ret;
|
||||||
|
frame_info->call_frame = 0;
|
||||||
|
} else if (tsk == NULL || tsk == current) {
|
||||||
|
/*
|
||||||
|
* synchronous unwinding (e.g. dump_stack)
|
||||||
|
* - uses current values of SP and friends
|
||||||
|
*/
|
||||||
unsigned long fp, sp, blink, ret;
|
unsigned long fp, sp, blink, ret;
|
||||||
frame_info->task = current;
|
frame_info->task = current;
|
||||||
|
|
||||||
@ -63,7 +75,7 @@ seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
|
|||||||
frame_info->regs.r31 = blink;
|
frame_info->regs.r31 = blink;
|
||||||
frame_info->regs.r63 = ret;
|
frame_info->regs.r63 = ret;
|
||||||
frame_info->call_frame = 0;
|
frame_info->call_frame = 0;
|
||||||
} else if (regs == NULL) {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Asynchronous unwinding of a likely sleeping task
|
* Asynchronous unwinding of a likely sleeping task
|
||||||
* - first ensure it is actually sleeping
|
* - first ensure it is actually sleeping
|
||||||
@ -94,20 +106,7 @@ seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
|
|||||||
frame_info->regs.r28 += 60;
|
frame_info->regs.r28 += 60;
|
||||||
frame_info->call_frame = 0;
|
frame_info->call_frame = 0;
|
||||||
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Asynchronous unwinding of intr/exception
|
|
||||||
* - Just uses the pt_regs passed
|
|
||||||
*/
|
|
||||||
frame_info->task = tsk;
|
|
||||||
|
|
||||||
frame_info->regs.r27 = regs->fp;
|
|
||||||
frame_info->regs.r28 = regs->sp;
|
|
||||||
frame_info->regs.r31 = regs->blink;
|
|
||||||
frame_info->regs.r63 = regs->ret;
|
|
||||||
frame_info->call_frame = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user