From dfec3be97071d4b3eb9f239f5ab59371b1a08b7e Mon Sep 17 00:00:00 2001 From: shermp <14854761+shermp@users.noreply.github.com> Date: Sat, 16 Nov 2019 00:51:42 +1300 Subject: [PATCH] Remove bswap.h in favor of internal endian handling Doing this because the license of bswap.h that was obtained from PCem is unkown to me, and I must assume it's GPLv2 --- src/bswap.h | 202 ---------------------------------------- src/minivhd_io.c | 3 +- src/minivhd_manage.c | 3 +- src/minivhd_struct_rw.c | 14 +-- src/minivhd_util.c | 59 ++++++++++++ src/minivhd_util.h | 10 ++ 6 files changed, 78 insertions(+), 213 deletions(-) delete mode 100644 src/bswap.h diff --git a/src/bswap.h b/src/bswap.h deleted file mode 100644 index 070a40a..0000000 --- a/src/bswap.h +++ /dev/null @@ -1,202 +0,0 @@ -#ifndef BSWAP_H -#define BSWAP_H - -//#include "config-host.h" - -#include - -#ifdef HAVE_BYTESWAP_H -#include -#else - -#define bswap_16(x) \ -({ \ - uint16_t __x = (x); \ - ((uint16_t)( \ - (((uint16_t)(__x) & (uint16_t)0x00ffU) << 8) | \ - (((uint16_t)(__x) & (uint16_t)0xff00U) >> 8) )); \ -}) - -#define bswap_32(x) \ -({ \ - uint32_t __x = (x); \ - ((uint32_t)( \ - (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \ - (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \ - (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \ - (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \ -}) - -#define bswap_64(x) \ -({ \ - uint64_t __x = (x); \ - ((uint64_t)( \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) << 8) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ - (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \ -}) - -#endif /* !HAVE_BYTESWAP_H */ - -static inline uint16_t bswap16(uint16_t x) -{ - return bswap_16(x); -} - -static inline uint32_t bswap32(uint32_t x) -{ - return bswap_32(x); -} - -static inline uint64_t bswap64(uint64_t x) -{ - return bswap_64(x); -} - -static inline void bswap16s(uint16_t *s) -{ - *s = bswap16(*s); -} - -static inline void bswap32s(uint32_t *s) -{ - *s = bswap32(*s); -} - -static inline void bswap64s(uint64_t *s) -{ - *s = bswap64(*s); -} - -#if defined(WORDS_BIGENDIAN) -#define be_bswap(v, size) (v) -#define le_bswap(v, size) bswap ## size(v) -#define be_bswaps(v, size) -#define le_bswaps(p, size) *p = bswap ## size(*p); -#else -#define le_bswap(v, size) (v) -#define be_bswap(v, size) bswap ## size(v) -#define le_bswaps(v, size) -#define be_bswaps(p, size) *p = bswap ## size(*p); -#endif - -#define CPU_CONVERT(endian, size, type)\ -static inline type endian ## size ## _to_cpu(type v)\ -{\ - return endian ## _bswap(v, size);\ -}\ -\ -static inline type cpu_to_ ## endian ## size(type v)\ -{\ - return endian ## _bswap(v, size);\ -}\ -\ -static inline void endian ## size ## _to_cpus(type *p)\ -{\ - endian ## _bswaps(p, size)\ -}\ -\ -static inline void cpu_to_ ## endian ## size ## s(type *p)\ -{\ - endian ## _bswaps(p, size)\ -}\ -\ -static inline type endian ## size ## _to_cpup(const type *p)\ -{\ - return endian ## size ## _to_cpu(*p);\ -}\ -\ -static inline void cpu_to_ ## endian ## size ## w(type *p, type v)\ -{\ - *p = cpu_to_ ## endian ## size(v);\ -} - -CPU_CONVERT(be, 16, uint16_t) -CPU_CONVERT(be, 32, uint32_t) -CPU_CONVERT(be, 64, uint64_t) - -CPU_CONVERT(le, 16, uint16_t) -CPU_CONVERT(le, 32, uint32_t) -CPU_CONVERT(le, 64, uint64_t) - -/* unaligned versions (optimized for frequent unaligned accesses)*/ - -#if defined(__i386__) || defined(__powerpc__) - -#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 cpu_to_be16wu(p, v) cpu_to_be16w(p, v) -#define cpu_to_be32wu(p, v) cpu_to_be32w(p, v) - -#else - -static inline void cpu_to_le16wu(uint16_t *p, uint16_t v) -{ - uint8_t *p1 = (uint8_t *)p; - - p1[0] = v; - p1[1] = v >> 8; -} - -static inline void cpu_to_le32wu(uint32_t *p, uint32_t v) -{ - uint8_t *p1 = (uint8_t *)p; - - p1[0] = v; - p1[1] = v >> 8; - p1[2] = v >> 16; - p1[3] = v >> 24; -} - -static inline uint16_t le16_to_cpupu(const uint16_t *p) -{ - const uint8_t *p1 = (const uint8_t *)p; - return p1[0] | (p1[1] << 8); -} - -static inline uint32_t le32_to_cpupu(const uint32_t *p) -{ - const uint8_t *p1 = (const uint8_t *)p; - return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 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; -} - -static inline void cpu_to_be32wu(uint32_t *p, uint32_t v) -{ - uint8_t *p1 = (uint8_t *)p; - - p1[0] = v >> 24; - p1[1] = v >> 16; - p1[2] = v >> 8; - p1[3] = v; -} - -#endif - -#ifdef WORDS_BIGENDIAN -#define cpu_to_32wu cpu_to_be32wu -#else -#define cpu_to_32wu cpu_to_le32wu -#endif - -#undef le_bswap -#undef be_bswap -#undef le_bswaps -#undef be_bswaps - -#endif /* BSWAP_H */ diff --git a/src/minivhd_io.c b/src/minivhd_io.c index d05f5ab..1a0acfb 100644 --- a/src/minivhd_io.c +++ b/src/minivhd_io.c @@ -5,7 +5,6 @@ #include #include -#include "bswap.h" #include "minivhd_internal.h" #include "minivhd_util.h" @@ -88,7 +87,7 @@ static void mvhd_write_curr_sect_bitmap(MVHDMeta* vhdm) { */ static void mvhd_write_bat_entry(MVHDMeta* vhdm, int blk) { uint64_t table_offset = vhdm->sparse.bat_offset + (blk * sizeof *vhdm->block_offset); - uint32_t offset = cpu_to_be32(vhdm->block_offset[blk]); + uint32_t offset = mvhd_to_be32(vhdm->block_offset[blk]); fseeko64(vhdm->f, table_offset, SEEK_SET); fwrite(&offset, sizeof offset, 1, vhdm->f); } diff --git a/src/minivhd_manage.c b/src/minivhd_manage.c index 9569054..6c9429f 100644 --- a/src/minivhd_manage.c +++ b/src/minivhd_manage.c @@ -8,7 +8,6 @@ #include #include #include -#include "bswap.h" #include "cwalk.h" #include "libxml2_encoding.h" #include "minivhd_internal.h" @@ -104,7 +103,7 @@ static int mvhd_read_bat(MVHDMeta *vhdm, MVHDError* err) { fseeko64(vhdm->f, vhdm->sparse.bat_offset, SEEK_SET); for (uint32_t i = 0; i < vhdm->sparse.max_bat_ent; i++) { fread(&vhdm->block_offset[i], sizeof *vhdm->block_offset, 1, vhdm->f); - vhdm->block_offset[i] = be32_to_cpu(vhdm->block_offset[i]); + vhdm->block_offset[i] = mvhd_from_be32(vhdm->block_offset[i]); } return 0; } diff --git a/src/minivhd_struct_rw.c b/src/minivhd_struct_rw.c index e79f754..66f2289 100644 --- a/src/minivhd_struct_rw.c +++ b/src/minivhd_struct_rw.c @@ -8,7 +8,7 @@ #include #include #include -#include "bswap.h" +#include "minivhd_util.h" #include "minivhd_internal.h" /* Read data from footer into the struct members, swapping endian where necessary @@ -33,13 +33,13 @@ static void mvhd_next_buffer_to_struct(void* struct_memb, size_t memb_size, bool if (req_endian) { switch (memb_size) { case 2: - *(uint16_t*)(struct_memb) = be16_to_cpu(*(uint16_t*)(struct_memb)); + *(uint16_t*)(struct_memb) = mvhd_from_be16(*(uint16_t*)(struct_memb)); break; case 4: - *(uint32_t*)(struct_memb) = be32_to_cpu(*(uint32_t*)(struct_memb)); + *(uint32_t*)(struct_memb) = mvhd_from_be32(*(uint32_t*)(struct_memb)); break; case 8: - *(uint64_t*)(struct_memb) = be64_to_cpu(*(uint64_t*)(struct_memb)); + *(uint64_t*)(struct_memb) = mvhd_from_be64(*(uint64_t*)(struct_memb)); break; } } @@ -60,13 +60,13 @@ static void mvhd_next_struct_to_buffer(void* struct_memb, size_t memb_size, bool if (req_endian) { switch (memb_size) { case 2: - *((uint16_t*)buf_ptr) = cpu_to_be16(*(uint16_t*)(struct_memb)); + *((uint16_t*)buf_ptr) = mvhd_to_be16(*(uint16_t*)(struct_memb)); break; case 4: - *((uint32_t*)buf_ptr) = cpu_to_be32(*(uint32_t*)(struct_memb)); + *((uint32_t*)buf_ptr) = mvhd_to_be32(*(uint32_t*)(struct_memb)); break; case 8: - *((uint64_t*)buf_ptr) = cpu_to_be64(*(uint64_t*)(struct_memb)); + *((uint64_t*)buf_ptr) = mvhd_to_be64(*(uint64_t*)(struct_memb)); break; } } diff --git a/src/minivhd_util.c b/src/minivhd_util.c index 3ff80dc..b05c9f7 100644 --- a/src/minivhd_util.c +++ b/src/minivhd_util.c @@ -18,6 +18,65 @@ const char MVHD_CREATOR[] = "pcem"; const char MVHD_CREATOR_HOST_OS[] = "Wi2k"; const char MVHD_CXSPARSE_COOKIE[] = "cxsparse"; +uint16_t mvhd_from_be16(uint16_t val) { + uint8_t *tmp = (uint8_t*)&val; + uint16_t ret = 0; + ret |= (uint16_t)tmp[0] << 8; + ret |= (uint16_t)tmp[1] << 0; + return ret; +} +uint32_t mvhd_from_be32(uint32_t val) { + uint8_t *tmp = (uint8_t*)&val; + uint32_t ret = 0; + ret = (uint32_t)tmp[0] << 24; + ret |= (uint32_t)tmp[1] << 16; + ret |= (uint32_t)tmp[2] << 8; + ret |= (uint32_t)tmp[3] << 0; + return ret; +} +uint64_t mvhd_from_be64(uint64_t val) { + uint8_t *tmp = (uint8_t*)&val; + uint64_t ret = 0; + ret = (uint64_t)tmp[0] << 56; + ret |= (uint64_t)tmp[1] << 48; + ret |= (uint64_t)tmp[2] << 40; + ret |= (uint64_t)tmp[3] << 32; + ret |= (uint64_t)tmp[4] << 24; + ret |= (uint64_t)tmp[5] << 16; + ret |= (uint64_t)tmp[6] << 8; + ret |= (uint64_t)tmp[7] << 0; + return ret; +} +uint16_t mvhd_to_be16(uint16_t val) { + uint16_t ret = 0; + uint8_t *tmp = (uint8_t*)&ret; + tmp[0] = (val & 0xff00) >> 8; + tmp[1] = (val & 0x00ff) >> 0; + return ret; +} +uint32_t mvhd_to_be32(uint32_t val) { + uint32_t ret = 0; + uint8_t *tmp = (uint8_t*)&ret; + tmp[0] = (val & 0xff000000) >> 24; + tmp[1] = (val & 0x00ff0000) >> 16; + tmp[2] = (val & 0x0000ff00) >> 8; + tmp[3] = (val & 0x000000ff) >> 0; + return ret; +} +uint64_t mvhd_to_be64(uint64_t val) { + uint64_t ret = 0; + uint8_t *tmp = (uint8_t*)&ret; + tmp[0] = (val & 0xff00000000000000) >> 56; + tmp[1] = (val & 0x00ff000000000000) >> 48; + tmp[2] = (val & 0x0000ff0000000000) >> 40; + tmp[3] = (val & 0x000000ff00000000) >> 32; + tmp[4] = (val & 0x00000000ff000000) >> 24; + tmp[5] = (val & 0x0000000000ff0000) >> 16; + tmp[6] = (val & 0x000000000000ff00) >> 8; + tmp[7] = (val & 0x00000000000000ff) >> 0; + return ret; +} + bool mvhd_is_conectix_str(const void* buffer) { if (strncmp(buffer, MVHD_CONECTIX_COOKIE, strlen(MVHD_CONECTIX_COOKIE)) == 0) { return true; diff --git a/src/minivhd_util.h b/src/minivhd_util.h index 64f5174..62e172f 100644 --- a/src/minivhd_util.h +++ b/src/minivhd_util.h @@ -7,6 +7,16 @@ #include "minivhd.h" #define MVHD_START_TS 946684800 +/** + * Functions to deal with endian issues + */ +uint16_t mvhd_from_be16(uint16_t val); +uint32_t mvhd_from_be32(uint32_t val); +uint64_t mvhd_from_be64(uint64_t val); +uint16_t mvhd_to_be16(uint16_t val); +uint32_t mvhd_to_be32(uint32_t val); +uint64_t mvhd_to_be64(uint64_t val); + /** * \brief Check if provided buffer begins with the string "conectix" *