Endian typedefs and #defines
[akaros.git] / kern / include / endian.h
1 /* Copyright (c) 2010 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Macros to convert to and from endian-data */
6
7 #ifndef ROS_KERN_ENDIAN_H
8 #define ROS_KERN_ENDIAN_H
9
10 #include <ros/common.h>
11 #include <arch/endian.h>
12
13 /* Endian-generic versions.  Let the compiler figure it out, plan 9-style */
14 #define l16get(p)       (((p)[1]<<8)|(p)[0])
15 #define l32get(p)       (((uint32_t)l16get(p+2)<<16)|l16get(p))
16 #define l64get(p)       (((uint64_t)l32get(p+4)<<32)|l32get(p))
17
18 #ifdef LITTLE_ENDIAN
19
20 #define __LITTLE_ENDIAN
21
22 #define cpu_to_le16(x) ((uint16_t)(x))
23 #define cpu_to_le32(x) ((uint32_t)(x))
24 #define cpu_to_le64(x) ((uint64_t)(x))
25 #define le16_to_cpu(x) ((uint16_t)(x))
26 #define le32_to_cpu(x) ((uint32_t)(x))
27 #define le64_to_cpu(x) ((uint64_t)(x))
28
29 #define cpu_to_be16(x) byte_swap16((x))
30 #define cpu_to_be32(x) byte_swap32((x))
31 #define cpu_to_be64(x) byte_swap64((x))
32 #define be16_to_cpu(x) byte_swap16((x))
33 #define be32_to_cpu(x) byte_swap32((x))
34 #define be64_to_cpu(x) byte_swap64((x))
35
36 #define PP_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
37 #define PP_NTOHS(x) PP_HTONS(x)
38 #define PP_HTONL(x) ((((x) & 0xff) << 24) | \
39                      (((x) & 0xff00) << 8) | \
40                      (((x) & 0xff0000UL) >> 8) | \
41                      (((x) & 0xff000000UL) >> 24))
42 #define PP_NTOHL(x) PP_HTONL(x)
43
44 #else /* big endian */
45
46 # ifndef BIG_ENDIAN
47 # error "Need an endianness defined"
48 # endif
49
50 #define __BIG_ENDIAN
51
52 #define cpu_to_le16(x) byte_swap16((x))
53 #define cpu_to_le32(x) byte_swap32((x))
54 #define cpu_to_le64(x) byte_swap64((x))
55 #define le16_to_cpu(x) byte_swap16((x))
56 #define le32_to_cpu(x) byte_swap32((x))
57 #define le64_to_cpu(x) byte_swap64((x))
58
59 #define cpu_to_be16(x) ((uint16_t)(x))
60 #define cpu_to_be32(x) ((uint32_t)(x))
61 #define cpu_to_be64(x) ((uint64_t)(x))
62 #define be16_to_cpu(x) ((uint16_t)(x))
63 #define be32_to_cpu(x) ((uint32_t)(x))
64 #define be64_to_cpu(x) ((uint64_t)(x))
65
66 #define PP_HTONS(x) (x)
67 #define PP_NTOHS(x) (x)
68 #define PP_HTONL(x) (x)
69 #define PP_NTOHL(x) (x)
70
71 #endif /* endian */
72
73 #endif /* ROS_KERN_ENDIAN_H */