1 /* $OpenBSD: endian.h,v 1.25 2014/12/21 04:49:00 guenther Exp $ */ 2 3 /*- 4 * Copyright (c) 1997 Niklas Hallqvist. 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 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 /* 28 * Public definitions for little- and big-endian systems. 29 * This file should be included as <endian.h> in userspace and as 30 * <sys/endian.h> in the kernel. 31 * 32 * System headers that need endian information but that can't or don't 33 * want to export the public names here should include <sys/_endian.h> 34 * and use the internal names: _BYTE_ORDER, _*_ENDIAN, etc. 35 */ 36 37 #ifndef _SYS_ENDIAN_H_ 38 #define _SYS_ENDIAN_H_ 39 40 #include <sys/cdefs.h> 41 #include <sys/_endian.h> 42 43 /* Public names */ 44 #define LITTLE_ENDIAN _LITTLE_ENDIAN 45 #define BIG_ENDIAN _BIG_ENDIAN 46 #define PDP_ENDIAN _PDP_ENDIAN 47 #define BYTE_ORDER _BYTE_ORDER 48 49 50 /* 51 * These are specified to be function-like macros to match the spec 52 */ 53 #define htobe16(x) __htobe16(x) 54 #define htobe32(x) __htobe32(x) 55 #define htobe64(x) __htobe64(x) 56 #define htole16(x) __htole16(x) 57 #define htole32(x) __htole32(x) 58 #define htole64(x) __htole64(x) 59 60 /* POSIX names */ 61 #define be16toh(x) __htobe16(x) 62 #define be32toh(x) __htobe32(x) 63 #define be64toh(x) __htobe64(x) 64 #define le16toh(x) __htole16(x) 65 #define le32toh(x) __htole32(x) 66 #define le64toh(x) __htole64(x) 67 68 69 #if __BSD_VISIBLE 70 #define swap16(x) __swap16(x) 71 #define swap32(x) __swap32(x) 72 #define swap64(x) __swap64(x) 73 74 #define swap16_multi(v, n) do { \ 75 __size_t __swap16_multi_n = (n); \ 76 __uint16_t *__swap16_multi_v = (v); \ 77 \ 78 while (__swap16_multi_n) { \ 79 *__swap16_multi_v = swap16(*__swap16_multi_v); \ 80 __swap16_multi_v++; \ 81 __swap16_multi_n--; \ 82 } \ 83 } while (0) 84 85 /* original BSD names */ 86 #define betoh16(x) __htobe16(x) 87 #define betoh32(x) __htobe32(x) 88 #define betoh64(x) __htobe64(x) 89 #define letoh16(x) __htole16(x) 90 #define letoh32(x) __htole32(x) 91 #define letoh64(x) __htole64(x) 92 93 #ifndef htons 94 /* these were exposed here before */ 95 #define htons(x) __htobe16(x) 96 #define htonl(x) __htobe32(x) 97 #define ntohs(x) __htobe16(x) 98 #define ntohl(x) __htobe32(x) 99 #endif 100 101 /* ancient stuff */ 102 #define NTOHL(x) (x) = ntohl((u_int32_t)(x)) 103 #define NTOHS(x) (x) = ntohs((u_int16_t)(x)) 104 #define HTONL(x) (x) = htonl((u_int32_t)(x)) 105 #define HTONS(x) (x) = htons((u_int16_t)(x)) 106 #endif /* __BSD_VISIBLE */ 107 108 #ifdef _KERNEL 109 /* to/from memory conversions */ 110 #define bemtoh16 __bemtoh16 111 #define bemtoh32 __bemtoh32 112 #define bemtoh64 __bemtoh64 113 #define htobem16 __htobem16 114 #define htobem32 __htobem32 115 #define htobem64 __htobem64 116 #define lemtoh16 __lemtoh16 117 #define lemtoh32 __lemtoh32 118 #define lemtoh64 __lemtoh64 119 #define htolem16 __htolem16 120 #define htolem32 __htolem32 121 #define htolem64 __htolem64 122 #endif /* _KERNEL */ 123 124 #endif /* _SYS_ENDIAN_H_ */ 125