From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>,
"Naveen N . Rao" <naveen.n.rao@linux.vnet.ibm.com>,
linuxppc-dev@lists.ozlabs.org,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 06/25] perf unwind: Support for powerpc
Date: Wed, 21 Jun 2017 15:02:26 -0300 [thread overview]
Message-ID: <20170621180245.23134-7-acme@kernel.org> (raw)
In-Reply-To: <20170621180245.23134-1-acme@kernel.org>
From: Paolo Bonzini <pbonzini@redhat.com>
Porting PPC to libdw only needs an architecture-specific hook to move
the register state from perf to libdw.
The ARM and x86 architectures already use libdw, and it is useful to
have as much common code for the unwinder as possible. Mark Wielaard
has contributed a frame-based unwinder to libdw, so that unwinding works
even for binaries that do not have CFI information. In addition,
libunwind is always preferred to libdw by the build machinery so this
cannot introduce regressions on machines that have both libunwind and
libdw installed.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Milian Wolff <milian.wolff@kdab.com>
Acked-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/1496312681-20133-1-git-send-email-pbonzini@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Makefile.config | 2 +-
tools/perf/arch/powerpc/util/Build | 2 +
tools/perf/arch/powerpc/util/unwind-libdw.c | 73 +++++++++++++++++++++++++++++
3 files changed, 76 insertions(+), 1 deletion(-)
create mode 100644 tools/perf/arch/powerpc/util/unwind-libdw.c
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 1f4fbc9a3292..bdf0e87f9b29 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -61,7 +61,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))
+ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm powerpc))
NO_LIBDW_DWARF_UNWIND := 1
endif
diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
index 90ad64b231cd..2e6595310420 100644
--- a/tools/perf/arch/powerpc/util/Build
+++ b/tools/perf/arch/powerpc/util/Build
@@ -5,4 +5,6 @@ libperf-y += perf_regs.o
libperf-$(CONFIG_DWARF) += dwarf-regs.o
libperf-$(CONFIG_DWARF) += skip-callchain-idx.o
+
libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
+libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
diff --git a/tools/perf/arch/powerpc/util/unwind-libdw.c b/tools/perf/arch/powerpc/util/unwind-libdw.c
new file mode 100644
index 000000000000..3a24b3c43273
--- /dev/null
+++ b/tools/perf/arch/powerpc/util/unwind-libdw.c
@@ -0,0 +1,73 @@
+#include <elfutils/libdwfl.h>
+#include "../../util/unwind-libdw.h"
+#include "../../util/perf_regs.h"
+#include "../../util/event.h"
+
+/* See backends/ppc_initreg.c and backends/ppc_regs.c in elfutils. */
+static const int special_regs[3][2] = {
+ { 65, PERF_REG_POWERPC_LINK },
+ { 101, PERF_REG_POWERPC_XER },
+ { 109, PERF_REG_POWERPC_CTR },
+};
+
+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[32], dwarf_nip;
+ size_t i;
+
+#define REG(r) ({ \
+ Dwarf_Word val = 0; \
+ perf_reg_value(&val, user_regs, PERF_REG_POWERPC_##r); \
+ val; \
+})
+
+ dwarf_regs[0] = REG(R0);
+ dwarf_regs[1] = REG(R1);
+ dwarf_regs[2] = REG(R2);
+ dwarf_regs[3] = REG(R3);
+ dwarf_regs[4] = REG(R4);
+ dwarf_regs[5] = REG(R5);
+ dwarf_regs[6] = REG(R6);
+ dwarf_regs[7] = REG(R7);
+ dwarf_regs[8] = REG(R8);
+ dwarf_regs[9] = REG(R9);
+ dwarf_regs[10] = REG(R10);
+ dwarf_regs[11] = REG(R11);
+ dwarf_regs[12] = REG(R12);
+ dwarf_regs[13] = REG(R13);
+ dwarf_regs[14] = REG(R14);
+ dwarf_regs[15] = REG(R15);
+ dwarf_regs[16] = REG(R16);
+ dwarf_regs[17] = REG(R17);
+ dwarf_regs[18] = REG(R18);
+ dwarf_regs[19] = REG(R19);
+ dwarf_regs[20] = REG(R20);
+ dwarf_regs[21] = REG(R21);
+ dwarf_regs[22] = REG(R22);
+ dwarf_regs[23] = REG(R23);
+ dwarf_regs[24] = REG(R24);
+ dwarf_regs[25] = REG(R25);
+ dwarf_regs[26] = REG(R26);
+ dwarf_regs[27] = REG(R27);
+ dwarf_regs[28] = REG(R28);
+ dwarf_regs[29] = REG(R29);
+ dwarf_regs[30] = REG(R30);
+ dwarf_regs[31] = REG(R31);
+ if (!dwfl_thread_state_registers(thread, 0, 32, dwarf_regs))
+ return false;
+
+ dwarf_nip = REG(NIP);
+ dwfl_thread_state_register_pc(thread, dwarf_nip);
+ for (i = 0; i < ARRAY_SIZE(special_regs); i++) {
+ Dwarf_Word val = 0;
+ perf_reg_value(&val, user_regs, special_regs[i][1]);
+ if (!dwfl_thread_state_registers(thread,
+ special_regs[i][0], 1,
+ &val))
+ return false;
+ }
+
+ return true;
+}
--
2.9.4
next prev parent reply other threads:[~2017-06-21 18:03 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-21 18:02 [GIT PULL 00/25] perf/core improvements and fixes Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 01/25] perf evsel: Adopt find_process() Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 02/25] perf tools: Do parameter validation earlier on fetch_kernel_version() Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 03/25] perf tools: Remove unused _ALL_SOURCE define Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 04/25] tools lib api fs: Add sysfs__write_int function Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 05/25] perf stat: Add support to measure SMI cost Arnaldo Carvalho de Melo
2017-06-21 18:02 ` Arnaldo Carvalho de Melo [this message]
2017-06-21 18:02 ` [PATCH 07/25] perf intel-pt: Move decoder error setting into one condition Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 08/25] perf intel-pt: Improve sample timestamp Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 09/25] perf intel-pt: Fix missing stack clear Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 10/25] perf intel-pt: Ensure IP is zero when state is INTEL_PT_STATE_NO_IP Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 11/25] perf intel-pt: Fix last_ip usage Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 12/25] perf intel-pt: Ensure never to set 'last_ip' when packet 'count' is zero Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 13/25] perf intel-pt: Use FUP always when scanning for an IP Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 14/25] perf intel-pt: Clear FUP flag on error Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 15/25] perf intel-pt: Add missing __fallthrough Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 16/25] perf intel-pt: Allow decoding with branch tracing disabled Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 17/25] perf intel-pt: Add default config for pass-through branch enable Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 18/25] perf intel-pt: Add documentation for new config terms Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 19/25] perf intel-pt: Add decoder support for ptwrite and power event packets Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 20/25] perf intel-pt: Add reserved byte to CBR packet payload Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 21/25] perf intel-pt: Add decoder support for CBR events Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 22/25] perf intel-pt: Remove redundant initial_skip checks Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 23/25] perf intel-pt: Fix transactions_sample_type Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 24/25] perf tools: Fix message because cpu list option is -C not -c Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 25/25] perf script: Fix message because field list option is -F not -f Arnaldo Carvalho de Melo
2017-06-21 18:13 ` [GIT PULL 00/25] perf/core improvements and fixes Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170621180245.23134-7-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mingo@kernel.org \
--cc=naveen.n.rao@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox