1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun #ifndef _UAPI_LINUX_SWAB_H 3*4882a593Smuzhiyun #define _UAPI_LINUX_SWAB_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/types.h> 6*4882a593Smuzhiyun #include <linux/compiler.h> 7*4882a593Smuzhiyun #include <asm/bitsperlong.h> 8*4882a593Smuzhiyun #include <asm/swab.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* 11*4882a593Smuzhiyun * casts are necessary for constants, because we never know how for sure 12*4882a593Smuzhiyun * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #define ___constant_swab16(x) ((__u16)( \ 15*4882a593Smuzhiyun (((__u16)(x) & (__u16)0x00ffU) << 8) | \ 16*4882a593Smuzhiyun (((__u16)(x) & (__u16)0xff00U) >> 8))) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define ___constant_swab32(x) ((__u32)( \ 19*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ 20*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \ 21*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \ 22*4882a593Smuzhiyun (((__u32)(x) & (__u32)0xff000000UL) >> 24))) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define ___constant_swab64(x) ((__u64)( \ 25*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \ 26*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \ 27*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \ 28*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x00000000ff000000ULL) << 8) | \ 29*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x000000ff00000000ULL) >> 8) | \ 30*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ 31*4882a593Smuzhiyun (((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \ 32*4882a593Smuzhiyun (((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56))) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define ___constant_swahw32(x) ((__u32)( \ 35*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ 36*4882a593Smuzhiyun (((__u32)(x) & (__u32)0xffff0000UL) >> 16))) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define ___constant_swahb32(x) ((__u32)( \ 39*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ 40*4882a593Smuzhiyun (((__u32)(x) & (__u32)0xff00ff00UL) >> 8))) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* 43*4882a593Smuzhiyun * Implement the following as inlines, but define the interface using 44*4882a593Smuzhiyun * macros to allow constant folding when possible: 45*4882a593Smuzhiyun * ___swab16, ___swab32, ___swab64, ___swahw32, ___swahb32 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun __fswab16(__u16 val)48*4882a593Smuzhiyunstatic inline __attribute_const__ __u16 __fswab16(__u16 val) 49*4882a593Smuzhiyun { 50*4882a593Smuzhiyun #if defined (__arch_swab16) 51*4882a593Smuzhiyun return __arch_swab16(val); 52*4882a593Smuzhiyun #else 53*4882a593Smuzhiyun return ___constant_swab16(val); 54*4882a593Smuzhiyun #endif 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun __fswab32(__u32 val)57*4882a593Smuzhiyunstatic inline __attribute_const__ __u32 __fswab32(__u32 val) 58*4882a593Smuzhiyun { 59*4882a593Smuzhiyun #if defined(__arch_swab32) 60*4882a593Smuzhiyun return __arch_swab32(val); 61*4882a593Smuzhiyun #else 62*4882a593Smuzhiyun return ___constant_swab32(val); 63*4882a593Smuzhiyun #endif 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun __fswab64(__u64 val)66*4882a593Smuzhiyunstatic inline __attribute_const__ __u64 __fswab64(__u64 val) 67*4882a593Smuzhiyun { 68*4882a593Smuzhiyun #if defined (__arch_swab64) 69*4882a593Smuzhiyun return __arch_swab64(val); 70*4882a593Smuzhiyun #elif defined(__SWAB_64_THRU_32__) 71*4882a593Smuzhiyun __u32 h = val >> 32; 72*4882a593Smuzhiyun __u32 l = val & ((1ULL << 32) - 1); 73*4882a593Smuzhiyun return (((__u64)__fswab32(l)) << 32) | ((__u64)(__fswab32(h))); 74*4882a593Smuzhiyun #else 75*4882a593Smuzhiyun return ___constant_swab64(val); 76*4882a593Smuzhiyun #endif 77*4882a593Smuzhiyun } 78*4882a593Smuzhiyun __fswahw32(__u32 val)79*4882a593Smuzhiyunstatic inline __attribute_const__ __u32 __fswahw32(__u32 val) 80*4882a593Smuzhiyun { 81*4882a593Smuzhiyun #ifdef __arch_swahw32 82*4882a593Smuzhiyun return __arch_swahw32(val); 83*4882a593Smuzhiyun #else 84*4882a593Smuzhiyun return ___constant_swahw32(val); 85*4882a593Smuzhiyun #endif 86*4882a593Smuzhiyun } 87*4882a593Smuzhiyun __fswahb32(__u32 val)88*4882a593Smuzhiyunstatic inline __attribute_const__ __u32 __fswahb32(__u32 val) 89*4882a593Smuzhiyun { 90*4882a593Smuzhiyun #ifdef __arch_swahb32 91*4882a593Smuzhiyun return __arch_swahb32(val); 92*4882a593Smuzhiyun #else 93*4882a593Smuzhiyun return ___constant_swahb32(val); 94*4882a593Smuzhiyun #endif 95*4882a593Smuzhiyun } 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /** 98*4882a593Smuzhiyun * __swab16 - return a byteswapped 16-bit value 99*4882a593Smuzhiyun * @x: value to byteswap 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun #ifdef __HAVE_BUILTIN_BSWAP16__ 102*4882a593Smuzhiyun #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) 103*4882a593Smuzhiyun #else 104*4882a593Smuzhiyun #define __swab16(x) \ 105*4882a593Smuzhiyun (__builtin_constant_p((__u16)(x)) ? \ 106*4882a593Smuzhiyun ___constant_swab16(x) : \ 107*4882a593Smuzhiyun __fswab16(x)) 108*4882a593Smuzhiyun #endif 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /** 111*4882a593Smuzhiyun * __swab32 - return a byteswapped 32-bit value 112*4882a593Smuzhiyun * @x: value to byteswap 113*4882a593Smuzhiyun */ 114*4882a593Smuzhiyun #ifdef __HAVE_BUILTIN_BSWAP32__ 115*4882a593Smuzhiyun #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x)) 116*4882a593Smuzhiyun #else 117*4882a593Smuzhiyun #define __swab32(x) \ 118*4882a593Smuzhiyun (__builtin_constant_p((__u32)(x)) ? \ 119*4882a593Smuzhiyun ___constant_swab32(x) : \ 120*4882a593Smuzhiyun __fswab32(x)) 121*4882a593Smuzhiyun #endif 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /** 124*4882a593Smuzhiyun * __swab64 - return a byteswapped 64-bit value 125*4882a593Smuzhiyun * @x: value to byteswap 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun #ifdef __HAVE_BUILTIN_BSWAP64__ 128*4882a593Smuzhiyun #define __swab64(x) (__u64)__builtin_bswap64((__u64)(x)) 129*4882a593Smuzhiyun #else 130*4882a593Smuzhiyun #define __swab64(x) \ 131*4882a593Smuzhiyun (__builtin_constant_p((__u64)(x)) ? \ 132*4882a593Smuzhiyun ___constant_swab64(x) : \ 133*4882a593Smuzhiyun __fswab64(x)) 134*4882a593Smuzhiyun #endif 135*4882a593Smuzhiyun __swab(const unsigned long y)136*4882a593Smuzhiyunstatic __always_inline unsigned long __swab(const unsigned long y) 137*4882a593Smuzhiyun { 138*4882a593Smuzhiyun #if __BITS_PER_LONG == 64 139*4882a593Smuzhiyun return __swab64(y); 140*4882a593Smuzhiyun #else /* __BITS_PER_LONG == 32 */ 141*4882a593Smuzhiyun return __swab32(y); 142*4882a593Smuzhiyun #endif 143*4882a593Smuzhiyun } 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /** 146*4882a593Smuzhiyun * __swahw32 - return a word-swapped 32-bit value 147*4882a593Smuzhiyun * @x: value to wordswap 148*4882a593Smuzhiyun * 149*4882a593Smuzhiyun * __swahw32(0x12340000) is 0x00001234 150*4882a593Smuzhiyun */ 151*4882a593Smuzhiyun #define __swahw32(x) \ 152*4882a593Smuzhiyun (__builtin_constant_p((__u32)(x)) ? \ 153*4882a593Smuzhiyun ___constant_swahw32(x) : \ 154*4882a593Smuzhiyun __fswahw32(x)) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /** 157*4882a593Smuzhiyun * __swahb32 - return a high and low byte-swapped 32-bit value 158*4882a593Smuzhiyun * @x: value to byteswap 159*4882a593Smuzhiyun * 160*4882a593Smuzhiyun * __swahb32(0x12345678) is 0x34127856 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun #define __swahb32(x) \ 163*4882a593Smuzhiyun (__builtin_constant_p((__u32)(x)) ? \ 164*4882a593Smuzhiyun ___constant_swahb32(x) : \ 165*4882a593Smuzhiyun __fswahb32(x)) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /** 168*4882a593Smuzhiyun * __swab16p - return a byteswapped 16-bit value from a pointer 169*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 16-bit value 170*4882a593Smuzhiyun */ __swab16p(const __u16 * p)171*4882a593Smuzhiyunstatic __always_inline __u16 __swab16p(const __u16 *p) 172*4882a593Smuzhiyun { 173*4882a593Smuzhiyun #ifdef __arch_swab16p 174*4882a593Smuzhiyun return __arch_swab16p(p); 175*4882a593Smuzhiyun #else 176*4882a593Smuzhiyun return __swab16(*p); 177*4882a593Smuzhiyun #endif 178*4882a593Smuzhiyun } 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /** 181*4882a593Smuzhiyun * __swab32p - return a byteswapped 32-bit value from a pointer 182*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 32-bit value 183*4882a593Smuzhiyun */ __swab32p(const __u32 * p)184*4882a593Smuzhiyunstatic __always_inline __u32 __swab32p(const __u32 *p) 185*4882a593Smuzhiyun { 186*4882a593Smuzhiyun #ifdef __arch_swab32p 187*4882a593Smuzhiyun return __arch_swab32p(p); 188*4882a593Smuzhiyun #else 189*4882a593Smuzhiyun return __swab32(*p); 190*4882a593Smuzhiyun #endif 191*4882a593Smuzhiyun } 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /** 194*4882a593Smuzhiyun * __swab64p - return a byteswapped 64-bit value from a pointer 195*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 64-bit value 196*4882a593Smuzhiyun */ __swab64p(const __u64 * p)197*4882a593Smuzhiyunstatic __always_inline __u64 __swab64p(const __u64 *p) 198*4882a593Smuzhiyun { 199*4882a593Smuzhiyun #ifdef __arch_swab64p 200*4882a593Smuzhiyun return __arch_swab64p(p); 201*4882a593Smuzhiyun #else 202*4882a593Smuzhiyun return __swab64(*p); 203*4882a593Smuzhiyun #endif 204*4882a593Smuzhiyun } 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /** 207*4882a593Smuzhiyun * __swahw32p - return a wordswapped 32-bit value from a pointer 208*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 32-bit value 209*4882a593Smuzhiyun * 210*4882a593Smuzhiyun * See __swahw32() for details of wordswapping. 211*4882a593Smuzhiyun */ __swahw32p(const __u32 * p)212*4882a593Smuzhiyunstatic inline __u32 __swahw32p(const __u32 *p) 213*4882a593Smuzhiyun { 214*4882a593Smuzhiyun #ifdef __arch_swahw32p 215*4882a593Smuzhiyun return __arch_swahw32p(p); 216*4882a593Smuzhiyun #else 217*4882a593Smuzhiyun return __swahw32(*p); 218*4882a593Smuzhiyun #endif 219*4882a593Smuzhiyun } 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /** 222*4882a593Smuzhiyun * __swahb32p - return a high and low byteswapped 32-bit value from a pointer 223*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 32-bit value 224*4882a593Smuzhiyun * 225*4882a593Smuzhiyun * See __swahb32() for details of high/low byteswapping. 226*4882a593Smuzhiyun */ __swahb32p(const __u32 * p)227*4882a593Smuzhiyunstatic inline __u32 __swahb32p(const __u32 *p) 228*4882a593Smuzhiyun { 229*4882a593Smuzhiyun #ifdef __arch_swahb32p 230*4882a593Smuzhiyun return __arch_swahb32p(p); 231*4882a593Smuzhiyun #else 232*4882a593Smuzhiyun return __swahb32(*p); 233*4882a593Smuzhiyun #endif 234*4882a593Smuzhiyun } 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun /** 237*4882a593Smuzhiyun * __swab16s - byteswap a 16-bit value in-place 238*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 16-bit value 239*4882a593Smuzhiyun */ __swab16s(__u16 * p)240*4882a593Smuzhiyunstatic inline void __swab16s(__u16 *p) 241*4882a593Smuzhiyun { 242*4882a593Smuzhiyun #ifdef __arch_swab16s 243*4882a593Smuzhiyun __arch_swab16s(p); 244*4882a593Smuzhiyun #else 245*4882a593Smuzhiyun *p = __swab16p(p); 246*4882a593Smuzhiyun #endif 247*4882a593Smuzhiyun } 248*4882a593Smuzhiyun /** 249*4882a593Smuzhiyun * __swab32s - byteswap a 32-bit value in-place 250*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 32-bit value 251*4882a593Smuzhiyun */ __swab32s(__u32 * p)252*4882a593Smuzhiyunstatic __always_inline void __swab32s(__u32 *p) 253*4882a593Smuzhiyun { 254*4882a593Smuzhiyun #ifdef __arch_swab32s 255*4882a593Smuzhiyun __arch_swab32s(p); 256*4882a593Smuzhiyun #else 257*4882a593Smuzhiyun *p = __swab32p(p); 258*4882a593Smuzhiyun #endif 259*4882a593Smuzhiyun } 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /** 262*4882a593Smuzhiyun * __swab64s - byteswap a 64-bit value in-place 263*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 64-bit value 264*4882a593Smuzhiyun */ __swab64s(__u64 * p)265*4882a593Smuzhiyunstatic __always_inline void __swab64s(__u64 *p) 266*4882a593Smuzhiyun { 267*4882a593Smuzhiyun #ifdef __arch_swab64s 268*4882a593Smuzhiyun __arch_swab64s(p); 269*4882a593Smuzhiyun #else 270*4882a593Smuzhiyun *p = __swab64p(p); 271*4882a593Smuzhiyun #endif 272*4882a593Smuzhiyun } 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /** 275*4882a593Smuzhiyun * __swahw32s - wordswap a 32-bit value in-place 276*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 32-bit value 277*4882a593Smuzhiyun * 278*4882a593Smuzhiyun * See __swahw32() for details of wordswapping 279*4882a593Smuzhiyun */ __swahw32s(__u32 * p)280*4882a593Smuzhiyunstatic inline void __swahw32s(__u32 *p) 281*4882a593Smuzhiyun { 282*4882a593Smuzhiyun #ifdef __arch_swahw32s 283*4882a593Smuzhiyun __arch_swahw32s(p); 284*4882a593Smuzhiyun #else 285*4882a593Smuzhiyun *p = __swahw32p(p); 286*4882a593Smuzhiyun #endif 287*4882a593Smuzhiyun } 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /** 290*4882a593Smuzhiyun * __swahb32s - high and low byteswap a 32-bit value in-place 291*4882a593Smuzhiyun * @p: pointer to a naturally-aligned 32-bit value 292*4882a593Smuzhiyun * 293*4882a593Smuzhiyun * See __swahb32() for details of high and low byte swapping 294*4882a593Smuzhiyun */ __swahb32s(__u32 * p)295*4882a593Smuzhiyunstatic inline void __swahb32s(__u32 *p) 296*4882a593Smuzhiyun { 297*4882a593Smuzhiyun #ifdef __arch_swahb32s 298*4882a593Smuzhiyun __arch_swahb32s(p); 299*4882a593Smuzhiyun #else 300*4882a593Smuzhiyun *p = __swahb32p(p); 301*4882a593Smuzhiyun #endif 302*4882a593Smuzhiyun } 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #endif /* _UAPI_LINUX_SWAB_H */ 306