blob: 5a738652eb6ed1fe973ff4e19ae11d57309c8fd1 [file] [log] [blame]
Tadeusz Struk8203a372017-06-26 15:15:18 -07001/***********************************************************************;
2 * Copyright (c) 2015 - 2017, Intel Corporation
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26 * THE POSSIBILITY OF SUCH DAMAGE.
27 ***********************************************************************/
28
29#ifndef TSS2_ENDIAN_H
30#define TSS2_ENDIAN_H
31
32#if defined(__linux__) || defined(__unix__)
33#include <endian.h>
34
35#define HOST_TO_BE_16(value) htobe16(value)
36#define HOST_TO_BE_32(value) htobe32(value)
37#define HOST_TO_BE_64(value) htobe64(value)
38#define BE_TO_HOST_16(value) be16toh(value)
39#define BE_TO_HOST_32(value) be32toh(value)
40#define BE_TO_HOST_64(value) be64toh(value)
41
42#else /* linux || unix */
43
44#if defined(WORDS_BIGENDIAN)
45
46#define HOST_TO_BE_16(value) (value)
47#define HOST_TO_BE_32(value) (value)
48#define HOST_TO_BE_64(value) (value)
49#define BE_TO_HOST_16(value) (value)
50#define BE_TO_HOST_32(value) (value)
51#define BE_TO_HOST_64(value) (value)
52
53#else
54
55static inline uint16_t endian_conv_16(UINT16 value)
56{
57 return ((value & (0xff)) << 8) | \
58 ((value & (0xff << 8)) >> 8);
59}
60
61static inline uint32_t endian_conv_32(uint32_t value)
62{
63 return ((value & (0xff)) << 24) | \
64 ((value & (0xff << 8)) << 8) | \
65 ((value & (0xff << 16)) >> 8) | \
66 ((value & (0xff << 24)) >> 24);
67}
68
69static inline uint64_t endian_conv_64(uint64_t value)
70{
71 return ((value & (0xffULL)) << 56) | \
72 ((value & (0xffULL << 8)) << 40) | \
73 ((value & (0xffULL << 16)) << 24) | \
74 ((value & (0xffULL << 24)) << 8) | \
75 ((value & (0xffULL << 32)) >> 8) | \
76 ((value & (0xffULL << 40)) >> 24) | \
77 ((value & (0xffULL << 48)) >> 40) | \
78 ((value & (0xffULL << 56)) >> 56);
79}
80
81#define HOST_TO_BE_16(value) endian_conv_16(value)
82#define HOST_TO_BE_32(value) endian_conv_32(value)
83#define HOST_TO_BE_64(value) endian_conv_64(value)
84#define BE_TO_HOST_16(value) endian_conv_16(value)
85#define BE_TO_HOST_32(value) endian_conv_32(value)
86#define BE_TO_HOST_64(value) endian_conv_64(value)
87
88#endif /* WORDS_BIGENDIAN */
89#endif /* linux || unix */
90#endif /* TSS2_ENDIAN_H */