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