Subversion Repositories Kolibri OS

Rev

Rev 6934 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6082 serge 1
#ifndef _UAPI_LINUX_SWAB_H
2
#define _UAPI_LINUX_SWAB_H
3
 
4
#include 
5
#include 
6
#include 
7
 
8
/*
9
 * casts are necessary for constants, because we never know how for sure
10
 * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way.
11
 */
12
#define ___constant_swab16(x) ((__u16)(				\
13
	(((__u16)(x) & (__u16)0x00ffU) << 8) |			\
14
	(((__u16)(x) & (__u16)0xff00U) >> 8)))
15
 
16
#define ___constant_swab32(x) ((__u32)(				\
17
	(((__u32)(x) & (__u32)0x000000ffUL) << 24) |		\
18
	(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |		\
19
	(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |		\
20
	(((__u32)(x) & (__u32)0xff000000UL) >> 24)))
21
 
22
#define ___constant_swab64(x) ((__u64)(				\
23
	(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) |	\
24
	(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) |	\
25
	(((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) |	\
26
	(((__u64)(x) & (__u64)0x00000000ff000000ULL) <<  8) |	\
27
	(((__u64)(x) & (__u64)0x000000ff00000000ULL) >>  8) |	\
28
	(((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) |	\
29
	(((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) |	\
30
	(((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56)))
31
 
32
#define ___constant_swahw32(x) ((__u32)(			\
33
	(((__u32)(x) & (__u32)0x0000ffffUL) << 16) |		\
34
	(((__u32)(x) & (__u32)0xffff0000UL) >> 16)))
35
 
36
#define ___constant_swahb32(x) ((__u32)(			\
37
	(((__u32)(x) & (__u32)0x00ff00ffUL) << 8) |		\
38
	(((__u32)(x) & (__u32)0xff00ff00UL) >> 8)))
39
 
40
/*
41
 * Implement the following as inlines, but define the interface using
42
 * macros to allow constant folding when possible:
43
 * ___swab16, ___swab32, ___swab64, ___swahw32, ___swahb32
44
 */
45
 
46
static inline __attribute_const__ __u16 __fswab16(__u16 val)
47
{
48
#ifdef __HAVE_BUILTIN_BSWAP16__
49
	return __builtin_bswap16(val);
50
#elif defined (__arch_swab16)
51
	return __arch_swab16(val);
52
#else
53
	return ___constant_swab16(val);
54
#endif
55
}
56
 
57
static inline __attribute_const__ __u32 __fswab32(__u32 val)
58
{
59
#ifdef __HAVE_BUILTIN_BSWAP32__
60
	return __builtin_bswap32(val);
61
#elif defined(__arch_swab32)
62
	return __arch_swab32(val);
63
#else
64
	return ___constant_swab32(val);
65
#endif
66
}
67
 
68
static inline __attribute_const__ __u64 __fswab64(__u64 val)
69
{
70
#ifdef __HAVE_BUILTIN_BSWAP64__
71
	return __builtin_bswap64(val);
72
#elif defined (__arch_swab64)
73
	return __arch_swab64(val);
74
#elif defined(__SWAB_64_THRU_32__)
75
	__u32 h = val >> 32;
76
	__u32 l = val & ((1ULL << 32) - 1);
77
	return (((__u64)__fswab32(l)) << 32) | ((__u64)(__fswab32(h)));
78
#else
79
	return ___constant_swab64(val);
80
#endif
81
}
82
 
83
static inline __attribute_const__ __u32 __fswahw32(__u32 val)
84
{
85
#ifdef __arch_swahw32
86
	return __arch_swahw32(val);
87
#else
88
	return ___constant_swahw32(val);
89
#endif
90
}
91
 
92
static inline __attribute_const__ __u32 __fswahb32(__u32 val)
93
{
94
#ifdef __arch_swahb32
95
	return __arch_swahb32(val);
96
#else
97
	return ___constant_swahb32(val);
98
#endif
99
}
100
 
101
/**
102
 * __swab16 - return a byteswapped 16-bit value
103
 * @x: value to byteswap
104
 */
105
#define __swab16(x)				\
106
	(__builtin_constant_p((__u16)(x)) ?	\
107
	___constant_swab16(x) :			\
108
	__fswab16(x))
109
 
110
/**
111
 * __swab32 - return a byteswapped 32-bit value
112
 * @x: value to byteswap
113
 */
114
#define __swab32(x)				\
115
	(__builtin_constant_p((__u32)(x)) ?	\
116
	___constant_swab32(x) :			\
117
	__fswab32(x))
118
 
119
/**
120
 * __swab64 - return a byteswapped 64-bit value
121
 * @x: value to byteswap
122
 */
123
#define __swab64(x)				\
124
	(__builtin_constant_p((__u64)(x)) ?	\
125
	___constant_swab64(x) :			\
126
	__fswab64(x))
127
 
128
/**
129
 * __swahw32 - return a word-swapped 32-bit value
130
 * @x: value to wordswap
131
 *
132
 * __swahw32(0x12340000) is 0x00001234
133
 */
134
#define __swahw32(x)				\
135
	(__builtin_constant_p((__u32)(x)) ?	\
136
	___constant_swahw32(x) :		\
137
	__fswahw32(x))
138
 
139
/**
140
 * __swahb32 - return a high and low byte-swapped 32-bit value
141
 * @x: value to byteswap
142
 *
143
 * __swahb32(0x12345678) is 0x34127856
144
 */
145
#define __swahb32(x)				\
146
	(__builtin_constant_p((__u32)(x)) ?	\
147
	___constant_swahb32(x) :		\
148
	__fswahb32(x))
149
 
150
/**
151
 * __swab16p - return a byteswapped 16-bit value from a pointer
152
 * @p: pointer to a naturally-aligned 16-bit value
153
 */
154
static inline __u16 __swab16p(const __u16 *p)
155
{
156
#ifdef __arch_swab16p
157
	return __arch_swab16p(p);
158
#else
159
	return __swab16(*p);
160
#endif
161
}
162
 
163
/**
164
 * __swab32p - return a byteswapped 32-bit value from a pointer
165
 * @p: pointer to a naturally-aligned 32-bit value
166
 */
167
static inline __u32 __swab32p(const __u32 *p)
168
{
169
#ifdef __arch_swab32p
170
	return __arch_swab32p(p);
171
#else
172
	return __swab32(*p);
173
#endif
174
}
175
 
176
/**
177
 * __swab64p - return a byteswapped 64-bit value from a pointer
178
 * @p: pointer to a naturally-aligned 64-bit value
179
 */
180
static inline __u64 __swab64p(const __u64 *p)
181
{
182
#ifdef __arch_swab64p
183
	return __arch_swab64p(p);
184
#else
185
	return __swab64(*p);
186
#endif
187
}
188
 
189
/**
190
 * __swahw32p - return a wordswapped 32-bit value from a pointer
191
 * @p: pointer to a naturally-aligned 32-bit value
192
 *
193
 * See __swahw32() for details of wordswapping.
194
 */
195
static inline __u32 __swahw32p(const __u32 *p)
196
{
197
#ifdef __arch_swahw32p
198
	return __arch_swahw32p(p);
199
#else
200
	return __swahw32(*p);
201
#endif
202
}
203
 
204
/**
205
 * __swahb32p - return a high and low byteswapped 32-bit value from a pointer
206
 * @p: pointer to a naturally-aligned 32-bit value
207
 *
208
 * See __swahb32() for details of high/low byteswapping.
209
 */
210
static inline __u32 __swahb32p(const __u32 *p)
211
{
212
#ifdef __arch_swahb32p
213
	return __arch_swahb32p(p);
214
#else
215
	return __swahb32(*p);
216
#endif
217
}
218
 
219
/**
220
 * __swab16s - byteswap a 16-bit value in-place
221
 * @p: pointer to a naturally-aligned 16-bit value
222
 */
223
static inline void __swab16s(__u16 *p)
224
{
225
#ifdef __arch_swab16s
226
	__arch_swab16s(p);
227
#else
228
	*p = __swab16p(p);
229
#endif
230
}
231
/**
232
 * __swab32s - byteswap a 32-bit value in-place
233
 * @p: pointer to a naturally-aligned 32-bit value
234
 */
235
static inline void __swab32s(__u32 *p)
236
{
237
#ifdef __arch_swab32s
238
	__arch_swab32s(p);
239
#else
240
	*p = __swab32p(p);
241
#endif
242
}
243
 
244
/**
245
 * __swab64s - byteswap a 64-bit value in-place
246
 * @p: pointer to a naturally-aligned 64-bit value
247
 */
248
static inline void __swab64s(__u64 *p)
249
{
250
#ifdef __arch_swab64s
251
	__arch_swab64s(p);
252
#else
253
	*p = __swab64p(p);
254
#endif
255
}
256
 
257
/**
258
 * __swahw32s - wordswap a 32-bit value in-place
259
 * @p: pointer to a naturally-aligned 32-bit value
260
 *
261
 * See __swahw32() for details of wordswapping
262
 */
263
static inline void __swahw32s(__u32 *p)
264
{
265
#ifdef __arch_swahw32s
266
	__arch_swahw32s(p);
267
#else
268
	*p = __swahw32p(p);
269
#endif
270
}
271
 
272
/**
273
 * __swahb32s - high and low byteswap a 32-bit value in-place
274
 * @p: pointer to a naturally-aligned 32-bit value
275
 *
276
 * See __swahb32() for details of high and low byte swapping
277
 */
278
static inline void __swahb32s(__u32 *p)
279
{
280
#ifdef __arch_swahb32s
281
	__arch_swahb32s(p);
282
#else
283
	*p = __swahb32p(p);
284
#endif
285
}
286
 
287
 
288
#endif /* _UAPI_LINUX_SWAB_H */