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