From: Andrew Jones <andrew.jones@linux.dev>
To: Nadav Amit <nadav.amit@gmail.com>
Cc: kvmarm@lists.linux.dev, kvmarm@lists.cs.columbia.edu,
kvm@vger.kernel.org, Nikos Nikoleris <nikos.nikoleris@arm.com>,
Nadav Amit <namit@vmware.com>
Subject: Re: [kvm-unit-tests PATCH 4/6] arm64: stack: update trace stack on exception
Date: Sat, 24 Jun 2023 12:18:28 +0200 [thread overview]
Message-ID: <20230624-25ca6a39aec469a817e45422@orel> (raw)
In-Reply-To: <20230617014930.2070-5-namit@vmware.com>
On Sat, Jun 17, 2023 at 01:49:28AM +0000, Nadav Amit wrote:
> From: Nadav Amit <namit@vmware.com>
>
> Using gdb for backtracing or dumping the stack following an exception is
> not very helpful as the exact location of the exception is not saved.
>
> Add an additional frame to save the location of the exception.
>
> One delicate point is dealing with the pretty_print_stacks script. When
> the stack is dumped, the script would not print the right address for
> the exception address: for every return address it deducts "1" before
> looking for the instruction location in the code (using addr2line). As a
> somewhat hacky solution add "1" for the exception address when dumping
> the stack.
>
> Signed-off-by: Nadav Amit <namit@vmware.com>
> ---
> arm/cstart64.S | 13 +++++++++++++
> lib/arm64/asm-offsets.c | 3 ++-
> lib/arm64/stack.c | 16 ++++++++++++++++
> 3 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/arm/cstart64.S b/arm/cstart64.S
> index cbd6b51..61e27d3 100644
> --- a/arm/cstart64.S
> +++ b/arm/cstart64.S
> @@ -314,6 +314,13 @@ exceptions_init:
> mrs x2, spsr_el1
> stp x1, x2, [sp, #S_PC]
>
> + /*
> + * Save a frame pointer using the link to allow unwinding of
> + * exceptions.
> + */
> + stp x29, x1, [sp, #S_FP]
> + add x29, sp, #S_FP
> +
> mov x0, \vec
> mov x1, sp
> mrs x2, esr_el1
> @@ -349,6 +356,9 @@ exceptions_init:
> eret
> .endm
>
> +vector_stub_start:
> +.globl vector_stub_start
nit: I'd prefer the .globl directives above the labels to match the
rest of the file.
> +
> vector_stub el1t_sync, 0
> vector_stub el1t_irq, 1
> vector_stub el1t_fiq, 2
> @@ -369,6 +379,9 @@ vector_stub el0_irq_32, 13
> vector_stub el0_fiq_32, 14
> vector_stub el0_error_32, 15
>
> +vector_stub_end:
> +.globl vector_stub_end
> +
> .section .text.ex
>
> .macro ventry, label
> diff --git a/lib/arm64/asm-offsets.c b/lib/arm64/asm-offsets.c
> index 53a1277..7b8bffb 100644
> --- a/lib/arm64/asm-offsets.c
> +++ b/lib/arm64/asm-offsets.c
> @@ -25,6 +25,7 @@ int main(void)
> OFFSET(S_PSTATE, pt_regs, pstate);
> OFFSET(S_ORIG_X0, pt_regs, orig_x0);
> OFFSET(S_SYSCALLNO, pt_regs, syscallno);
> - DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
> + DEFINE(S_FRAME_SIZE, (sizeof(struct pt_regs) + 16));
> + DEFINE(S_FP, sizeof(struct pt_regs));
It'd be good to comment this, something like
...
OFFSET(S_ORIG_X0, pt_regs, orig_x0);
OFFSET(S_SYSCALLNO, pt_regs, syscallno);
/* FP and LR (16 bytes) go on the frame above pt_regs */
DEFINE(S_FP, sizeof(struct pt_regs));
DEFINE(S_FRAME_SIZE, (sizeof(struct pt_regs) + 16));
return 0;
> return 0;
> }
> diff --git a/lib/arm64/stack.c b/lib/arm64/stack.c
> index 1e2568a..a48ecbb 100644
> --- a/lib/arm64/stack.c
> +++ b/lib/arm64/stack.c
> @@ -12,6 +12,8 @@ int backtrace_frame(const void *frame, const void **return_addrs, int max_depth)
> const void *fp = frame;
> void *lr;
> int depth;
> + bool is_exception = false;
> + unsigned long addr;
>
> /*
> * ARM64 stack grows down. fp points to the previous fp on the stack,
> @@ -25,6 +27,20 @@ int backtrace_frame(const void *frame, const void **return_addrs, int max_depth)
> : );
>
> return_addrs[depth] = lr;
> +
> + /*
> + * If this is an exception, add 1 to the pointer so when the
> + * pretty_print_stacks script is run it would get the right
> + * address (it deducts 1 to find the call address, but we want
> + * the actual address).
> + */
> + if (is_exception)
> + return_addrs[depth] += 1;
> +
> + /* Check if we are in the exception handlers for the next entry */
> + addr = (unsigned long)lr;
> + is_exception = (addr >= (unsigned long)&vector_stub_start &&
> + addr < (unsigned long)&vector_stub_end);
> }
>
> return depth;
> --
> 2.34.1
>
Thanks,
drew
next prev parent reply other threads:[~2023-06-24 10:18 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-17 1:49 [kvm-unit-tests PATCH 0/6] arm64: improve debuggability Nadav Amit
2023-06-17 1:49 ` [kvm-unit-tests PATCH 1/6] arm: keep efi debug information in a separate file Nadav Amit
2023-06-24 10:12 ` Andrew Jones
2023-06-24 10:31 ` Andrew Jones
2023-06-25 19:21 ` Nadav Amit
2023-06-17 1:49 ` [kvm-unit-tests PATCH 2/6] lib/stack: print base addresses on efi Nadav Amit
2023-06-24 10:13 ` Andrew Jones
2023-06-25 19:23 ` Nadav Amit
2023-06-17 1:49 ` [kvm-unit-tests PATCH 3/6] arm64: enable frame pointer and support stack unwinding Nadav Amit
2023-06-24 10:13 ` Andrew Jones
2023-06-25 19:22 ` Nadav Amit
2023-06-26 5:42 ` Andrew Jones
2023-06-17 1:49 ` [kvm-unit-tests PATCH 4/6] arm64: stack: update trace stack on exception Nadav Amit
2023-06-24 10:18 ` Andrew Jones [this message]
2023-06-17 1:49 ` [kvm-unit-tests PATCH 5/6] efi: Print address of image Nadav Amit
2023-06-17 1:49 ` [kvm-unit-tests PATCH 6/6] arm64: dump stack on bad exception Nadav Amit
2023-06-17 1:52 ` Nadav Amit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230624-25ca6a39aec469a817e45422@orel \
--to=andrew.jones@linux.dev \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=kvmarm@lists.linux.dev \
--cc=nadav.amit@gmail.com \
--cc=namit@vmware.com \
--cc=nikos.nikoleris@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox