[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC 09/23] lz4: add support for OSes that don't have asm/unaligned.h



Add a configure check for asm/unaligned.h presence, and if it's not
available open-code the necessary functions for lz4.

Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx>
Cc: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
 tools/config.h.in     |    3 +++
 tools/configure.ac    |    2 +-
 xen/common/lz4/defs.h |   42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/tools/config.h.in b/tools/config.h.in
index 283cee7..709a51d 100644
--- a/tools/config.h.in
+++ b/tools/config.h.in
@@ -57,6 +57,9 @@
 /* Define to 1 if you have the <sys/endian.h> header file. */
 #undef HAVE_SYS_ENDIAN_H
 
+/* Define to 1 if you have the <asm/unaligned.h> header file. */
+#undef HAVE_ASM_UNALIGNED_H
+
 /* Define curses header to use */
 #undef INCLUDE_CURSES_H
 
diff --git a/tools/configure.ac b/tools/configure.ac
index 3b8db0a..cf30254 100644
--- a/tools/configure.ac
+++ b/tools/configure.ac
@@ -247,7 +247,7 @@ AC_CHECK_LIB([fdt], [fdt_create], [], [AC_MSG_ERROR([Could 
not find libfdt])])
 esac
 
 # Checks for header files.
-AC_CHECK_HEADERS([yajl/yajl_version.h sys/eventfd.h endian.h sys/endian.h])
+AC_CHECK_HEADERS([yajl/yajl_version.h sys/eventfd.h endian.h sys/endian.h 
asm/unaligned.h])
 
 AC_OUTPUT()
 
diff --git a/xen/common/lz4/defs.h b/xen/common/lz4/defs.h
index f46df08..f4b810a 100644
--- a/xen/common/lz4/defs.h
+++ b/xen/common/lz4/defs.h
@@ -23,7 +23,49 @@ static inline u32 INIT get_unaligned_le32(const void *p)
        return le32_to_cpup(p);
 }
 #else
+#ifdef HAVE_ASM_UNALIGNED_H
 #include <asm/unaligned.h>
+#else
+
+#if defined(HAVE_ENDIAN_H)
+#include <endian.h>
+#elif defined(HAVE_SYS_ENDIAN_H)
+#include <sys/endian.h>
+#endif
+
+#define le16_to_cpu(x) le16toh(x)
+#define le32_to_cpu(x) le32toh(x)
+
+extern void bad_unaligned_access_length(void) __attribute__((noreturn));
+
+struct __una_u32 { uint32_t x __attribute__((packed)); };
+struct __una_u16 { uint16_t x __attribute__((packed)); };
+
+static inline uint16_t __uldw(const uint16_t *addr)
+{
+       const struct __una_u16 *ptr = (const struct __una_u16 *) addr;
+       return ptr->x;
+}
+static inline uint32_t __uldl(const uint32_t *addr)
+{
+       const struct __una_u32 *ptr = (const struct __una_u32 *) addr;
+       return ptr->x;
+}
+#define __get_unaligned(ptr, size) ({          \
+       uint64_t __val;                         \
+       switch (size) {                         \
+       case 2:                                 \
+               __val = __uldw(ptr);            \
+               break;                          \
+       case 4:                                 \
+               __val = __uldl(ptr);            \
+               break;                          \
+       default:                                \
+               bad_unaligned_access_length();  \
+       };                                      \
+       __val;                                  \
+})
+#endif /* !HAVE_ASM_UNALIGNED_H */
 
 static inline u16 INIT get_unaligned_le16(const void *p)
 {
-- 
1.7.7.5 (Apple Git-26)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.