Re: [PATCH] perf tools: introduce arm64 support unwind test.

From: Arnaldo Carvalho de Melo
Date: Thu May 28 2015 - 09:43:30 EST


Em Thu, May 28, 2015 at 03:17:26PM +0800, Wangnan (F) escreveu:
> Ping?

Jiri, Ack?

And from a quick look, isn't this better split in two pieces, i.e. the
first wiring up ARM64 to libunwing, i.e. all those perf_regs.h files
being added to tools/perf/arch/arm64/, and then a second patch, enabling
the dwarf unwind 'perf test' entry to run on ARM64?

- Arnaldo

> On 2015/3/27 21:08, Wang Nan wrote:
> >Newest libunwind does support ARM64, and perf is able to utilize it
> >also. This patch enables the missing perf test dwarf unwind for arm64.
> >
> > Test result:
> > # ./perf test unwind
> > 25: Test dwarf unwind : Ok
> >
> >Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
> >---
> > tools/perf/arch/arm64/Build | 1 +
> > tools/perf/arch/arm64/include/perf_regs.h | 3 ++
> > tools/perf/arch/arm64/tests/Build | 2 +
> > tools/perf/arch/arm64/tests/dwarf-unwind.c | 61 ++++++++++++++++++++++++++++++
> > tools/perf/arch/arm64/tests/regs_load.S | 46 ++++++++++++++++++++++
> > tools/perf/tests/Build | 2 +-
> > tools/perf/tests/builtin-test.c | 2 +-
> > tools/perf/tests/tests.h | 2 +-
> > 8 files changed, 116 insertions(+), 3 deletions(-)
> > create mode 100644 tools/perf/arch/arm64/tests/Build
> > create mode 100644 tools/perf/arch/arm64/tests/dwarf-unwind.c
> > create mode 100644 tools/perf/arch/arm64/tests/regs_load.S
> >
> >diff --git a/tools/perf/arch/arm64/Build b/tools/perf/arch/arm64/Build
> >index 54afe4a..41bf61d 100644
> >--- a/tools/perf/arch/arm64/Build
> >+++ b/tools/perf/arch/arm64/Build
> >@@ -1 +1,2 @@
> > libperf-y += util/
> >+libperf-$(CONFIG_DWARF_UNWIND) += tests/
> >diff --git a/tools/perf/arch/arm64/include/perf_regs.h b/tools/perf/arch/arm64/include/perf_regs.h
> >index 1d3f39c..4e5af27 100644
> >--- a/tools/perf/arch/arm64/include/perf_regs.h
> >+++ b/tools/perf/arch/arm64/include/perf_regs.h
> >@@ -5,8 +5,11 @@
> > #include <linux/types.h>
> > #include <asm/perf_regs.h>
> >+void perf_regs_load(u64 *regs);
> >+
> > #define PERF_REGS_MASK ((1ULL << PERF_REG_ARM64_MAX) - 1)
> > #define PERF_REGS_MAX PERF_REG_ARM64_MAX
> >+#define PERF_SAMPLE_REGS_ABI PERF_SAMPLE_REGS_ABI_64
> > #define PERF_REG_IP PERF_REG_ARM64_PC
> > #define PERF_REG_SP PERF_REG_ARM64_SP
> >diff --git a/tools/perf/arch/arm64/tests/Build b/tools/perf/arch/arm64/tests/Build
> >new file mode 100644
> >index 0000000..b30eff9
> >--- /dev/null
> >+++ b/tools/perf/arch/arm64/tests/Build
> >@@ -0,0 +1,2 @@
> >+libperf-y += regs_load.o
> >+libperf-y += dwarf-unwind.o
> >diff --git a/tools/perf/arch/arm64/tests/dwarf-unwind.c b/tools/perf/arch/arm64/tests/dwarf-unwind.c
> >new file mode 100644
> >index 0000000..cf04a4c
> >--- /dev/null
> >+++ b/tools/perf/arch/arm64/tests/dwarf-unwind.c
> >@@ -0,0 +1,61 @@
> >+#include <string.h>
> >+#include "perf_regs.h"
> >+#include "thread.h"
> >+#include "map.h"
> >+#include "event.h"
> >+#include "debug.h"
> >+#include "tests/tests.h"
> >+
> >+#define STACK_SIZE 8192
> >+
> >+static int sample_ustack(struct perf_sample *sample,
> >+ struct thread *thread, u64 *regs)
> >+{
> >+ struct stack_dump *stack = &sample->user_stack;
> >+ struct map *map;
> >+ unsigned long sp;
> >+ u64 stack_size, *buf;
> >+
> >+ buf = malloc(STACK_SIZE);
> >+ if (!buf) {
> >+ pr_debug("failed to allocate sample uregs data\n");
> >+ return -1;
> >+ }
> >+
> >+ sp = (unsigned long) regs[PERF_REG_ARM64_SP];
> >+
> >+ map = map_groups__find(thread->mg, MAP__VARIABLE, (u64) sp);
> >+ if (!map) {
> >+ pr_debug("failed to get stack map\n");
> >+ free(buf);
> >+ return -1;
> >+ }
> >+
> >+ stack_size = map->end - sp;
> >+ stack_size = stack_size > STACK_SIZE ? STACK_SIZE : stack_size;
> >+
> >+ memcpy(buf, (void *) sp, stack_size);
> >+ stack->data = (char *) buf;
> >+ stack->size = stack_size;
> >+ return 0;
> >+}
> >+
> >+int test__arch_unwind_sample(struct perf_sample *sample,
> >+ struct thread *thread)
> >+{
> >+ struct regs_dump *regs = &sample->user_regs;
> >+ u64 *buf;
> >+
> >+ buf = calloc(1, sizeof(u64) * PERF_REGS_MAX);
> >+ if (!buf) {
> >+ pr_debug("failed to allocate sample uregs data\n");
> >+ return -1;
> >+ }
> >+
> >+ perf_regs_load(buf);
> >+ regs->abi = PERF_SAMPLE_REGS_ABI;
> >+ regs->regs = buf;
> >+ regs->mask = PERF_REGS_MASK;
> >+
> >+ return sample_ustack(sample, thread, buf);
> >+}
> >diff --git a/tools/perf/arch/arm64/tests/regs_load.S b/tools/perf/arch/arm64/tests/regs_load.S
> >new file mode 100644
> >index 0000000..025b46e
> >--- /dev/null
> >+++ b/tools/perf/arch/arm64/tests/regs_load.S
> >@@ -0,0 +1,46 @@
> >+#include <linux/linkage.h>
> >+
> >+.text
> >+.type perf_regs_load,%function
> >+#define STR_REG(r) str x##r, [x0, 8 * r]
> >+#define LDR_REG(r) ldr x##r, [x0, 8 * r]
> >+#define SP (8 * 31)
> >+#define PC (8 * 32)
> >+ENTRY(perf_regs_load)
> >+ STR_REG(0)
> >+ STR_REG(1)
> >+ STR_REG(2)
> >+ STR_REG(3)
> >+ STR_REG(4)
> >+ STR_REG(5)
> >+ STR_REG(6)
> >+ STR_REG(7)
> >+ STR_REG(8)
> >+ STR_REG(9)
> >+ STR_REG(10)
> >+ STR_REG(11)
> >+ STR_REG(12)
> >+ STR_REG(13)
> >+ STR_REG(14)
> >+ STR_REG(15)
> >+ STR_REG(16)
> >+ STR_REG(17)
> >+ STR_REG(18)
> >+ STR_REG(19)
> >+ STR_REG(20)
> >+ STR_REG(21)
> >+ STR_REG(22)
> >+ STR_REG(23)
> >+ STR_REG(24)
> >+ STR_REG(25)
> >+ STR_REG(26)
> >+ STR_REG(27)
> >+ STR_REG(28)
> >+ STR_REG(29)
> >+ STR_REG(30)
> >+ mov x1, sp
> >+ str x1, [x0, #SP]
> >+ str x30, [x0, #PC]
> >+ LDR_REG(1)
> >+ ret
> >+ENDPROC(perf_regs_load)
> >diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> >index 6a8801b..67f48e6 100644
> >--- a/tools/perf/tests/Build
> >+++ b/tools/perf/tests/Build
> >@@ -34,7 +34,7 @@ perf-y += kmod-path.o
> > perf-$(CONFIG_X86) += perf-time-to-tsc.o
> >-ifeq ($(ARCH),$(filter $(ARCH),x86 arm))
> >+ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64))
> > perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
> > endif
> >diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> >index 4f40981..63b0d27 100644
> >--- a/tools/perf/tests/builtin-test.c
> >+++ b/tools/perf/tests/builtin-test.c
> >@@ -126,7 +126,7 @@ static struct test {
> > .desc = "Test parsing with no sample_id_all bit set",
> > .func = test__parse_no_sample_id_all,
> > },
> >-#if defined(__x86_64__) || defined(__i386__) || defined(__arm__)
> >+#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
> > #ifdef HAVE_DWARF_UNWIND_SUPPORT
> > {
> > .desc = "Test dwarf unwind",
> >diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
> >index 52758a3..a94ea87 100644
> >--- a/tools/perf/tests/tests.h
> >+++ b/tools/perf/tests/tests.h
> >@@ -53,7 +53,7 @@ int test__fdarray__filter(void);
> > int test__fdarray__add(void);
> > int test__kmod_path__parse(void);
> >-#if defined(__x86_64__) || defined(__i386__) || defined(__arm__)
> >+#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
> > #ifdef HAVE_DWARF_UNWIND_SUPPORT
> > struct thread;
> > struct perf_sample;
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/