1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /***********************************************************************; 3 * Copyright (c) 2015 - 2017, Intel Corporation 4 * 5 * All rights reserved. 6 ***********************************************************************/ 7 8 #ifndef TSS2_ENDIAN_H 9 #define TSS2_ENDIAN_H 10 11 #if defined(__linux__) || defined(__unix__) 12 #if defined(__FreeBSD__) 13 #include <sys/endian.h> 14 #else 15 #include <endian.h> 16 #endif 17 18 #define HOST_TO_BE_16(value) htobe16(value) 19 #define HOST_TO_BE_32(value) htobe32(value) 20 #define HOST_TO_BE_64(value) htobe64(value) 21 #define BE_TO_HOST_16(value) be16toh(value) 22 #define BE_TO_HOST_32(value) be32toh(value) 23 #define BE_TO_HOST_64(value) be64toh(value) 24 25 #else /* linux || unix */ 26 27 #if defined(WORDS_BIGENDIAN) 28 29 #define HOST_TO_BE_16(value) (value) 30 #define HOST_TO_BE_32(value) (value) 31 #define HOST_TO_BE_64(value) (value) 32 #define BE_TO_HOST_16(value) (value) 33 #define BE_TO_HOST_32(value) (value) 34 #define BE_TO_HOST_64(value) (value) 35 36 #else 37 #include <stdint.h> 38 endian_conv_16(uint16_t value)39static inline uint16_t endian_conv_16(uint16_t value) 40 { 41 return ((value & (0xff)) << 8) | \ 42 ((value & (0xff << 8)) >> 8); 43 } 44 endian_conv_32(uint32_t value)45static inline uint32_t endian_conv_32(uint32_t value) 46 { 47 return ((value & (0xff)) << 24) | \ 48 ((value & (0xff << 8)) << 8) | \ 49 ((value & (0xff << 16)) >> 8) | \ 50 ((value & (0xff << 24)) >> 24); 51 } 52 endian_conv_64(uint64_t value)53static inline uint64_t endian_conv_64(uint64_t value) 54 { 55 return ((value & (0xffULL)) << 56) | \ 56 ((value & (0xffULL << 8)) << 40) | \ 57 ((value & (0xffULL << 16)) << 24) | \ 58 ((value & (0xffULL << 24)) << 8) | \ 59 ((value & (0xffULL << 32)) >> 8) | \ 60 ((value & (0xffULL << 40)) >> 24) | \ 61 ((value & (0xffULL << 48)) >> 40) | \ 62 ((value & (0xffULL << 56)) >> 56); 63 } 64 65 #define HOST_TO_BE_16(value) endian_conv_16(value) 66 #define HOST_TO_BE_32(value) endian_conv_32(value) 67 #define HOST_TO_BE_64(value) endian_conv_64(value) 68 #define BE_TO_HOST_16(value) endian_conv_16(value) 69 #define BE_TO_HOST_32(value) endian_conv_32(value) 70 #define BE_TO_HOST_64(value) endian_conv_64(value) 71 72 #endif /* WORDS_BIGENDIAN */ 73 #endif /* linux || unix */ 74 #endif /* TSS2_ENDIAN_H */ 75