introduce unaligned.h
authorJan Beulich <jbeulich@suse.com>
Mon, 18 Jan 2021 11:09:13 +0000 (12:09 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 18 Jan 2021 11:09:13 +0000 (12:09 +0100)
Rather than open-coding commonly used constructs in yet more places when
pulling in zstd decompression support (and its xxhash prereq), pull out
the custom bits into a commonly used header (for the hypervisor build;
the tool stack and stubdom builds of libxenguest will still remain in
need of similarly taking care of). For now this is limited to x86, where
custom logic isn't needed (considering this is going to be used in init
code only, even using alternatives patching to use MOVBE doesn't seem
worthwhile).

For Arm64 with CONFIG_ACPI=y (due to efi-dom0.c's re-use of xz/crc32.c)
drop the not really necessary inclusion of xz's private.h.

No change in generated code.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/common/lz4/defs.h
xen/common/lzo.c
xen/common/unlzo.c
xen/common/xz/crc32.c
xen/common/xz/private.h
xen/include/asm-x86/unaligned.h [new file with mode: 0644]
xen/include/xen/unaligned.h [new file with mode: 0644]

index d886a4e122b86c660ae7bd14e5c2fe08179923a2..4fbea2ac3dd4fe0cbe81314faa1f19902b8afc0d 100644 (file)
 
 #ifdef __XEN__
 #include <asm/byteorder.h>
-#endif
+#include <asm/unaligned.h>
+#else
 
-static inline u16 INIT get_unaligned_le16(const void *p)
+static inline u16 get_unaligned_le16(const void *p)
 {
        return le16_to_cpup(p);
 }
 
-static inline u32 INIT get_unaligned_le32(const void *p)
+static inline u32 get_unaligned_le32(const void *p)
 {
        return le32_to_cpup(p);
 }
 
+#endif
+
 /*
  * Detects 64 bits mode
  */
index f4c0ad85307a4f50760f242bded9374943204ac7..e4841794f45a27512fd5c86096f8e35c225328bb 100644 (file)
 #ifdef __XEN__
 #include <xen/lib.h>
 #include <asm/byteorder.h>
+#include <asm/unaligned.h>
+#else
+#define get_unaligned_le16(_p) (*(u16 *)(_p))
 #endif
 
 #include <xen/lzo.h>
-#define get_unaligned(_p) (*(_p))
-#define put_unaligned(_val,_p) (*(_p)=_val)
-#define get_unaligned_le16(_p) (*(u16 *)(_p))
-#define get_unaligned_le32(_p) (*(u32 *)(_p))
 
 #include "decompress.h"
 
index 5ae6cf911e86b4d817f9ada0ee3228d5df607aec..11f64fcf3b26c4f0796e07b28b65263a1be95abb 100644 (file)
 
 #ifdef __XEN__
 #include <asm/byteorder.h>
-#endif
+#include <asm/unaligned.h>
+#else
 
-#if 1 /* ndef CONFIG_??? */
-static inline u16 INIT get_unaligned_be16(void *p)
+static inline u16 get_unaligned_be16(const void *p)
 {
        return be16_to_cpup(p);
 }
 
-static inline u32 INIT get_unaligned_be32(void *p)
+static inline u32 get_unaligned_be32(const void *p)
 {
        return be32_to_cpup(p);
 }
-#else
-#include <asm/unaligned.h>
-
-static inline u16 INIT get_unaligned_be16(void *p)
-{
-       return be16_to_cpu(__get_unaligned(p, 2));
-}
 
-static inline u32 INIT get_unaligned_be32(void *p)
-{
-       return be32_to_cpu(__get_unaligned(p, 4));
-}
 #endif
 
 static const unsigned char lzop_magic[] = {
index af08ae2cf6e2f5fa91f67f986e61b17cffbf9ce4..0708b61638129bbd4d34c427a60206bc99708711 100644 (file)
@@ -15,8 +15,6 @@
  * but they are bigger and use more memory for the lookup table.
  */
 
-#include "private.h"
-
 XZ_EXTERN uint32_t INITDATA xz_crc32_table[256];
 
 XZ_EXTERN void INIT xz_crc32_init(void)
index 7ea24892297fc1c5702e851f23f18296ed7c34ee..511343fcc23454186f19fe9b767d28c31fc231c7 100644 (file)
 #ifdef __XEN__
 #include <xen/kernel.h>
 #include <asm/byteorder.h>
-#endif
-
-#define get_le32(p) le32_to_cpup((const uint32_t *)(p))
+#include <asm/unaligned.h>
+#else
 
-#if 1 /* ndef CONFIG_??? */
-static inline u32 INIT get_unaligned_le32(void *p)
+static inline u32 get_unaligned_le32(const void *p)
 {
        return le32_to_cpup(p);
 }
 
-static inline void INIT put_unaligned_le32(u32 val, void *p)
+static inline void put_unaligned_le32(u32 val, void *p)
 {
        *(__force __le32*)p = cpu_to_le32(val);
 }
-#else
-#include <asm/unaligned.h>
-
-static inline u32 INIT get_unaligned_le32(void *p)
-{
-       return le32_to_cpu(__get_unaligned(p, 4));
-}
 
-static inline void INIT put_unaligned_le32(u32 val, void *p)
-{
-       __put_unaligned(cpu_to_le32(val), p, 4);
-}
 #endif
 
+#define get_le32(p) le32_to_cpup((const uint32_t *)(p))
+
 #define false 0
 #define true 1
 
diff --git a/xen/include/asm-x86/unaligned.h b/xen/include/asm-x86/unaligned.h
new file mode 100644 (file)
index 0000000..6070801
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ASM_UNALIGNED_H__
+#define __ASM_UNALIGNED_H__
+
+#include <xen/unaligned.h>
+
+#endif /* __ASM_UNALIGNED_H__ */
diff --git a/xen/include/xen/unaligned.h b/xen/include/xen/unaligned.h
new file mode 100644 (file)
index 0000000..eef7ec7
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * This header can be used by architectures where unaligned accesses work
+ * without faulting, and at least reasonably efficiently.  Other architectures
+ * will need to have a custom asm/unaligned.h.
+ */
+#ifndef __ASM_UNALIGNED_H__
+#error "xen/unaligned.h should not be included directly - include asm/unaligned.h instead"
+#endif
+
+#ifndef __XEN_UNALIGNED_H__
+#define __XEN_UNALIGNED_H__
+
+#include <xen/types.h>
+#include <asm/byteorder.h>
+
+#define get_unaligned(p) (*(p))
+#define put_unaligned(val, p) (*(p) = (val))
+
+static inline uint16_t get_unaligned_be16(const void *p)
+{
+       return be16_to_cpup(p);
+}
+
+static inline void put_unaligned_be16(uint16_t val, void *p)
+{
+       *(__force __be16*)p = cpu_to_be16(val);
+}
+
+static inline uint32_t get_unaligned_be32(const void *p)
+{
+       return be32_to_cpup(p);
+}
+
+static inline void put_unaligned_be32(uint32_t val, void *p)
+{
+       *(__force __be32*)p = cpu_to_be32(val);
+}
+
+static inline uint64_t get_unaligned_be64(const void *p)
+{
+       return be64_to_cpup(p);
+}
+
+static inline void put_unaligned_be64(uint64_t val, void *p)
+{
+       *(__force __be64*)p = cpu_to_be64(val);
+}
+
+static inline uint16_t get_unaligned_le16(const void *p)
+{
+       return le16_to_cpup(p);
+}
+
+static inline void put_unaligned_le16(uint16_t val, void *p)
+{
+       *(__force __le16*)p = cpu_to_le16(val);
+}
+
+static inline uint32_t get_unaligned_le32(const void *p)
+{
+       return le32_to_cpup(p);
+}
+
+static inline void put_unaligned_le32(uint32_t val, void *p)
+{
+       *(__force __le32*)p = cpu_to_le32(val);
+}
+
+static inline uint64_t get_unaligned_le64(const void *p)
+{
+       return le64_to_cpup(p);
+}
+
+static inline void put_unaligned_le64(uint64_t val, void *p)
+{
+       *(__force __le64*)p = cpu_to_le64(val);
+}
+
+#endif /* __XEN_UNALIGNED_H__ */