1 /* 2 * Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC. 3 * Copyright (C) 2007 The Regents of the University of California. 4 * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). 5 * Written by Brian Behlendorf <behlendorf1@llnl.gov>. 6 * UCRL-CODE-235197 7 * 8 * This file is part of the SPL, Solaris Porting Layer. 9 * For details, see <http://zfsonlinux.org/>. 10 * 11 * The SPL is free software; you can redistribute it and/or modify it 12 * under the terms of the GNU General Public License as published by the 13 * Free Software Foundation; either version 2 of the License, or (at your 14 * option) any later version. 15 * 16 * The SPL is distributed in the hope that it will be useful, but WITHOUT 17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 19 * for more details. 20 * 21 * You should have received a copy of the GNU General Public License along 22 * with the SPL. If not, see <http://www.gnu.org/licenses/>. 23 */ 24 25 #ifndef _SPL_BYTEORDER_H 26 #define _SPL_BYTEORDER_H 27 28 #include <asm/byteorder.h> 29 30 #if defined(__BIG_ENDIAN) && !defined(_ZFS_BIG_ENDIAN) 31 #define _ZFS_BIG_ENDIAN 32 #endif 33 34 #if defined(__LITTLE_ENDIAN) && !defined(_ZFS_LITTLE_ENDIAN) 35 #define _ZFS_LITTLE_ENDIAN 36 #endif 37 38 #include <sys/isa_defs.h> 39 40 #define BSWAP_8(x) ((x) & 0xff) 41 #define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8)) 42 #define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16)) 43 #define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32)) 44 45 #define LE_16(x) cpu_to_le16(x) 46 #define LE_32(x) cpu_to_le32(x) 47 #define LE_64(x) cpu_to_le64(x) 48 #define BE_16(x) cpu_to_be16(x) 49 #define BE_32(x) cpu_to_be32(x) 50 #define BE_64(x) cpu_to_be64(x) 51 52 #define BE_IN8(xa) \ 53 *((uint8_t *)(xa)) 54 55 #define BE_IN16(xa) \ 56 (((uint16_t)BE_IN8(xa) << 8) | BE_IN8((uint8_t *)(xa)+1)) 57 58 #define BE_IN32(xa) \ 59 (((uint32_t)BE_IN16(xa) << 16) | BE_IN16((uint8_t *)(xa)+2)) 60 61 #ifdef _ZFS_BIG_ENDIAN 62 static __inline__ uint64_t 63 htonll(uint64_t n) 64 { 65 return (n); 66 } 67 68 static __inline__ uint64_t 69 ntohll(uint64_t n) 70 { 71 return (n); 72 } 73 #else 74 static __inline__ uint64_t 75 htonll(uint64_t n) 76 { 77 return ((((uint64_t)htonl(n)) << 32) + htonl(n >> 32)); 78 } 79 80 static __inline__ uint64_t 81 ntohll(uint64_t n) 82 { 83 return ((((uint64_t)ntohl(n)) << 32) + ntohl(n >> 32)); 84 } 85 #endif 86 87 #endif /* SPL_BYTEORDER_H */ 88