Branch data Line data Source code
1 : : /*- 2 : : * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 : : * 4 : : * Copyright (c) 2002 Thomas Moestl <tmm@FreeBSD.org> 5 : : * All rights reserved. 6 : : * 7 : : * Redistribution and use in source and binary forms, with or without 8 : : * modification, are permitted provided that the following conditions 9 : : * are met: 10 : : * 1. Redistributions of source code must retain the above copyright 11 : : * notice, this list of conditions and the following disclaimer. 12 : : * 2. Redistributions in binary form must reproduce the above copyright 13 : : * notice, this list of conditions and the following disclaimer in the 14 : : * documentation and/or other materials provided with the distribution. 15 : : * 16 : : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 : : * 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 AUTHOR OR CONTRIBUTORS BE LIABLE 20 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 : : * SUCH DAMAGE. 27 : : * 28 : : * $FreeBSD$ 29 : : */ 30 : : 31 : : #ifndef _SYS_ENDIAN_H_ 32 : : #define _SYS_ENDIAN_H_ 33 : : 34 : : #include <sys/cdefs.h> 35 : : #include <sys/_types.h> 36 : : #include <machine/endian.h> 37 : : 38 : : #ifndef _UINT8_T_DECLARED 39 : : typedef __uint8_t uint8_t; 40 : : #define _UINT8_T_DECLARED 41 : : #endif 42 : : 43 : : #ifndef _UINT16_T_DECLARED 44 : : typedef __uint16_t uint16_t; 45 : : #define _UINT16_T_DECLARED 46 : : #endif 47 : : 48 : : #ifndef _UINT32_T_DECLARED 49 : : typedef __uint32_t uint32_t; 50 : : #define _UINT32_T_DECLARED 51 : : #endif 52 : : 53 : : #ifndef _UINT64_T_DECLARED 54 : : typedef __uint64_t uint64_t; 55 : : #define _UINT64_T_DECLARED 56 : : #endif 57 : : 58 : : /* 59 : : * General byte order swapping functions. 60 : : */ 61 : : #define bswap16(x) __bswap16(x) 62 : : #define bswap32(x) __bswap32(x) 63 : : #define bswap64(x) __bswap64(x) 64 : : 65 : : /* 66 : : * Host to big endian, host to little endian, big endian to host, and little 67 : : * endian to host byte order functions as detailed in byteorder(9). 68 : : */ 69 : : #if _BYTE_ORDER == _LITTLE_ENDIAN 70 : : #define htobe16(x) __bswap16((x)) 71 : : #define htobe32(x) __bswap32((x)) 72 : : #define htobe64(x) __bswap64((x)) 73 : : #define htole16(x) ((uint16_t)(x)) 74 : : #define htole32(x) ((uint32_t)(x)) 75 : : #define htole64(x) ((uint64_t)(x)) 76 : : 77 : : #define be16toh(x) __bswap16((x)) 78 : : #define be32toh(x) __bswap32((x)) 79 : : #define be64toh(x) __bswap64((x)) 80 : : #define le16toh(x) ((uint16_t)(x)) 81 : : #define le32toh(x) ((uint32_t)(x)) 82 : : #define le64toh(x) ((uint64_t)(x)) 83 : : #else /* _BYTE_ORDER != _LITTLE_ENDIAN */ 84 : : #define htobe16(x) ((uint16_t)(x)) 85 : : #define htobe32(x) ((uint32_t)(x)) 86 : : #define htobe64(x) ((uint64_t)(x)) 87 : : #define htole16(x) __bswap16((x)) 88 : : #define htole32(x) __bswap32((x)) 89 : : #define htole64(x) __bswap64((x)) 90 : : 91 : : #define be16toh(x) ((uint16_t)(x)) 92 : : #define be32toh(x) ((uint32_t)(x)) 93 : : #define be64toh(x) ((uint64_t)(x)) 94 : : #define le16toh(x) __bswap16((x)) 95 : : #define le32toh(x) __bswap32((x)) 96 : : #define le64toh(x) __bswap64((x)) 97 : : #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ 98 : : 99 : : /* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ 100 : : 101 : : static __inline uint16_t 102 : : be16dec(const void *pp) 103 : : { 104 : : uint8_t const *p = (uint8_t const *)pp; 105 : : 106 : : return ((p[0] << 8) | p[1]); 107 : : } 108 : : 109 : : static __inline uint32_t 110 : 0 : be32dec(const void *pp) 111 : : { 112 : 0 : uint8_t const *p = (uint8_t const *)pp; 113 : : 114 : 0 : return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 115 : : } 116 : : 117 : : static __inline uint64_t 118 : : be64dec(const void *pp) 119 : : { 120 : : uint8_t const *p = (uint8_t const *)pp; 121 : : 122 : : return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4)); 123 : : } 124 : : 125 : : static __inline uint16_t 126 : : le16dec(const void *pp) 127 : : { 128 : : uint8_t const *p = (uint8_t const *)pp; 129 : : 130 : : return ((p[1] << 8) | p[0]); 131 : : } 132 : : 133 : : static __inline uint32_t 134 : 6994 : le32dec(const void *pp) 135 : : { 136 : 6994 : uint8_t const *p = (uint8_t const *)pp; 137 : : 138 : 6994 : return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); 139 : : } 140 : : 141 : : static __inline uint64_t 142 : : le64dec(const void *pp) 143 : : { 144 : : uint8_t const *p = (uint8_t const *)pp; 145 : : 146 : : return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p)); 147 : : } 148 : : 149 : : static __inline void 150 : : be16enc(void *pp, uint16_t u) 151 : : { 152 : : uint8_t *p = (uint8_t *)pp; 153 : : 154 : : p[0] = (u >> 8) & 0xff; 155 : : p[1] = u & 0xff; 156 : : } 157 : : 158 : : static __inline void 159 : : be32enc(void *pp, uint32_t u) 160 : : { 161 : : uint8_t *p = (uint8_t *)pp; 162 : : 163 : : p[0] = (u >> 24) & 0xff; 164 : : p[1] = (u >> 16) & 0xff; 165 : : p[2] = (u >> 8) & 0xff; 166 : : p[3] = u & 0xff; 167 : : } 168 : : 169 : : static __inline void 170 : : be64enc(void *pp, uint64_t u) 171 : : { 172 : : uint8_t *p = (uint8_t *)pp; 173 : : 174 : : be32enc(p, (uint32_t)(u >> 32)); 175 : : be32enc(p + 4, (uint32_t)(u & 0xffffffffU)); 176 : : } 177 : : 178 : : static __inline void 179 : : le16enc(void *pp, uint16_t u) 180 : : { 181 : : uint8_t *p = (uint8_t *)pp; 182 : : 183 : : p[0] = u & 0xff; 184 : : p[1] = (u >> 8) & 0xff; 185 : : } 186 : : 187 : : static __inline void 188 : : le32enc(void *pp, uint32_t u) 189 : : { 190 : : uint8_t *p = (uint8_t *)pp; 191 : : 192 : : p[0] = u & 0xff; 193 : : p[1] = (u >> 8) & 0xff; 194 : : p[2] = (u >> 16) & 0xff; 195 : : p[3] = (u >> 24) & 0xff; 196 : : } 197 : : 198 : : static __inline void 199 : : le64enc(void *pp, uint64_t u) 200 : : { 201 : : uint8_t *p = (uint8_t *)pp; 202 : : 203 : : le32enc(p, (uint32_t)(u & 0xffffffffU)); 204 : : le32enc(p + 4, (uint32_t)(u >> 32)); 205 : : } 206 : : 207 : : #endif /* _SYS_ENDIAN_H_ */