lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150528134314.GF24859@kernel.org>
Date:	Thu, 28 May 2015 10:43:14 -0300
From:	Arnaldo Carvalho de Melo <acme@...nel.org>
To:	"Wangnan (F)" <wangnan0@...wei.com>
Cc:	Jiri Olsa <jolsa@...hat.com>, Namhyung Kim <namhyung@...nel.org>,
	lizefan@...wei.com, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] perf tools: introduce arm64 support unwind test.

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@...wei.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;
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ