File: /Users/paulross/dev/linux/linux-3.13/include/linux/byteorder/generic.h

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: