[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210315165800.5948-4-madvenka@linux.microsoft.com>
Date: Mon, 15 Mar 2021 11:57:55 -0500
From: madvenka@...ux.microsoft.com
To: broonie@...nel.org, mark.rutland@....com, jpoimboe@...hat.com,
jthierry@...hat.com, catalin.marinas@....com, will@...nel.org,
linux-arm-kernel@...ts.infradead.org,
live-patching@...r.kernel.org, linux-kernel@...r.kernel.org,
madvenka@...ux.microsoft.com
Subject: [RFC PATCH v2 3/8] arm64: Terminate the stack trace at TASK_FRAME and EL0_FRAME
From: "Madhavan T. Venkataraman" <madvenka@...ux.microsoft.com>
Implement the following checks in the unwinder to detect the terminating
frame reliably:
- The frame must end in task_pt_regs(task)->stackframe.
- The frame type must be either TASK_FRAME or EL0_FRAME.
Signed-off-by: Madhavan T. Venkataraman <madvenka@...ux.microsoft.com>
---
arch/arm64/kernel/stacktrace.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
index ad20981dfda4..504cd161339d 100644
--- a/arch/arm64/kernel/stacktrace.c
+++ b/arch/arm64/kernel/stacktrace.c
@@ -43,16 +43,22 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
{
unsigned long fp = frame->fp;
struct stack_info info;
+ struct pt_regs *regs;
- /* Terminal record; nothing to unwind */
- if (!fp)
- return -ENOENT;
+ if (!tsk)
+ tsk = current;
+ regs = task_pt_regs(tsk);
- if (fp & 0xf)
+ /* Terminal record, nothing to unwind */
+ if (fp == (unsigned long) regs->stackframe) {
+ if (regs->frame_type == TASK_FRAME ||
+ regs->frame_type == EL0_FRAME)
+ return -ENOENT;
return -EINVAL;
+ }
- if (!tsk)
- tsk = current;
+ if (!fp || fp & 0xf)
+ return -EINVAL;
if (!on_accessible_stack(tsk, fp, &info))
return -EINVAL;
--
2.25.1
Powered by blists - more mailing lists