Received: by 10.223.185.82 with SMTP id b18csp57217wrg; Thu, 8 Mar 2018 19:11:40 -0800 (PST) X-Google-Smtp-Source: AG47ELtAnh1z1mqLsHvrgEmnpzIqqTET+LUfKjkIrXiv1RoCAl1Ic4QENakqeBXhKjfg70HG+zPl X-Received: by 10.98.138.217 with SMTP id o86mr28604466pfk.128.1520565099994; Thu, 08 Mar 2018 19:11:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520565099; cv=none; d=google.com; s=arc-20160816; b=z56VejU0lvU7+hQs4wapPwneC/l31dQNXdMgAhFQU03zIQcdq2h559SWWpfQnqScCV W2zjX/eJ0fIHyagHrCS9tGWrS5NaqdklG48RQJa2DrvEq6rs0EzhpiKaQafI7gW5aTYN KJEyvG7iXg0TaSqde2iJKlqS3CvSIsgo/YjyH+XVTMt9rYNyU/kYtFDSDczsXnfh/0r3 kExQObLEC5UwROlPDLGekALCWZChifjH1GyNGxiLBiWseQvne1OHKEb1dZMuYMTLyBFL mB1/bgKX3FZ6hhmg+usyafR+nZ5odhY0ZpQid8IaT1SExQkUNCub66mJSv/En2+RL7N4 cyhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :date:arc-authentication-results; bh=mAK4fGTcSRssj4SCuPlneEur7K8wVdQJUXPt4ARmIus=; b=OX11Cdtbt1JwgJmyyOQ2rIziO7WE1VrSABSI2AQTujEYxBcSbofXvi4OOCJqfXxcH9 gUfCWit8Q8E3O65deXgwN/IJZA7VZ8KT/aiqnTtejOOEza+dqAM38Cted4zK6ckAj3MY Ex9xAKjOwA2gKl/28hnwajsUmN7OCLTEVJ/QqtLBF5bIKeJq+IaMtAkoocxwGvK2up11 h5esv0f60t7GhRv7B8COvEGZwTSR818OawFpZPAf8uVjmkimG3MrSnoU2tccdyaQBBKW HSMnLZ7u6VDDgS335ECs2vPc8qJjy3oMrYpAeJoJ93/2Vi8Ss45SH3G4+ROABtoRwKMV QMWQ== 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 92-v6si57268pli.623.2018.03.08.19.11.24; Thu, 08 Mar 2018 19:11:39 -0800 (PST) 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 S1750953AbeCIDKe (ORCPT + 99 others); Thu, 8 Mar 2018 22:10:34 -0500 Received: from foss.arm.com ([217.140.101.70]:46080 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750836AbeCIDKc (ORCPT ); Thu, 8 Mar 2018 22:10:32 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 12CDB80D; Thu, 8 Mar 2018 19:10:32 -0800 (PST) Received: from dupont (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7778E3F24A; Thu, 8 Mar 2018 19:10:31 -0800 (PST) Date: Thu, 8 Mar 2018 21:10:30 -0600 From: Kim Phillips To: "Christian Hansen (chansen3)" , Arnaldo Carvalho de Melo Cc: "linux-perf-users@vger.kernel.org" , Peter Zijlstra , Ingo Molnar , Alexander Shishkin , Jiri Olsa , Namhyung Kim , linux-kernel@vger.kernel.org Subject: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64 Message-Id: <20180308211030.4ee4a0d6ff6dc5cda1b567d4@arm.com> In-Reply-To: <9B701F46-6AEA-48D8-9103-71D35C83776D@cisco.com> References: <20180226142726.cd413c792d0782f77b60a23e@arm.com> <20180226174040.6998bd3c0a79b2f19c491e4d@arm.com> <9B701F46-6AEA-48D8-9103-71D35C83776D@cisco.com> Organization: Arm X-Mailer: Sylpheed 3.5.1 (GTK+ 2.24.31; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Based on prior work: https://lkml.org/lkml/2014/5/6/395 and 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 Reported-by: Christian Hansen Originally-by: Jean Pihet Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Arnaldo Carvalho de Melo Cc: Alexander Shishkin Cc: Jiri Olsa Cc: Namhyung Kim Cc: linux-kernel@vger.kernel.org Cc: linux-perf-users@vger.kernel.org Signed-off-by: Kim Phillips --- tools/perf/Makefile.config | 2 +- tools/perf/arch/arm64/include/arch-tests.h | 12 ++++++ tools/perf/arch/arm64/tests/Build | 3 ++ 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, 93 insertions(+), 1 deletion(-) create mode 100644 tools/perf/arch/arm64/include/arch-tests.h create mode 100644 tools/perf/arch/arm64/tests/arch-tests.c create mode 100644 tools/perf/arch/arm64/util/unwind-libdw.c 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..ca5630e73474 100644 --- a/tools/perf/arch/arm64/tests/Build +++ b/tools/perf/arch/arm64/tests/Build @@ -1,2 +1,5 @@ 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; +} -- 2.16.2