diff --git a/arch/x86_64/include/socks/machine/cpu.h b/arch/x86_64/include/socks/machine/cpu.h index 77799a0..abeb97b 100644 --- a/arch/x86_64/include/socks/machine/cpu.h +++ b/arch/x86_64/include/socks/machine/cpu.h @@ -8,6 +8,8 @@ extern "C" { #endif +#define ML_BIG_ENDIAN 0 + #define ml_cpu_block_get_id(p) ((p)->c_cpu_id) #define ml_cpu_block_get_data(p) ((p)->c_data) diff --git a/include/socks/util.h b/include/socks/util.h index 8d4ae20..3a0e268 100644 --- a/include/socks/util.h +++ b/include/socks/util.h @@ -26,6 +26,33 @@ static inline unsigned long long absdiff64(unsigned long long x, unsigned long l return x > y ? y - x : x - y; } +extern int16_t host_to_big_i16(int16_t v); +extern int16_t host_to_little_i16(int16_t v); +extern int16_t big_to_host_i16(int16_t v); +extern int16_t little_to_host_i16(int16_t v); +extern uint16_t host_to_big_u16(uint16_t v); +extern uint16_t host_to_little_u16(uint16_t v); +extern uint16_t big_to_host_u16(uint16_t v); +extern uint16_t little_to_host_u16(uint16_t v); + +extern int32_t host_to_big_i32(int32_t v); +extern int32_t host_to_little_i32(int32_t v); +extern int32_t big_to_host_i32(int32_t v); +extern int32_t little_to_host_i32(int32_t v); +extern uint32_t host_to_big_u32(uint32_t v); +extern uint32_t host_to_little_u32(uint32_t v); +extern uint32_t big_to_host_u32(uint32_t v); +extern uint32_t little_to_host_u32(uint32_t v); + +extern int64_t host_to_big_i64(int64_t v); +extern int64_t host_to_little_i64(int64_t v); +extern int64_t big_to_host_i64(int64_t v); +extern int64_t little_to_host_i64(int64_t v); +extern uint64_t host_to_big_u64(uint64_t v); +extern uint64_t host_to_little_u64(uint64_t v); +extern uint64_t big_to_host_u64(uint64_t v); +extern uint64_t little_to_host_u64(uint64_t v); + #ifdef __cplusplus } #endif diff --git a/util/endian.c b/util/endian.c new file mode 100644 index 0000000..c8bf139 --- /dev/null +++ b/util/endian.c @@ -0,0 +1,280 @@ +#include +#include + +static uint16_t swap_uint16( uint16_t val ) +{ + return (val << 8) | (val >> 8 ); +} + +static int16_t swap_int16( int16_t val ) +{ + return (val << 8) | ((val >> 8) & 0xFF); +} + +static uint32_t swap_uint32( uint32_t val ) +{ + val = ((val << 8) & 0xFF00FF00 ) | ((val >> 8) & 0xFF00FF ); + return (val << 16) | (val >> 16); +} + +static int32_t swap_int32( int32_t val ) +{ + val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF ); + return (val << 16) | ((val >> 16) & 0xFFFF); +} + +int64_t swap_int64( int64_t val ) +{ + val = ((val << 8) & 0xFF00FF00FF00FF00ULL ) | ((val >> 8) & 0x00FF00FF00FF00FFULL ); + val = ((val << 16) & 0xFFFF0000FFFF0000ULL ) | ((val >> 16) & 0x0000FFFF0000FFFFULL ); + return (val << 32) | ((val >> 32) & 0xFFFFFFFFULL); +} + +uint64_t swap_uint64( uint64_t val ) +{ + val = ((val << 8) & 0xFF00FF00FF00FF00ULL ) | ((val >> 8) & 0x00FF00FF00FF00FFULL ); + val = ((val << 16) & 0xFFFF0000FFFF0000ULL ) | ((val >> 16) & 0x0000FFFF0000FFFFULL ); + return (val << 32) | (val >> 32); +} + +#if defined(ML_BIG_ENDIAN) && ML_BIG_ENDIAN==1 +int16_t host_to_big_i16(int16_t v) +{ + return v; +} + +int16_t host_to_little_i16(int16_t v) +{ + return swap_int16(v); +} + +int16_t big_to_host_i16(int16_t v) +{ + return v; +} + +int16_t little_to_host_i16(int16_t v) +{ + return swap_int16(v); +} + +uint16_t host_to_big_u16(uint16_t v) +{ + return v; +} + +uint16_t host_to_little_u16(uint16_t v) +{ + return swap_uint16(v); +} + +uint16_t big_to_host_u16(uint16_t v) +{ + return v; +} + +uint16_t little_to_host_u16(uint16_t v) +{ + return swap_uint16(v); +} + +int32_t host_to_big_i32(int32_t v) +{ + return v; +} + +int32_t host_to_little_i32(int32_t v) +{ + return swap_int32(v); +} + +int32_t big_to_host_i32(int32_t v) +{ + return v; +} + +int32_t little_to_host_i32(int32_t v) +{ + return swap_int32(v); +} + +uint32_t host_to_big_u32(uint32_t v) +{ + return v; +} + +uint32_t host_to_little_u32(uint32_t v) +{ + return swap_uint32(v); +} + +uint32_t big_to_host_u32(uint32_t v) +{ + return v; +} + +uint32_t little_to_host_u32(uint32_t v) +{ + return swap_uint32(v); +} + +int64_t host_to_big_i64(int64_t v) +{ + return v; +} + +int64_t host_to_little_i64(int64_t v) +{ + return swap_int64(v); +} + +int64_t big_to_host_i64(int64_t v) +{ + return v; +} + +int64_t little_to_host_i64(int64_t v) +{ + return swap_int64(v); +} + +uint64_t host_to_big_u64(uint64_t v) +{ + return v; +} + +uint64_t host_to_little_u64(uint64_t v) +{ + return swap_uint64(v); +} + +uint64_t big_to_host_u64(uint64_t v) +{ + return v; +} + +uint64_t little_to_host_u64(uint64_t v) +{ + return swap_uint64(v); +} +#else +int16_t host_to_big_i16(int16_t v) +{ + return swap_int16(v); +} + +int16_t host_to_little_i16(int16_t v) +{ + return v; +} + +int16_t big_to_host_i16(int16_t v) +{ + return swap_int16(v); +} + +int16_t little_to_host_i16(int16_t v) +{ + return v; +} + +uint16_t host_to_big_u16(uint16_t v) +{ + return swap_uint16(v); +} + +uint16_t host_to_little_u16(uint16_t v) +{ + return v; +} + +uint16_t big_to_host_u16(uint16_t v) +{ + return swap_uint16(v); +} + +uint16_t little_to_host_u16(uint16_t v) +{ + return v; +} + +int32_t host_to_big_i32(int32_t v) +{ + return swap_int32(v); +} + +int32_t host_to_little_i32(int32_t v) +{ + return v; +} + +int32_t big_to_host_i32(int32_t v) +{ + return swap_int32(v); +} + +int32_t little_to_host_i32(int32_t v) +{ + return v; +} + +uint32_t host_to_big_u32(uint32_t v) +{ + return swap_uint32(v); +} + +uint32_t host_to_little_u32(uint32_t v) +{ + return v; +} + +uint32_t big_to_host_u32(uint32_t v) +{ + return swap_uint32(v); +} + +uint32_t little_to_host_u32(uint32_t v) +{ + return v; +} + +int64_t host_to_big_i64(int64_t v) +{ + return swap_int64(v); +} + +int64_t host_to_little_i64(int64_t v) +{ + return v; +} + +int64_t big_to_host_i64(int64_t v) +{ + return swap_int64(v); +} + +int64_t little_to_host_i64(int64_t v) +{ + return v; +} + +uint64_t host_to_big_u64(uint64_t v) +{ + return swap_uint64(v); +} + +uint64_t host_to_little_u64(uint64_t v) +{ + return v; +} + +uint64_t big_to_host_u64(uint64_t v) +{ + return swap_uint64(v); +} + +uint64_t little_to_host_u64(uint64_t v) +{ + return v; +} +#endif