X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=bswap.h;h=82a79517db971137f72d6c160b5721af131e6721;hb=6eed18568d985f5e091e96205f5ebf50fb823f4e;hp=37fb04ed9777d1fc372023021e52da38bc433be4;hpb=188d857911636fa43628eb8a7beeab4702636317;p=qemu.git diff --git a/bswap.h b/bswap.h index 37fb04ed9..82a79517d 100644 --- a/bswap.h +++ b/bswap.h @@ -5,7 +5,13 @@ #include -#ifdef HAVE_BYTESWAP_H +#ifdef CONFIG_MACHINE_BSWAP_H +#include +#include +#include +#else + +#ifdef CONFIG_BYTESWAP_H #include #else @@ -41,23 +47,25 @@ (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \ }) -#endif /* !HAVE_BYTESWAP_H */ +#endif /* !CONFIG_BYTESWAP_H */ static inline uint16_t bswap16(uint16_t x) { return bswap_16(x); } -static inline uint32_t bswap32(uint32_t x) +static inline uint32_t bswap32(uint32_t x) { return bswap_32(x); } -static inline uint64_t bswap64(uint64_t x) +static inline uint64_t bswap64(uint64_t x) { return bswap_64(x); } +#endif /* ! CONFIG_MACHINE_BSWAP_H */ + static inline void bswap16s(uint16_t *s) { *s = bswap16(*s); @@ -73,7 +81,7 @@ static inline void bswap64s(uint64_t *s) *s = bswap64(*s); } -#if defined(WORDS_BIGENDIAN) +#if defined(HOST_WORDS_BIGENDIAN) #define be_bswap(v, size) (v) #define le_bswap(v, size) bswap ## size(v) #define be_bswaps(v, size) @@ -126,15 +134,17 @@ CPU_CONVERT(le, 64, uint64_t) /* unaligned versions (optimized for frequent unaligned accesses)*/ -#if defined(__i386__) || defined(__powerpc__) +#if defined(__i386__) || defined(_ARCH_PPC) #define cpu_to_le16wu(p, v) cpu_to_le16w(p, v) #define cpu_to_le32wu(p, v) cpu_to_le32w(p, v) #define le16_to_cpupu(p) le16_to_cpup(p) #define le32_to_cpupu(p) le32_to_cpup(p) +#define be32_to_cpupu(p) be32_to_cpup(p) #define cpu_to_be16wu(p, v) cpu_to_be16w(p, v) #define cpu_to_be32wu(p, v) cpu_to_be32w(p, v) +#define cpu_to_be64wu(p, v) cpu_to_be64w(p, v) #else @@ -142,7 +152,7 @@ static inline void cpu_to_le16wu(uint16_t *p, uint16_t v) { uint8_t *p1 = (uint8_t *)p; - p1[0] = v; + p1[0] = v & 0xff; p1[1] = v >> 8; } @@ -150,7 +160,7 @@ static inline void cpu_to_le32wu(uint32_t *p, uint32_t v) { uint8_t *p1 = (uint8_t *)p; - p1[0] = v; + p1[0] = v & 0xff; p1[1] = v >> 8; p1[2] = v >> 16; p1[3] = v >> 24; @@ -168,12 +178,18 @@ static inline uint32_t le32_to_cpupu(const uint32_t *p) return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24); } +static inline uint32_t be32_to_cpupu(const uint32_t *p) +{ + const uint8_t *p1 = (const uint8_t *)p; + return p1[3] | (p1[2] << 8) | (p1[1] << 16) | (p1[0] << 24); +} + static inline void cpu_to_be16wu(uint16_t *p, uint16_t v) { uint8_t *p1 = (uint8_t *)p; p1[0] = v >> 8; - p1[1] = v; + p1[1] = v & 0xff; } static inline void cpu_to_be32wu(uint32_t *p, uint32_t v) @@ -183,15 +199,31 @@ static inline void cpu_to_be32wu(uint32_t *p, uint32_t v) p1[0] = v >> 24; p1[1] = v >> 16; p1[2] = v >> 8; - p1[3] = v; + p1[3] = v & 0xff; +} + +static inline void cpu_to_be64wu(uint64_t *p, uint64_t v) +{ + uint8_t *p1 = (uint8_t *)p; + + p1[0] = v >> 56; + p1[1] = v >> 48; + p1[2] = v >> 40; + p1[3] = v >> 32; + p1[4] = v >> 24; + p1[5] = v >> 16; + p1[6] = v >> 8; + p1[7] = v & 0xff; } #endif -#ifdef WORDS_BIGENDIAN +#ifdef HOST_WORDS_BIGENDIAN #define cpu_to_32wu cpu_to_be32wu +#define leul_to_cpu(v) glue(glue(le,HOST_LONG_BITS),_to_cpu)(v) #else #define cpu_to_32wu cpu_to_le32wu +#define leul_to_cpu(v) (v) #endif #undef le_bswap @@ -199,4 +231,10 @@ static inline void cpu_to_be32wu(uint32_t *p, uint32_t v) #undef le_bswaps #undef be_bswaps +/* len must be one of 1, 2, 4 */ +static inline uint32_t qemu_bswap_len(uint32_t value, int len) +{ + return bswap32(value) >> (32 - 8 * len); +} + #endif /* BSWAP_H */