From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752704AbbE1HRz (ORCPT ); Thu, 28 May 2015 03:17:55 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:29979 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751372AbbE1HRr (ORCPT ); Thu, 28 May 2015 03:17:47 -0400 Message-ID: <5566C106.4070706@huawei.com> Date: Thu, 28 May 2015 15:17:26 +0800 From: "Wangnan (F)" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: , , CC: , Subject: Re: [PATCH] perf tools: introduce arm64 support unwind test. References: <1427461681-72971-1-git-send-email-wangnan0@huawei.com> In-Reply-To: <1427461681-72971-1-git-send-email-wangnan0@huawei.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020206.5566C114.009D,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: c14264b389a67f059b25cd2ed1bfdbd1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ping? 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 > --- > 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 > #include > > +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 > +#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 > + > +.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;