99fc6299db
The oprofile build was broken on powerpc since version 0.9.8. This was detected in several autobuilds, like http://autobuild.buildroot.net/results/6f6c02d18495907d50fcdfc6003ac20d493c55fe/ Thomas Petazzoni had some fixes pending in his own tree, and this patch is partially based on this work (credits to him). Here is an overview: - I took over (and fixed) the oprofile.mk changes, except for the powerpc- specific part. For powerpc, there is a new dependency to libpfm4. - I reimported those Yocto patches that were specific to the ppc build issues, but left out the other ones. Those can be added in separate commits. [Peter: simplify libpfm4 check] Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com> Tested-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
106 lines
4.1 KiB
Diff
106 lines
4.1 KiB
Diff
From 8e36ad01ceb1257d05773b684dbe9358aecd3f71 Mon Sep 17 00:00:00 2001
|
|
From: Maynard Johnson <maynardj@us.ibm.com>
|
|
Date: Tue, 26 Feb 2013 13:41:27 -0600
|
|
Subject: [PATCH] Fix PPC64-specific libpfm usage so it doesn't break ppc32
|
|
architecture
|
|
|
|
The configure check to determine whether we should use libpfm or not
|
|
is intended only for the ppc64 architecture, but was incorrectly
|
|
hitting on the ppc32 architecture, too. Not only that, but it was using
|
|
'uname' which is not a good idea in cross-compile situtations.
|
|
|
|
Then, aside from that, we had several instances in the source code
|
|
of the following:
|
|
#if (defined(__powerpc__) || defined(__powerpc64__))
|
|
which incorrectly included ppc32 architecutre also, when it was intended
|
|
for use as PPC64 architecture.
|
|
|
|
This patch fixes both errors.
|
|
|
|
Signed-off-by: Maynard Johnson <maynardj@us.ibm.com
|
|
---
|
|
configure.ac | 5 ++---
|
|
libperf_events/operf_utils.cpp | 4 ++--
|
|
libperf_events/operf_utils.h | 6 ++++++
|
|
pe_profiling/operf.cpp | 10 +++++-----
|
|
4 files changed, 15 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -100,11 +100,10 @@ else
|
|
HAVE_PERF_EVENTS='0'
|
|
fi
|
|
AC_DEFINE_UNQUOTED(HAVE_PERF_EVENTS, $HAVE_PERF_EVENTS, [Kernel support for perf_events exists])
|
|
-
|
|
+AC_CANONICAL_HOST
|
|
if test "$HAVE_PERF_EVENTS" = "1"; then
|
|
PFM_LIB=
|
|
- arch="`uname -m`"
|
|
- if test "$arch" = "ppc64" || test "$arch" = "ppc"; then
|
|
+ if test "$host_cpu" = "powerpc64"; then
|
|
AC_CHECK_HEADER(perfmon/pfmlib.h,,[AC_MSG_ERROR([pfmlib.h not found; usually provided in papi devel package])])
|
|
AC_CHECK_LIB(pfm,pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', [
|
|
AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1',
|
|
diff --git a/libperf_events/operf_utils.cpp b/libperf_events/operf_utils.cpp
|
|
--- a/libperf_events/operf_utils.cpp
|
|
+++ b/libperf_events/operf_utils.cpp
|
|
@@ -82,7 +82,7 @@ static event_t comm_event;
|
|
* the following method is to map the operf-record event value to a value that
|
|
* opreport can understand.
|
|
*/
|
|
-#if (defined(__powerpc__) || defined(__powerpc64__))
|
|
+#if PPC64_ARCH
|
|
#define NIL_CODE ~0U
|
|
|
|
#if HAVE_LIBPFM3
|
|
@@ -708,7 +708,7 @@ static void __handle_sample_event(event_
|
|
} else if (event->header.misc == PERF_RECORD_MISC_USER) {
|
|
in_kernel = false;
|
|
}
|
|
-#if (defined(__powerpc__) || defined(__powerpc64__))
|
|
+#if PPC64_ARCH
|
|
else if (event->header.misc == PERF_RECORD_MISC_HYPERVISOR) {
|
|
#define MAX_HYPERVISOR_ADDRESS 0xfffffffULL
|
|
if (data.ip > MAX_HYPERVISOR_ADDRESS) {
|
|
diff --git a/libperf_events/operf_utils.h b/libperf_events/operf_utils.h
|
|
--- a/libperf_events/operf_utils.h
|
|
+++ b/libperf_events/operf_utils.h
|
|
@@ -45,6 +45,12 @@ extern bool throttled;
|
|
#define MMAP_WINDOW_SZ (32 * 1024 * 1024ULL)
|
|
#endif
|
|
|
|
+/* A macro to be used for ppc64 architecture-specific code. The '__powerpc__' macro
|
|
+ * is defined for both ppc64 and ppc32 architectures, so we must further qualify by
|
|
+ * including the 'HAVE_LIBPFM' macro, since that macro will be defined only for ppc64.
|
|
+ */
|
|
+#define PPC64_ARCH (HAVE_LIBPFM) && ((defined(__powerpc__) || defined(__powerpc64__)))
|
|
+
|
|
extern unsigned int op_nr_counters;
|
|
|
|
static inline size_t align_64bit(u64 x)
|
|
diff --git a/pe_profiling/operf.cpp b/pe_profiling/operf.cpp
|
|
--- a/pe_profiling/operf.cpp
|
|
+++ b/pe_profiling/operf.cpp
|
|
@@ -1197,9 +1197,9 @@ static void _process_events_list(void)
|
|
_get_event_code(&event);
|
|
events.push_back(event);
|
|
}
|
|
-#if (defined(__powerpc__) || defined(__powerpc64__))
|
|
+#if PPC64_ARCH
|
|
{
|
|
- /* This section of code is for architectures such as ppc[64] for which
|
|
+ /* This section of code is soley for the ppc64 architecture for which
|
|
* the oprofile event code needs to be converted to the appropriate event
|
|
* code to pass to the perf_event_open syscall.
|
|
*/
|
|
@@ -1244,7 +1244,7 @@ static void get_default_event(void)
|
|
_get_event_code(&dft_evt);
|
|
events.push_back(dft_evt);
|
|
|
|
-#if (defined(__powerpc__) || defined(__powerpc64__))
|
|
+#if PPC64_ARCH
|
|
{
|
|
/* This section of code is for architectures such as ppc[64] for which
|
|
* the oprofile event code needs to be converted to the appropriate event
|