| 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 | * Francois-Rene Rideau <fare@tunes.org> 19970707 |
|---|
| 9 | * gathered all the good ideas from all asm-foo/byteorder.h into one file, |
|---|
| 10 | * cleaned them up. |
|---|
| 11 | * I hope it is compliant with non-GCC compilers. |
|---|
| 12 | * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h, |
|---|
| 13 | * because I wasn't sure it would be ok to put it in types.h |
|---|
| 14 | * Upgraded it to 2.1.43 |
|---|
| 15 | * Francois-Rene Rideau <fare@tunes.org> 19971012 |
|---|
| 16 | * Upgraded it to 2.1.57 |
|---|
| 17 | * to please Linus T., replaced huge #ifdef's between little/big endian |
|---|
| 18 | * by nestedly #include'd files. |
|---|
| 19 | * Francois-Rene Rideau <fare@tunes.org> 19971205 |
|---|
| 20 | * Made it to 2.1.71; now a facelift: |
|---|
| 21 | * Put files under include/linux/byteorder/ |
|---|
| 22 | * Split swab from generic support. |
|---|
| 23 | * |
|---|
| 24 | * TODO: |
|---|
| 25 | * = Regular kernel maintainers could also replace all these manual |
|---|
| 26 | * byteswap macros that remain, disseminated among drivers, |
|---|
| 27 | * after some grep or the sources... |
|---|
| 28 | * = Linus might want to rename all these macros and files to fit his taste, |
|---|
| 29 | * to fit his personal naming scheme. |
|---|
| 30 | * = it seems that a few drivers would also appreciate |
|---|
| 31 | * nybble swapping support... |
|---|
| 32 | * = every architecture could add their byteswap macro in asm/byteorder.h |
|---|
| 33 | * see how some architectures already do (i386, alpha, ppc, etc) |
|---|
| 34 | * = cpu_to_beXX and beXX_to_cpu might some day need to be well |
|---|
| 35 | * distinguished throughout the kernel. This is not the case currently, |
|---|
| 36 | * since little endian, big endian, and pdp endian machines needn't it. |
|---|
| 37 | * But this might be the case for, say, a port of Linux to 20/21 bit |
|---|
| 38 | * architectures (and F21 Linux addict around?). |
|---|
| 39 | */ |
|---|
| 40 | |
|---|
| 41 | /* |
|---|
| 42 | * The following macros are to be defined by <asm/byteorder.h>: |
|---|
| 43 | * |
|---|
| 44 | * Conversion of long and short int between network and host format |
|---|
| 45 | * ntohl(__u32 x) |
|---|
| 46 | * ntohs(__u16 x) |
|---|
| 47 | * htonl(__u32 x) |
|---|
| 48 | * htons(__u16 x) |
|---|
| 49 | * It seems that some programs (which? where? or perhaps a standard? POSIX?) |
|---|
| 50 | * might like the above to be functions, not macros (why?). |
|---|
| 51 | * if that's true, then detect them, and take measures. |
|---|
| 52 | * Anyway, the measure is: define only ___ntohl as a macro instead, |
|---|
| 53 | * and in a separate file, have |
|---|
| 54 | * unsigned long inline ntohl(x){return ___ntohl(x);} |
|---|
| 55 | * |
|---|
| 56 | * The same for constant arguments |
|---|
| 57 | * __constant_ntohl(__u32 x) |
|---|
| 58 | * __constant_ntohs(__u16 x) |
|---|
| 59 | * __constant_htonl(__u32 x) |
|---|
| 60 | * __constant_htons(__u16 x) |
|---|
| 61 | * |
|---|
| 62 | * Conversion of XX-bit integers (16- 32- or 64-) |
|---|
| 63 | * between native CPU format and little/big endian format |
|---|
| 64 | * 64-bit stuff only defined for proper architectures |
|---|
| 65 | * cpu_to_[bl]eXX(__uXX x) |
|---|
| 66 | * [bl]eXX_to_cpu(__uXX x) |
|---|
| 67 | * |
|---|
| 68 | * The same, but takes a pointer to the value to convert |
|---|
| 69 | * cpu_to_[bl]eXXp(__uXX x) |
|---|
| 70 | * [bl]eXX_to_cpup(__uXX x) |
|---|
| 71 | * |
|---|
| 72 | * The same, but change in situ |
|---|
| 73 | * cpu_to_[bl]eXXs(__uXX x) |
|---|
| 74 | * [bl]eXX_to_cpus(__uXX x) |
|---|
| 75 | * |
|---|
| 76 | * See asm-foo/byteorder.h for examples of how to provide |
|---|
| 77 | * architecture-optimized versions |
|---|
| 78 | * |
|---|
| 79 | */ |
|---|
| 80 | |
|---|
| 81 | #endif /* _LINUX_BYTEORDER_GENERIC_H */ |
|---|