Upstream-Status: Backport

From 08241f1b2c5a4d48020c82b509dc1076f51bf0bd Mon Sep 17 00:00:00 2001
From: Maynard Johnson <maynardj@us.ibm.com>
Date: Wed, 14 Aug 2013 15:40:44 -0500
Subject: [PATCH] Fix compile error on ppc/uClibc platform: 'AT_BASE_PLATFORM'
 undeclared'

This issue was reported via bug #245.

The method for obtaining cpu type on the ppc64 platform was recently
modified to detect the case when we're running on a kernel that has
not been updated to recognize the native processor type.  The cpu
type returned in the case where the native processor type is newer
than POWER7 will be "CPU_PPC64_ARCH_V1" (architected CPU type).
The method used for detecting when the kernel does not recognize the
native processor type is to inspect the aux vector and compare
AT_PLATFORM and AT_BASE_PLATFORM. The 'AT_BASE_PLATFORM' was defined
in glibc's elf.h around 5 years ago, but was never added to uClibc,
so the code that implements the above-described method fails to compile
on systems using uClibc.

Since the above-described method of using the aux vector is only
required for ppc64 systems, and ppc64-based platforms always use glibc
(which has the AT_BASE_PLATFORM macro defined), we now wrap that code
with '#if PPC64_ARCH' to prevent problems on other architectures.

Signed-off-by: Maynard Johnson <maynardj@us.ibm.com>
---
 libop/op_cpu_type.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/libop/op_cpu_type.c b/libop/op_cpu_type.c
index 44d6809..89d5a92 100644
--- a/libop/op_cpu_type.c
+++ b/libop/op_cpu_type.c
@@ -23,9 +23,16 @@
 #include <elf.h>
 #include <link.h>
 
+#include "config.h"
 #include "op_cpu_type.h"
 #include "op_hw_specific.h"
 
+/* 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__)))
+
 struct cpu_descr {
 	char const * pretty;
 	char const * name;
@@ -176,6 +183,7 @@ static char * _get_cpuinfo_cpu_type(char * buf, int len, const char * prefix)
 	return _get_cpuinfo_cpu_type_line(buf, len, prefix, 1);
 }
 
+#if PPC64_ARCH
 // The aux vector stuff below is currently only used by ppc64 arch
 static ElfW(auxv_t) * auxv_buf = NULL;
 
@@ -312,6 +320,13 @@ static op_cpu _get_ppc64_cpu_type(void)
 	cpu_type = op_get_cpu_number(cpu_type_str);
 	return cpu_type;
 }
+#else
+static op_cpu _get_ppc64_cpu_type(void)
+{
+	return CPU_NO_GOOD;
+}
+#endif
+
 
 static op_cpu _get_arm_cpu_type(void)
 {
-- 
1.9.0

