From ec34c28d90ed2f64825beead4f59dfe08171c025 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 5 May 2014 13:42:36 +0200 Subject: [PATCH] byteorder: do not assume PowerPC is big-endian byteorder.h currently uses reverse-indexing ASM instructions for little endian multi-byte storage/retrieval on PowerPC. With Power8 this is an incorrect assumption, as it can be big or little endian. Bug: https://bugzilla.samba.org/show_bug.cgi?id=10590 Signed-off-by: David Disseldorp --- lib/util/byteorder.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/util/byteorder.h b/lib/util/byteorder.h index 58cd68a..82c050b 100644 --- a/lib/util/byteorder.h +++ b/lib/util/byteorder.h @@ -19,6 +19,7 @@ #ifndef _BYTEORDER_H #define _BYTEORDER_H +#include /* This file implements macros for machine independent short and @@ -89,10 +90,12 @@ it also defines lots of intermediate macros, just ignore those :-) /* - on powerpc we can use the magic instructions to load/store - in little endian -*/ -#if (defined(__powerpc__) && defined(__GNUC__)) + * On powerpc we can use the magic instructions to load/store in little endian. + * The instructions are reverse-indexing, so assume a big endian Power + * processor. Power8 can be big or little endian, so we need to explicitly + * check. + */ +#if (defined(__powerpc__) && defined(__GNUC__) && HAVE_BIG_ENDIAN) static __inline__ uint16_t ld_le16(const uint16_t *addr) { uint16_t val; -- 1.8.4.5