public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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;
> 

  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