Received: by 10.213.65.68 with SMTP id h4csp156786imn; Mon, 19 Mar 2018 23:23:14 -0700 (PDT) X-Google-Smtp-Source: AG47ELszyvCnR2A0E0wZZtIYvX5cCCYGkHhdic17pxr+h8OmRRLOKUYn2FvONSNAcpwj0eU5VVHY X-Received: by 2002:a17:902:9a0c:: with SMTP id v12-v6mr8217642plp.142.1521526994344; Mon, 19 Mar 2018 23:23:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521526994; cv=none; d=google.com; s=arc-20160816; b=GedOR2HuzxyFb3MZNRHlGOXcwnHazn8LuZnWNvIH5CKv4tyRRnjqiryEK8sJ6Y38VH AP9XE7zCf2gGwheEY+IJY2wLABKppMEp6HHavQvLOy5IrsWn3XaR29igY9bADTAtOHSo guYqP6cRD701zpscpWzM4EviLQFtzPUXDdcqgoAUUOysQSDZF9X7zlXqH1soqCJYCTuY DlJ9Qtd9txxRMOAjBJgMes/gL+0619cs2Ui3nrQL0DhoKlGD+fICXkmfJ2lvak9fStMn 03Bb3cdDx9xn14X4L1iteyM8Z8bgk28ihz1Gxvf4FrzF/aEP8U3EqoLvexSkuLETIaGU qpsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition :content-transfer-encoding:mime-version:robot-unsubscribe:robot-id :git-commit-id:subject:to:references:in-reply-to:reply-to:cc :message-id:from:date:arc-authentication-results; bh=WJluIfmndXEWY8AVIn+6fOmZe8saUMO+wwL++YPt0lU=; b=AXbPPGJkvFMkEjGvThs5s7L8iX53O/qrQY2aoq3/5pJ0VI7UwmZjRFrvYrj+jR3rUk 4eXWllGw1oJ0JaIKBtmRnvVDskSUYneczyXq/7T7SzYM6JjYaUw10iCRHVhTr6b3/YMi Kj8zTRBYdOernVw0vhBS1746EDhV6Lfh4wvXyP6NVrMoSXE4ZfFPI/hv5pgDFk/s6Iyh PjskkdVAb8IHXamK3r8IC1DJDyYLU/IEAyq7GdHdD+pFtalEc/OEchGnfdJHF3rbk+gC sgsjXvIyB/2om6DNeXF6FHfXMOs8hREozI22jeHU5EKxh/SpAduVcz0t/VUJ8YtGaU7s CQQw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p3si719631pgr.782.2018.03.19.23.23.00; Mon, 19 Mar 2018 23:23:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752009AbeCTGVb (ORCPT + 99 others); Tue, 20 Mar 2018 02:21:31 -0400 Received: from terminus.zytor.com ([198.137.202.136]:36115 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751416AbeCTGV2 (ORCPT ); Tue, 20 Mar 2018 02:21:28 -0400 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTP id w2K6Kt25028498; Mon, 19 Mar 2018 23:20:55 -0700 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id w2K6Ktba028495; Mon, 19 Mar 2018 23:20:55 -0700 Date: Mon, 19 Mar 2018 23:20:55 -0700 X-Authentication-Warning: terminus.zytor.com: tipbot set sender to tipbot@zytor.com using -f From: tip-bot for Kim Phillips Message-ID: Cc: alexander.shishkin@linux.intel.com, peterz@infradead.org, hpa@zytor.com, linux-kernel@vger.kernel.org, jolsa@redhat.com, namhyung@kernel.org, acme@redhat.com, jean.pihet@linaro.org, tglx@linutronix.de, mingo@kernel.org, chansen3@cisco.com, kim.phillips@arm.com Reply-To: kim.phillips@arm.com, chansen3@cisco.com, mingo@kernel.org, tglx@linutronix.de, jean.pihet@linaro.org, namhyung@kernel.org, acme@redhat.com, jolsa@redhat.com, linux-kernel@vger.kernel.org, alexander.shishkin@linux.intel.com, hpa@zytor.com, peterz@infradead.org In-Reply-To: <20180308211030.4ee4a0d6ff6dc5cda1b567d4@arm.com> References: <20180308211030.4ee4a0d6ff6dc5cda1b567d4@arm.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf tools arm64: Add libdw DWARF post unwind support for ARM64 Git-Commit-ID: 744e9a91cf898bf027dbe65cc61a5d7565335cba X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on terminus.zytor.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 744e9a91cf898bf027dbe65cc61a5d7565335cba Gitweb: https://git.kernel.org/tip/744e9a91cf898bf027dbe65cc61a5d7565335cba Author: Kim Phillips AuthorDate: Thu, 8 Mar 2018 21:10:30 -0600 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 16 Mar 2018 13:53:46 -0300 perf tools arm64: Add libdw DWARF post unwind support for ARM64 Based on prior work: https://lkml.org/lkml/2014/5/6/395 and on how other arches add libdw unwind support. Includes support for running the unwind test, e.g., on a system with only elfutils' libdw 0.170, the test now runs, and successfully: $ ./perf test unwind 56: Test dwarf unwind : Ok Originally-by: Jean Pihet Reported-by: Christian Hansen Signed-off-by: Kim Phillips Cc: Alexander Shishkin Cc: Jiri Olsa Cc: Namhyung Kim Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/20180308211030.4ee4a0d6ff6dc5cda1b567d4@arm.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/Makefile.config | 2 +- tools/perf/arch/arm64/include/arch-tests.h | 12 ++++++ tools/perf/arch/arm64/tests/Build | 2 + tools/perf/arch/arm64/tests/arch-tests.c | 16 ++++++++ tools/perf/arch/arm64/util/Build | 1 + tools/perf/arch/arm64/util/unwind-libdw.c | 60 ++++++++++++++++++++++++++++++ 6 files changed, 92 insertions(+), 1 deletion(-) diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 89cb2a36b8ff..98ff73648b51 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -75,7 +75,7 @@ endif # Disable it on all other architectures in case libdw unwind # support is detected in system. Add supported architectures # to the check. -ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm powerpc s390)) +ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390)) NO_LIBDW_DWARF_UNWIND := 1 endif diff --git a/tools/perf/arch/arm64/include/arch-tests.h b/tools/perf/arch/arm64/include/arch-tests.h new file mode 100644 index 000000000000..90ec4c8cb880 --- /dev/null +++ b/tools/perf/arch/arm64/include/arch-tests.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef ARCH_TESTS_H +#define ARCH_TESTS_H + +#ifdef HAVE_DWARF_UNWIND_SUPPORT +struct thread; +struct perf_sample; +#endif + +extern struct test arch_tests[]; + +#endif diff --git a/tools/perf/arch/arm64/tests/Build b/tools/perf/arch/arm64/tests/Build index b30eff9bcc83..883c57ff0c08 100644 --- a/tools/perf/arch/arm64/tests/Build +++ b/tools/perf/arch/arm64/tests/Build @@ -1,2 +1,4 @@ libperf-y += regs_load.o libperf-y += dwarf-unwind.o + +libperf-y += arch-tests.o diff --git a/tools/perf/arch/arm64/tests/arch-tests.c b/tools/perf/arch/arm64/tests/arch-tests.c new file mode 100644 index 000000000000..5b1543c98022 --- /dev/null +++ b/tools/perf/arch/arm64/tests/arch-tests.c @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include "tests/tests.h" +#include "arch-tests.h" + +struct test arch_tests[] = { +#ifdef HAVE_DWARF_UNWIND_SUPPORT + { + .desc = "DWARF unwind", + .func = test__dwarf_unwind, + }, +#endif + { + .func = NULL, + }, +}; diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build index c0b8dfef98ba..68f8a8eb3ad0 100644 --- a/tools/perf/arch/arm64/util/Build +++ b/tools/perf/arch/arm64/util/Build @@ -2,6 +2,7 @@ libperf-y += header.o libperf-y += sym-handling.o libperf-$(CONFIG_DWARF) += dwarf-regs.o libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o +libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o libperf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \ ../../arm/util/auxtrace.o \ diff --git a/tools/perf/arch/arm64/util/unwind-libdw.c b/tools/perf/arch/arm64/util/unwind-libdw.c new file mode 100644 index 000000000000..7623d85e77f3 --- /dev/null +++ b/tools/perf/arch/arm64/util/unwind-libdw.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include "../../util/unwind-libdw.h" +#include "../../util/perf_regs.h" +#include "../../util/event.h" + +bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) +{ + struct unwind_info *ui = arg; + struct regs_dump *user_regs = &ui->sample->user_regs; + Dwarf_Word dwarf_regs[PERF_REG_ARM64_MAX], dwarf_pc; + +#define REG(r) ({ \ + Dwarf_Word val = 0; \ + perf_reg_value(&val, user_regs, PERF_REG_ARM64_##r); \ + val; \ +}) + + dwarf_regs[0] = REG(X0); + dwarf_regs[1] = REG(X1); + dwarf_regs[2] = REG(X2); + dwarf_regs[3] = REG(X3); + dwarf_regs[4] = REG(X4); + dwarf_regs[5] = REG(X5); + dwarf_regs[6] = REG(X6); + dwarf_regs[7] = REG(X7); + dwarf_regs[8] = REG(X8); + dwarf_regs[9] = REG(X9); + dwarf_regs[10] = REG(X10); + dwarf_regs[11] = REG(X11); + dwarf_regs[12] = REG(X12); + dwarf_regs[13] = REG(X13); + dwarf_regs[14] = REG(X14); + dwarf_regs[15] = REG(X15); + dwarf_regs[16] = REG(X16); + dwarf_regs[17] = REG(X17); + dwarf_regs[18] = REG(X18); + dwarf_regs[19] = REG(X19); + dwarf_regs[20] = REG(X20); + dwarf_regs[21] = REG(X21); + dwarf_regs[22] = REG(X22); + dwarf_regs[23] = REG(X23); + dwarf_regs[24] = REG(X24); + dwarf_regs[25] = REG(X25); + dwarf_regs[26] = REG(X26); + dwarf_regs[27] = REG(X27); + dwarf_regs[28] = REG(X28); + dwarf_regs[29] = REG(X29); + dwarf_regs[30] = REG(LR); + dwarf_regs[31] = REG(SP); + + if (!dwfl_thread_state_registers(thread, 0, PERF_REG_ARM64_MAX, + dwarf_regs)) + return false; + + dwarf_pc = REG(PC); + dwfl_thread_state_register_pc(thread, dwarf_pc); + + return true; +}