[tip:perf/core] perf tools: Add ARM64 perf_regs_load to support libunwind and enable testing

From: tip-bot for Wang Nan
Date: Fri May 29 2015 - 14:36:50 EST


Commit-ID: 3237f28188c3e41a938781a369652772a23e97a9
Gitweb: http://git.kernel.org/tip/3237f28188c3e41a938781a369652772a23e97a9
Author: Wang Nan <wangnan0@xxxxxxxxxx>
AuthorDate: Fri, 27 Mar 2015 13:08:01 +0000
Committer: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
CommitDate: Fri, 29 May 2015 12:43:40 -0300

perf tools: Add ARM64 perf_regs_load to support libunwind and enable testing

Newest libunwind does support ARM64, and perf is able to utilize it
also.

This patch enables the perf test dwarf unwind for arm64.

Test result:
# ./perf test unwind
25: Test dwarf unwind : Ok

Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
Acked-by: Jiri Olsa <jolsa@xxxxxxxxxx>
Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
Cc: Zefan Li <lizefan@xxxxxxxxxx>
Link: http://lkml.kernel.org/r/1427461681-72971-1-git-send-email-wangnan0@xxxxxxxxxx
Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
---
tools/perf/arch/arm64/Build | 1 +
tools/perf/arch/arm64/include/perf_regs.h | 3 ++
tools/perf/arch/{arm => arm64}/tests/Build | 0
.../perf/arch/{arm => arm64}/tests/dwarf-unwind.c | 6 +--
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, 56 insertions(+), 6 deletions(-)

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/arm/tests/Build b/tools/perf/arch/arm64/tests/Build
similarity index 100%
copy from tools/perf/arch/arm/tests/Build
copy to tools/perf/arch/arm64/tests/Build
diff --git a/tools/perf/arch/arm/tests/dwarf-unwind.c b/tools/perf/arch/arm64/tests/dwarf-unwind.c
similarity index 91%
copy from tools/perf/arch/arm/tests/dwarf-unwind.c
copy to tools/perf/arch/arm64/tests/dwarf-unwind.c
index 62eff84..cf04a4c9 100644
--- a/tools/perf/arch/arm/tests/dwarf-unwind.c
+++ b/tools/perf/arch/arm64/tests/dwarf-unwind.c
@@ -9,7 +9,7 @@
#define STACK_SIZE 8192

static int sample_ustack(struct perf_sample *sample,
- struct thread *thread, u64 *regs)
+ struct thread *thread, u64 *regs)
{
struct stack_dump *stack = &sample->user_stack;
struct map *map;
@@ -22,7 +22,7 @@ static int sample_ustack(struct perf_sample *sample,
return -1;
}

- sp = (unsigned long) regs[PERF_REG_ARM_SP];
+ sp = (unsigned long) regs[PERF_REG_ARM64_SP];

map = map_groups__find(thread->mg, MAP__VARIABLE, (u64) sp);
if (!map) {
@@ -41,7 +41,7 @@ static int sample_ustack(struct perf_sample *sample,
}

int test__arch_unwind_sample(struct perf_sample *sample,
- struct thread *thread)
+ struct thread *thread)
{
struct regs_dump *regs = &sample->user_regs;
u64 *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 f42af98..b5b87a2 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 a10eaf5..87bcaf1 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -62,7 +62,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/