All of lore.kernel.org
 help / color / mirror / Atom feed
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 3/6] arm64: enable frame pointer and support stack unwinding
Date: Sat, 24 Jun 2023 12:13:55 +0200	[thread overview]
Message-ID: <20230623-622ec2c26e09f951f42cce46@orel> (raw)
In-Reply-To: <20230617014930.2070-4-namit@vmware.com>

On Sat, Jun 17, 2023 at 01:49:27AM +0000, Nadav Amit wrote:
> From: Nadav Amit <namit@vmware.com>
> 
> Enable frame pointers for arm64 and perform stack unwinding based on
> arm64 convention.
> 
> Signed-off-by: Nadav Amit <namit@vmware.com>
> ---
>  arm/Makefile.arm      |  3 ---
>  arm/Makefile.arm64    |  1 +
>  arm/Makefile.common   |  3 +++
>  lib/arm64/asm/stack.h |  3 +++
>  lib/arm64/stack.c     | 37 +++++++++++++++++++++++++++++++++++++
>  5 files changed, 44 insertions(+), 3 deletions(-)
>  create mode 100644 lib/arm64/stack.c
> 
> diff --git a/arm/Makefile.arm b/arm/Makefile.arm
> index 2ce00f5..7fd39f3 100644
> --- a/arm/Makefile.arm
> +++ b/arm/Makefile.arm
> @@ -11,9 +11,6 @@ ifeq ($(CONFIG_EFI),y)
>  $(error Cannot build arm32 tests as EFI apps)
>  endif
>  
> -# stack.o relies on frame pointers.
> -KEEP_FRAME_POINTER := y
> -
>  CFLAGS += $(machine)
>  CFLAGS += -mcpu=$(PROCESSOR)
>  CFLAGS += -mno-unaligned-access
> diff --git a/arm/Makefile.arm64 b/arm/Makefile.arm64
> index eada7f9..60385e2 100644
> --- a/arm/Makefile.arm64
> +++ b/arm/Makefile.arm64
> @@ -21,6 +21,7 @@ define arch_elf_check =
>  endef
>  
>  cstart.o = $(TEST_DIR)/cstart64.o
> +cflatobjs += lib/arm64/stack.o
>  cflatobjs += lib/arm64/processor.o
>  cflatobjs += lib/arm64/spinlock.o
>  cflatobjs += lib/arm64/gic-v3-its.o lib/arm64/gic-v3-its-cmd.o
> diff --git a/arm/Makefile.common b/arm/Makefile.common
> index f904702..7fecfb3 100644
> --- a/arm/Makefile.common
> +++ b/arm/Makefile.common
> @@ -22,6 +22,9 @@ $(TEST_DIR)/sieve.elf: AUXFLAGS = 0x1
>  ##################################################################
>  AUXFLAGS ?= 0x0
>  
> +# stack.o relies on frame pointers.
> +KEEP_FRAME_POINTER := y
> +
>  CFLAGS += -std=gnu99
>  CFLAGS += -ffreestanding
>  CFLAGS += -O2
> diff --git a/lib/arm64/asm/stack.h b/lib/arm64/asm/stack.h
> index d000624..be486cf 100644
> --- a/lib/arm64/asm/stack.h
> +++ b/lib/arm64/asm/stack.h
> @@ -5,4 +5,7 @@
>  #error Do not directly include <asm/stack.h>. Just use <stack.h>.
>  #endif
>  
> +#define HAVE_ARCH_BACKTRACE_FRAME
> +#define HAVE_ARCH_BACKTRACE
> +
>  #endif
> diff --git a/lib/arm64/stack.c b/lib/arm64/stack.c
> new file mode 100644
> index 0000000..1e2568a
> --- /dev/null
> +++ b/lib/arm64/stack.c
> @@ -0,0 +1,37 @@
> +/*
> + * backtrace support (this is a modified lib/x86/stack.c)
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.
> + */
> +#include <libcflat.h>
> +#include <stack.h>
> +
> +extern char vector_stub_start, vector_stub_end;

These aren't used until the next patch.

> +
> +int backtrace_frame(const void *frame, const void **return_addrs, int max_depth) {

'{' should be on its own line. I usually try to run the kernel's
checkpatch since we use the same style (except we're even more forgiving
for long lines).

> +	const void *fp = frame;
> +	void *lr;
> +	int depth;
> +
> +	/*
> +	 * ARM64 stack grows down. fp points to the previous fp on the stack,
> +	 * and lr is just above it
> +	 */
> +	for (depth = 0; fp && depth < max_depth; ++depth) {
> +
> +		asm volatile ("ldp %0, %1, [%2]"
> +				  : "=r" (fp), "=r" (lr)
> +				  : "r" (fp)
> +				  : );
> +
> +		return_addrs[depth] = lr;
> +	}
> +
> +	return depth;
> +}
> +
> +int backtrace(const void **return_addrs, int max_depth)
> +{
> +	return backtrace_frame(__builtin_frame_address(0),
> +			       return_addrs, max_depth);
> +}
> -- 
> 2.34.1
> 

Thanks,
drew

  reply	other threads:[~2023-06-24 10:13 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 [this message]
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
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=20230623-622ec2c26e09f951f42cce46@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.