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 <[email protected]> > >--- > > 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 [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

