Blame view

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