Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / include / lwk / byteorder / generic.h
1 #ifndef _LWK_BYTEORDER_GENERIC_H
2 #define _LWK_BYTEORDER_GENERIC_H
3
4 /*
5  * lwk/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
86 #if defined(__KERNEL__)
87 /*
88  * inside the kernel, we can use nicknames;
89  * outside of it, we must avoid POSIX namespace pollution...
90  */
91 #define cpu_to_le64 __cpu_to_le64
92 #define le64_to_cpu __le64_to_cpu
93 #define cpu_to_le32 __cpu_to_le32
94 #define le32_to_cpu __le32_to_cpu
95 #define cpu_to_le16 __cpu_to_le16
96 #define le16_to_cpu __le16_to_cpu
97 #define cpu_to_be64 __cpu_to_be64
98 #define be64_to_cpu __be64_to_cpu
99 #define cpu_to_be32 __cpu_to_be32
100 #define be32_to_cpu __be32_to_cpu
101 #define cpu_to_be16 __cpu_to_be16
102 #define be16_to_cpu __be16_to_cpu
103 #define cpu_to_le64p __cpu_to_le64p
104 #define le64_to_cpup __le64_to_cpup
105 #define cpu_to_le32p __cpu_to_le32p
106 #define le32_to_cpup __le32_to_cpup
107 #define cpu_to_le16p __cpu_to_le16p
108 #define le16_to_cpup __le16_to_cpup
109 #define cpu_to_be64p __cpu_to_be64p
110 #define be64_to_cpup __be64_to_cpup
111 #define cpu_to_be32p __cpu_to_be32p
112 #define be32_to_cpup __be32_to_cpup
113 #define cpu_to_be16p __cpu_to_be16p
114 #define be16_to_cpup __be16_to_cpup
115 #define cpu_to_le64s __cpu_to_le64s
116 #define le64_to_cpus __le64_to_cpus
117 #define cpu_to_le32s __cpu_to_le32s
118 #define le32_to_cpus __le32_to_cpus
119 #define cpu_to_le16s __cpu_to_le16s
120 #define le16_to_cpus __le16_to_cpus
121 #define cpu_to_be64s __cpu_to_be64s
122 #define be64_to_cpus __be64_to_cpus
123 #define cpu_to_be32s __cpu_to_be32s
124 #define be32_to_cpus __be32_to_cpus
125 #define cpu_to_be16s __cpu_to_be16s
126 #define be16_to_cpus __be16_to_cpus
127 #endif
128
129
130 #if defined(__KERNEL__)
131 /*
132  * Handle ntohl and suches. These have various compatibility
133  * issues - like we want to give the prototype even though we
134  * also have a macro for them in case some strange program
135  * wants to take the address of the thing or something..
136  *
137  * Note that these used to return a "long" in libc5, even though
138  * long is often 64-bit these days.. Thus the casts.
139  *
140  * They have to be macros in order to do the constant folding
141  * correctly - if the argument passed into a inline function
142  * it is no longer constant according to gcc..
143  */
144
145 #undef ntohl
146 #undef ntohs
147 #undef htonl
148 #undef htons
149
150 /*
151  * Do the prototypes. Somebody might want to take the
152  * address or some such sick thing..
153  */
154 extern __u32                    ntohl(__be32);
155 extern __be32                   htonl(__u32);
156 extern __u16                    ntohs(__be16);
157 extern __be16                   htons(__u16);
158
159 #if defined(__GNUC__) && defined(__OPTIMIZE__)
160
161 #define ___htonl(x) __cpu_to_be32(x)
162 #define ___htons(x) __cpu_to_be16(x)
163 #define ___ntohl(x) __be32_to_cpu(x)
164 #define ___ntohs(x) __be16_to_cpu(x)
165
166 #define htonl(x) ___htonl(x)
167 #define ntohl(x) ___ntohl(x)
168 #define htons(x) ___htons(x)
169 #define ntohs(x) ___ntohs(x)
170
171 #endif /* OPTIMIZE */
172
173 #endif /* KERNEL */
174
175
176 #endif /* _LWK_BYTEORDER_GENERIC_H */