Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
1: #ifndef _LINUX_BYTEORDER_GENERIC_H 2: #define _LINUX_BYTEORDER_GENERIC_H 3: 4: /* 5: * linux/byteorder_generic.h 6: * Generic Byte-reordering support 7: * 8: * The "... p" macros, like le64_to_cpup, can be used with pointers 9: * to unaligned data, but there will be a performance penalty on 10: * some architectures. Use get_unaligned for unaligned data. 11: * 12: * Francois-Rene Rideau <fare@tunes.org> 19970707 13: * gathered all the good ideas from all asm-foo/byteorder.h into one file, 14: * cleaned them up. 15: * I hope it is compliant with non-GCC compilers. 16: * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h, 17: * because I wasn't sure it would be ok to put it in types.h 18: * Upgraded it to 2.1.43 19: * Francois-Rene Rideau <fare@tunes.org> 19971012 20: * Upgraded it to 2.1.57 21: * to please Linus T., replaced huge #ifdef's between little/big endian 22: * by nestedly #include'd files. 23: * Francois-Rene Rideau <fare@tunes.org> 19971205 24: * Made it to 2.1.71; now a facelift: 25: * Put files under include/linux/byteorder/ 26: * Split swab from generic support. 27: * 28: * TODO: 29: * = Regular kernel maintainers could also replace all these manual 30: * byteswap macros that remain, disseminated among drivers, 31: * after some grep or the sources... 32: * = Linus might want to rename all these macros and files to fit his taste, 33: * to fit his personal naming scheme. 34: * = it seems that a few drivers would also appreciate 35: * nybble swapping support... 36: * = every architecture could add their byteswap macro in asm/byteorder.h 37: * see how some architectures already do (i386, alpha, ppc, etc) 38: * = cpu_to_beXX and beXX_to_cpu might some day need to be well 39: * distinguished throughout the kernel. This is not the case currently, 40: * since little endian, big endian, and pdp endian machines needn't it. 41: * But this might be the case for, say, a port of Linux to 20/21 bit 42: * architectures (and F21 Linux addict around?). 43: */ 44: 45: /* 46: * The following macros are to be defined by <asm/byteorder.h>: 47: * 48: * Conversion of long and short int between network and host format 49: * ntohl(__u32 x) 50: * ntohs(__u16 x) 51: * htonl(__u32 x) 52: * htons(__u16 x) 53: * It seems that some programs (which? where? or perhaps a standard? POSIX?) 54: * might like the above to be functions, not macros (why?). 55: * if that's true, then detect them, and take measures. 56: * Anyway, the measure is: define only ___ntohl as a macro instead, 57: * and in a separate file, have 58: * unsigned long inline ntohl(x){return ___ntohl(x);} 59: * 60: * The same for constant arguments 61: * __constant_ntohl(__u32 x) 62: * __constant_ntohs(__u16 x) 63: * __constant_htonl(__u32 x) 64: * __constant_htons(__u16 x) 65: * 66: * Conversion of XX-bit integers (16- 32- or 64-) 67: * between native CPU format and little/big endian format 68: * 64-bit stuff only defined for proper architectures 69: * cpu_to_[bl]eXX(__uXX x) 70: * [bl]eXX_to_cpu(__uXX x) 71: * 72: * The same, but takes a pointer to the value to convert 73: * cpu_to_[bl]eXXp(__uXX x) 74: * [bl]eXX_to_cpup(__uXX x) 75: * 76: * The same, but change in situ 77: * cpu_to_[bl]eXXs(__uXX x) 78: * [bl]eXX_to_cpus(__uXX x) 79: * 80: * See asm-foo/byteorder.h for examples of how to provide 81: * architecture-optimized versions 82: * 83: */ 84: 85: #define cpu_to_le64 __cpu_to_le64 86: #define le64_to_cpu __le64_to_cpu 87: #define cpu_to_le32 __cpu_to_le32 88: #define le32_to_cpu __le32_to_cpu 89: #define cpu_to_le16 __cpu_to_le16 90: #define le16_to_cpu __le16_to_cpu 91: #define cpu_to_be64 __cpu_to_be64 92: #define be64_to_cpu __be64_to_cpu 93: #define cpu_to_be32 __cpu_to_be32 94: #define be32_to_cpu __be32_to_cpu 95: #define cpu_to_be16 __cpu_to_be16 96: #define be16_to_cpu __be16_to_cpu 97: #define cpu_to_le64p __cpu_to_le64p 98: #define le64_to_cpup __le64_to_cpup 99: #define cpu_to_le32p __cpu_to_le32p 100: #define le32_to_cpup __le32_to_cpup 101: #define cpu_to_le16p __cpu_to_le16p 102: #define le16_to_cpup __le16_to_cpup 103: #define cpu_to_be64p __cpu_to_be64p 104: #define be64_to_cpup __be64_to_cpup 105: #define cpu_to_be32p __cpu_to_be32p 106: #define be32_to_cpup __be32_to_cpup 107: #define cpu_to_be16p __cpu_to_be16p 108: #define be16_to_cpup __be16_to_cpup 109: #define cpu_to_le64s __cpu_to_le64s 110: #define le64_to_cpus __le64_to_cpus 111: #define cpu_to_le32s __cpu_to_le32s 112: #define le32_to_cpus __le32_to_cpus 113: #define cpu_to_le16s __cpu_to_le16s 114: #define le16_to_cpus __le16_to_cpus 115: #define cpu_to_be64s __cpu_to_be64s 116: #define be64_to_cpus __be64_to_cpus 117: #define cpu_to_be32s __cpu_to_be32s 118: #define be32_to_cpus __be32_to_cpus 119: #define cpu_to_be16s __cpu_to_be16s 120: #define be16_to_cpus __be16_to_cpus 121: 122: /* 123: * They have to be macros in order to do the constant folding 124: * correctly - if the argument passed into a inline function 125: * it is no longer constant according to gcc.. 126: */ 127: 128: #undef ntohl 129: #undef ntohs 130: #undef htonl 131: #undef htons 132: 133: #define ___htonl(x) __cpu_to_be32(x) 134: #define ___htons(x) __cpu_to_be16(x) 135: #define ___ntohl(x) __be32_to_cpu(x) 136: #define ___ntohs(x) __be16_to_cpu(x) 137: 138: #define htonl(x) ___htonl(x) 139: #define ntohl(x) ___ntohl(x) 140: #define htons(x) ___htons(x) 141: #define ntohs(x) ___ntohs(x) 142: 143: static inline void le16_add_cpu(__le16 *var, u16 val) 144: { 145: *var = cpu_to_le16(le16_to_cpu(*var) + val); 146: } 147: 148: static inline void le32_add_cpu(__le32 *var, u32 val) 149: { 150: *var = cpu_to_le32(le32_to_cpu(*var) + val); 151: } 152: 153: static inline void le64_add_cpu(__le64 *var, u64 val) 154: { 155: *var = cpu_to_le64(le64_to_cpu(*var) + val); 156: } 157: 158: static inline void be16_add_cpu(__be16 *var, u16 val) 159: { 160: *var = cpu_to_be16(be16_to_cpu(*var) + val); 161: } 162: 163: static inline void be32_add_cpu(__be32 *var, u32 val) 164: { 165: *var = cpu_to_be32(be32_to_cpu(*var) + val); 166: } 167: 168: static inline void be64_add_cpu(__be64 *var, u64 val) 169: { 170: *var = cpu_to_be64(be64_to_cpu(*var) + val); 171: } 172: 173: #endif /* _LINUX_BYTEORDER_GENERIC_H */ 174: