1/* 2 * endians.h - Definitions related to handling of byte ordering. 3 * Originated from the Linux-NTFS project. 4 * 5 * Copyright (c) 2000-2005 Anton Altaparmakov 6 * 7 * This program/include file is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as published 9 * by the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program/include file is distributed in the hope that it will be 13 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program (in the main directory of the NTFS-3G 19 * distribution in the file COPYING); if not, write to the Free Software 20 * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 */ 22 23#ifndef _NTFS_ENDIANS_H 24#define _NTFS_ENDIANS_H 25 26#ifdef HAVE_CONFIG_H 27#include "config.h" 28#endif 29 30/* 31 * Notes: 32 * We define the conversion functions including typecasts since the 33 * defaults don't necessarily perform appropriate typecasts. 34 * Also, using our own functions means that we can change them if it 35 * turns out that we do need to use the unaligned access macros on 36 * architectures requiring aligned memory accesses... 37 */ 38 39#ifdef HAVE_ENDIAN_H 40#include <endian.h> 41#endif 42#ifdef HAVE_SYS_ENDIAN_H 43#include <sys/endian.h> 44#endif 45#ifdef HAVE_MACHINE_ENDIAN_H 46#include <machine/endian.h> 47#endif 48#ifdef HAVE_SYS_BYTEORDER_H 49#include <sys/byteorder.h> 50#endif 51#ifdef HAVE_SYS_PARAM_H 52#include <sys/param.h> 53#endif 54 55#ifndef __BYTE_ORDER 56# if defined(_BYTE_ORDER) 57# define __BYTE_ORDER _BYTE_ORDER 58# define __LITTLE_ENDIAN _LITTLE_ENDIAN 59# define __BIG_ENDIAN _BIG_ENDIAN 60# elif defined(BYTE_ORDER) 61# define __BYTE_ORDER BYTE_ORDER 62# define __LITTLE_ENDIAN LITTLE_ENDIAN 63# define __BIG_ENDIAN BIG_ENDIAN 64# elif defined(__BYTE_ORDER__) && defined(__LITTLE_ENDIAN__) && \ 65 defined(__BIG_ENDIAN__) 66# define __BYTE_ORDER __BYTE_ORDER__ 67# define __LITTLE_ENDIAN __LITTLE_ENDIAN__ 68# define __BIG_ENDIAN __BIG_ENDIAN__ 69# elif defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ 70 defined(__ORDER_BIG_ENDIAN__) 71# define __BYTE_ORDER __BYTE_ORDER__ 72# define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ 73# define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ 74# elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || \ 75 defined(WORDS_LITTLEENDIAN) 76# define __BYTE_ORDER 1 77# define __LITTLE_ENDIAN 1 78# define __BIG_ENDIAN 0 79# elif (!defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)) || \ 80 defined(WORDS_BIGENDIAN) 81# define __BYTE_ORDER 0 82# define __LITTLE_ENDIAN 1 83# define __BIG_ENDIAN 0 84# else 85# error "__BYTE_ORDER is not defined." 86# endif 87#endif 88 89#define __ntfs_bswap_constant_16(x) \ 90 (u16)((((u16)(x) & 0xff00) >> 8) | \ 91 (((u16)(x) & 0x00ff) << 8)) 92 93#define __ntfs_bswap_constant_32(x) \ 94 (u32)((((u32)(x) & 0xff000000u) >> 24) | \ 95 (((u32)(x) & 0x00ff0000u) >> 8) | \ 96 (((u32)(x) & 0x0000ff00u) << 8) | \ 97 (((u32)(x) & 0x000000ffu) << 24)) 98 99#define __ntfs_bswap_constant_64(x) \ 100 (u64)((((u64)(x) & 0xff00000000000000ull) >> 56) | \ 101 (((u64)(x) & 0x00ff000000000000ull) >> 40) | \ 102 (((u64)(x) & 0x0000ff0000000000ull) >> 24) | \ 103 (((u64)(x) & 0x000000ff00000000ull) >> 8) | \ 104 (((u64)(x) & 0x00000000ff000000ull) << 8) | \ 105 (((u64)(x) & 0x0000000000ff0000ull) << 24) | \ 106 (((u64)(x) & 0x000000000000ff00ull) << 40) | \ 107 (((u64)(x) & 0x00000000000000ffull) << 56)) 108 109#ifdef HAVE_BYTESWAP_H 110# include <byteswap.h> 111#else 112# define bswap_16(x) __ntfs_bswap_constant_16(x) 113# define bswap_32(x) __ntfs_bswap_constant_32(x) 114# define bswap_64(x) __ntfs_bswap_constant_64(x) 115#endif 116 117#if defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN) 118 119#define __le16_to_cpu(x) (x) 120#define __le32_to_cpu(x) (x) 121#define __le64_to_cpu(x) (x) 122 123#define __cpu_to_le16(x) (x) 124#define __cpu_to_le32(x) (x) 125#define __cpu_to_le64(x) (x) 126 127#define __constant_le16_to_cpu(x) (x) 128#define __constant_le32_to_cpu(x) (x) 129#define __constant_le64_to_cpu(x) (x) 130 131#define __constant_cpu_to_le16(x) (x) 132#define __constant_cpu_to_le32(x) (x) 133#define __constant_cpu_to_le64(x) (x) 134 135#define __be16_to_cpu(x) bswap_16(x) 136#define __be32_to_cpu(x) bswap_32(x) 137#define __be64_to_cpu(x) bswap_64(x) 138 139#define __cpu_to_be16(x) bswap_16(x) 140#define __cpu_to_be32(x) bswap_32(x) 141#define __cpu_to_be64(x) bswap_64(x) 142 143#define __constant_be16_to_cpu(x) __ntfs_bswap_constant_16((u16)(x)) 144#define __constant_be32_to_cpu(x) __ntfs_bswap_constant_32((u32)(x)) 145#define __constant_be64_to_cpu(x) __ntfs_bswap_constant_64((u64)(x)) 146 147#define __constant_cpu_to_be16(x) __ntfs_bswap_constant_16((u16)(x)) 148#define __constant_cpu_to_be32(x) __ntfs_bswap_constant_32((u32)(x)) 149#define __constant_cpu_to_be64(x) __ntfs_bswap_constant_64((u64)(x)) 150 151#elif defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN) 152 153#define __le16_to_cpu(x) bswap_16(x) 154#define __le32_to_cpu(x) bswap_32(x) 155#define __le64_to_cpu(x) bswap_64(x) 156 157#define __cpu_to_le16(x) bswap_16(x) 158#define __cpu_to_le32(x) bswap_32(x) 159#define __cpu_to_le64(x) bswap_64(x) 160 161#define __constant_le16_to_cpu(x) __ntfs_bswap_constant_16((u16)(x)) 162#define __constant_le32_to_cpu(x) __ntfs_bswap_constant_32((u32)(x)) 163#define __constant_le64_to_cpu(x) __ntfs_bswap_constant_64((u64)(x)) 164 165#define __constant_cpu_to_le16(x) __ntfs_bswap_constant_16((u16)(x)) 166#define __constant_cpu_to_le32(x) __ntfs_bswap_constant_32((u32)(x)) 167#define __constant_cpu_to_le64(x) __ntfs_bswap_constant_64((u64)(x)) 168 169#define __be16_to_cpu(x) (x) 170#define __be32_to_cpu(x) (x) 171#define __be64_to_cpu(x) (x) 172 173#define __cpu_to_be16(x) (x) 174#define __cpu_to_be32(x) (x) 175#define __cpu_to_be64(x) (x) 176 177#define __constant_be16_to_cpu(x) (x) 178#define __constant_be32_to_cpu(x) (x) 179#define __constant_be64_to_cpu(x) (x) 180 181#define __constant_cpu_to_be16(x) (x) 182#define __constant_cpu_to_be32(x) (x) 183#define __constant_cpu_to_be64(x) (x) 184 185#else 186 187#error "You must define __BYTE_ORDER to be __LITTLE_ENDIAN or __BIG_ENDIAN." 188 189#endif 190 191/* Unsigned from LE to CPU conversion. */ 192 193#define le16_to_cpu(x) (u16)__le16_to_cpu((u16)(x)) 194#define le32_to_cpu(x) (u32)__le32_to_cpu((u32)(x)) 195#define le64_to_cpu(x) (u64)__le64_to_cpu((u64)(x)) 196 197#define le16_to_cpup(x) (u16)__le16_to_cpu(*(const u16*)(x)) 198#define le32_to_cpup(x) (u32)__le32_to_cpu(*(const u32*)(x)) 199#define le64_to_cpup(x) (u64)__le64_to_cpu(*(const u64*)(x)) 200 201/* Signed from LE to CPU conversion. */ 202 203#define sle16_to_cpu(x) (s16)__le16_to_cpu((s16)(x)) 204#define sle32_to_cpu(x) (s32)__le32_to_cpu((s32)(x)) 205#define sle64_to_cpu(x) (s64)__le64_to_cpu((s64)(x)) 206 207#define sle16_to_cpup(x) (s16)__le16_to_cpu(*(s16*)(x)) 208#define sle32_to_cpup(x) (s32)__le32_to_cpu(*(s32*)(x)) 209#define sle64_to_cpup(x) (s64)__le64_to_cpu(*(s64*)(x)) 210 211/* Unsigned from CPU to LE conversion. */ 212 213#define cpu_to_le16(x) (u16)__cpu_to_le16((u16)(x)) 214#define cpu_to_le32(x) (u32)__cpu_to_le32((u32)(x)) 215#define cpu_to_le64(x) (u64)__cpu_to_le64((u64)(x)) 216 217#define cpu_to_le16p(x) (u16)__cpu_to_le16(*(u16*)(x)) 218#define cpu_to_le32p(x) (u32)__cpu_to_le32(*(u32*)(x)) 219#define cpu_to_le64p(x) (u64)__cpu_to_le64(*(u64*)(x)) 220 221/* Signed from CPU to LE conversion. */ 222 223#define cpu_to_sle16(x) (s16)__cpu_to_le16((s16)(x)) 224#define cpu_to_sle32(x) (s32)__cpu_to_le32((s32)(x)) 225#define cpu_to_sle64(x) (s64)__cpu_to_le64((s64)(x)) 226 227#define cpu_to_sle16p(x) (s16)__cpu_to_le16(*(s16*)(x)) 228#define cpu_to_sle32p(x) (s32)__cpu_to_le32(*(s32*)(x)) 229#define cpu_to_sle64p(x) (s64)__cpu_to_le64(*(s64*)(x)) 230 231/* Unsigned from BE to CPU conversion. */ 232 233#define be16_to_cpu(x) (u16)__be16_to_cpu((u16)(x)) 234#define be32_to_cpu(x) (u32)__be32_to_cpu((u32)(x)) 235#define be64_to_cpu(x) (u64)__be64_to_cpu((u64)(x)) 236 237#define be16_to_cpup(x) (u16)__be16_to_cpu(*(const u16*)(x)) 238#define be32_to_cpup(x) (u32)__be32_to_cpu(*(const u32*)(x)) 239#define be64_to_cpup(x) (u64)__be64_to_cpu(*(const u64*)(x)) 240 241/* Signed from BE to CPU conversion. */ 242 243#define sbe16_to_cpu(x) (s16)__be16_to_cpu((s16)(x)) 244#define sbe32_to_cpu(x) (s32)__be32_to_cpu((s32)(x)) 245#define sbe64_to_cpu(x) (s64)__be64_to_cpu((s64)(x)) 246 247#define sbe16_to_cpup(x) (s16)__be16_to_cpu(*(s16*)(x)) 248#define sbe32_to_cpup(x) (s32)__be32_to_cpu(*(s32*)(x)) 249#define sbe64_to_cpup(x) (s64)__be64_to_cpu(*(s64*)(x)) 250 251/* Unsigned from CPU to BE conversion. */ 252 253#define cpu_to_be16(x) (u16)__cpu_to_be16((u16)(x)) 254#define cpu_to_be32(x) (u32)__cpu_to_be32((u32)(x)) 255#define cpu_to_be64(x) (u64)__cpu_to_be64((u64)(x)) 256 257#define cpu_to_be16p(x) (u16)__cpu_to_be16(*(u16*)(x)) 258#define cpu_to_be32p(x) (u32)__cpu_to_be32(*(u32*)(x)) 259#define cpu_to_be64p(x) (u64)__cpu_to_be64(*(u64*)(x)) 260 261/* Signed from CPU to BE conversion. */ 262 263#define cpu_to_sbe16(x) (s16)__cpu_to_be16((s16)(x)) 264#define cpu_to_sbe32(x) (s32)__cpu_to_be32((s32)(x)) 265#define cpu_to_sbe64(x) (s64)__cpu_to_be64((s64)(x)) 266 267#define cpu_to_sbe16p(x) (s16)__cpu_to_be16(*(s16*)(x)) 268#define cpu_to_sbe32p(x) (s32)__cpu_to_be32(*(s32*)(x)) 269#define cpu_to_sbe64p(x) (s64)__cpu_to_be64(*(s64*)(x)) 270 271/* Constant endianness conversion defines. */ 272 273#define const_le16_to_cpu(x) ((u16) __constant_le16_to_cpu(x)) 274#define const_le32_to_cpu(x) ((u32) __constant_le32_to_cpu(x)) 275#define const_le64_to_cpu(x) ((u64) __constant_le64_to_cpu(x)) 276 277#define const_cpu_to_le16(x) ((le16) __constant_cpu_to_le16(x)) 278#define const_cpu_to_le32(x) ((le32) __constant_cpu_to_le32(x)) 279#define const_cpu_to_le64(x) ((le64) __constant_cpu_to_le64(x)) 280 281#define const_sle16_to_cpu(x) ((s16) __constant_le16_to_cpu((le16) x)) 282#define const_sle32_to_cpu(x) ((s32) __constant_le32_to_cpu((le32) x)) 283#define const_sle64_to_cpu(x) ((s64) __constant_le64_to_cpu((le64) x)) 284 285#define const_cpu_to_sle16(x) ((sle16) __constant_cpu_to_le16((u16) x)) 286#define const_cpu_to_sle32(x) ((sle32) __constant_cpu_to_le32((u32) x)) 287#define const_cpu_to_sle64(x) ((sle64) __constant_cpu_to_le64((u64) x)) 288 289#define const_be16_to_cpu(x) ((u16) __constant_be16_to_cpu(x))) 290#define const_be32_to_cpu(x) ((u32) __constant_be32_to_cpu(x))) 291#define const_be64_to_cpu(x) ((u64) __constant_be64_to_cpu(x))) 292 293#define const_cpu_to_be16(x) ((be16) __constant_cpu_to_be16(x)) 294#define const_cpu_to_be32(x) ((be32) __constant_cpu_to_be32(x)) 295#define const_cpu_to_be64(x) ((be64) __constant_cpu_to_be64(x)) 296 297#define const_sbe16_to_cpu(x) ((s16) __constant_be16_to_cpu((be16) x)) 298#define const_sbe32_to_cpu(x) ((s32) __constant_be32_to_cpu((be32) x)) 299#define const_sbe64_to_cpu(x) ((s64) __constant_be64_to_cpu((be64) x)) 300 301#define const_cpu_to_sbe16(x) ((sbe16) __constant_cpu_to_be16((u16) x)) 302#define const_cpu_to_sbe32(x) ((sbe32) __constant_cpu_to_be32((u32) x)) 303#define const_cpu_to_sbe64(x) ((sbe64) __constant_cpu_to_be64((u64) x)) 304 305#endif /* defined _NTFS_ENDIANS_H */ 306