#ifndef _I386_BYTEORDER_H #define _I386_BYTEORDER_H #undef ntohl #undef ntohs #undef htonl #undef htons #ifndef __LITTLE_ENDIAN #define __LITTLE_ENDIAN 1234 #endif #ifndef __LITTLE_ENDIAN_BITFIELD #define __LITTLE_ENDIAN_BITFIELD #endif /* For avoiding bswap on i386 */ #ifdef __KERNEL__ #include #endif extern unsigned long int ntohl(unsigned long int); extern unsigned short int ntohs(unsigned short int); extern unsigned long int htonl(unsigned long int); extern unsigned short int htons(unsigned short int); extern __inline__ unsigned long int __ntohl(unsigned long int); extern __inline__ unsigned short int __ntohs(unsigned short int); extern __inline__ unsigned long int __constant_ntohl(unsigned long int); extern __inline__ unsigned short int __constant_ntohs(unsigned short int); extern __inline__ unsigned long int __ntohl(unsigned long int x) { #if defined(__KERNEL__) && !defined(CONFIG_M386) __asm__("bswap %0" : "=r" (x) : "0" (x)); #else __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ "rorl $16,%0\n\t" /* swap words */ "xchgb %b0,%h0" /* swap higher bytes */ :"=q" (x) : "0" (x)); #endif return x; } #define __constant_ntohl(x) \ ((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \ (((unsigned long int)(x) & 0x0000ff00U) << 8) | \ (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \ (((unsigned long int)(x) & 0xff000000U) >> 24))) extern __inline__ unsigned short int __ntohs(unsigned short int x) { __asm__("xchgb %b0,%h0" /* swap bytes */ : "=q" (x) : "0" (x)); return x; } #define __constant_ntohs(x) \ ((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \ (((unsigned short int)(x) & 0xff00) >> 8))) \ #define __htonl(x) __ntohl(x) #define __htons(x) __ntohs(x) #define __constant_htonl(x) __constant_ntohl(x) #define __constant_htons(x) __constant_ntohs(x) #ifdef __OPTIMIZE__ # define ntohl(x) \ (__builtin_constant_p((long)(x)) ? \ __constant_ntohl((x)) : \ __ntohl((x))) # define ntohs(x) \ (__builtin_constant_p((short)(x)) ? \ __constant_ntohs((x)) : \ __ntohs((x))) # define htonl(x) \ (__builtin_constant_p((long)(x)) ? \ __constant_htonl((x)) : \ __htonl((x))) # define htons(x) \ (__builtin_constant_p((short)(x)) ? \ __constant_htons((x)) : \ __htons((x))) #endif #ifdef __KERNEL__ /* * In-kernel byte order macros to handle stuff like * byte-order-dependent filesystems etc. */ #define cpu_to_le32(x) (x) #define cpu_to_le16(x) (x) #define cpu_to_be32(x) htonl((x)) #define cpu_to_be16(x) htons((x)) /* The same, but returns converted value from the location pointer by addr. */ extern __inline__ __u16 cpu_to_le16p(__u16 *addr) { return cpu_to_le16(*addr); } extern __inline__ __u32 cpu_to_le32p(__u32 *addr) { return cpu_to_le32(*addr); } extern __inline__ __u16 cpu_to_be16p(__u16 *addr) { return cpu_to_be16(*addr); } extern __inline__ __u32 cpu_to_be32p(__u32 *addr) { return cpu_to_be32(*addr); } /* The same, but do the conversion in situ, ie. put the value back to addr. */ #define cpu_to_le16s(x) do { } while (0) #define cpu_to_le32s(x) do { } while (0) extern __inline__ void cpu_to_be16s(__u16 *addr) { *addr = cpu_to_be16(*addr); } extern __inline__ void cpu_to_be32s(__u32 *addr) { *addr = cpu_to_be32(*addr); } /* Convert from specified byte order, to CPU byte order. */ #define le16_to_cpu(x) cpu_to_le16(x) #define le32_to_cpu(x) cpu_to_le32(x) #define be16_to_cpu(x) cpu_to_be16(x) #define be32_to_cpu(x) cpu_to_be32(x) #define le16_to_cpup(x) cpu_to_le16p(x) #define le32_to_cpup(x) cpu_to_le32p(x) #define be16_to_cpup(x) cpu_to_be16p(x) #define be32_to_cpup(x) cpu_to_be32p(x) #define le16_to_cpus(x) cpu_to_le16s(x) #define le32_to_cpus(x) cpu_to_le32s(x) #define be16_to_cpus(x) cpu_to_be16s(x) #define be32_to_cpus(x) cpu_to_be32s(x) #endif /* __KERNEL__ */ #endif