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/

Reply via email to