From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: "Wangnan (F)" <wangnan0@huawei.com>
Cc: Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
lizefan@huawei.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] perf tools: introduce arm64 support unwind test.
Date: Thu, 28 May 2015 10:43:14 -0300 [thread overview]
Message-ID: <20150528134314.GF24859@kernel.org> (raw)
In-Reply-To: <5566C106.4070706@huawei.com>
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@huawei.com>
> >---
> > 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;
>
next prev parent reply other threads:[~2015-05-28 13:43 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-27 13:08 [PATCH] perf tools: introduce arm64 support unwind test Wang Nan
2015-05-28 7:17 ` Wangnan (F)
2015-05-28 13:43 ` Arnaldo Carvalho de Melo [this message]
2015-05-29 9:21 ` Jiri Olsa
2015-05-29 13:32 ` Arnaldo Carvalho de Melo
2015-05-29 14:40 ` Jiri Olsa
2015-05-29 15:13 ` Arnaldo Carvalho de Melo
2015-05-29 18:36 ` [tip:perf/core] perf tools: Add ARM64 perf_regs_load to support libunwind and enable testing tip-bot for Wang Nan
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=20150528134314.GF24859@kernel.org \
--to=acme@kernel.org \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=namhyung@kernel.org \
--cc=wangnan0@huawei.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