diff options
Diffstat (limited to 'package/oprofile/oprofile-004-fix-ppc64-specific-libpfm-usage.patch')
-rw-r--r-- | package/oprofile/oprofile-004-fix-ppc64-specific-libpfm-usage.patch | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/package/oprofile/oprofile-004-fix-ppc64-specific-libpfm-usage.patch b/package/oprofile/oprofile-004-fix-ppc64-specific-libpfm-usage.patch new file mode 100644 index 000000000..d8a43de08 --- /dev/null +++ b/package/oprofile/oprofile-004-fix-ppc64-specific-libpfm-usage.patch @@ -0,0 +1,105 @@ +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 |