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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.