kumquat-buildroot/package/oprofile/oprofile-004-fix-ppc64-specific-libpfm-usage.patch
Thomas De Schampheleire 99fc6299db oprofile 0.9.8: fix compilation on powerpc
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>
2013-03-24 11:47:24 +01:00

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