Commit 5d30a683888c60b8f93bef3ddc139d1a91ca58f4
Committed by
Linus Torvalds
1 parent
f4d2b14501
x86: introduce asm/swab.h
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 3 changed files with 64 additions and 60 deletions Side-by-side Diff
arch/x86/include/asm/Kbuild
arch/x86/include/asm/byteorder.h
1 | 1 | #ifndef _ASM_X86_BYTEORDER_H |
2 | 2 | #define _ASM_X86_BYTEORDER_H |
3 | 3 | |
4 | -#include <asm/types.h> | |
5 | -#include <linux/compiler.h> | |
6 | - | |
7 | -#define __LITTLE_ENDIAN | |
8 | - | |
9 | -static inline __attribute_const__ __u32 __arch_swab32(__u32 val) | |
10 | -{ | |
11 | -#ifdef __i386__ | |
12 | -# ifdef CONFIG_X86_BSWAP | |
13 | - asm("bswap %0" : "=r" (val) : "0" (val)); | |
14 | -# else | |
15 | - asm("xchgb %b0,%h0\n\t" /* swap lower bytes */ | |
16 | - "rorl $16,%0\n\t" /* swap words */ | |
17 | - "xchgb %b0,%h0" /* swap higher bytes */ | |
18 | - : "=q" (val) | |
19 | - : "0" (val)); | |
20 | -# endif | |
21 | - | |
22 | -#else /* __i386__ */ | |
23 | - asm("bswapl %0" | |
24 | - : "=r" (val) | |
25 | - : "0" (val)); | |
26 | -#endif | |
27 | - return val; | |
28 | -} | |
29 | -#define __arch_swab32 __arch_swab32 | |
30 | - | |
31 | -static inline __attribute_const__ __u64 __arch_swab64(__u64 val) | |
32 | -{ | |
33 | -#ifdef __i386__ | |
34 | - union { | |
35 | - struct { | |
36 | - __u32 a; | |
37 | - __u32 b; | |
38 | - } s; | |
39 | - __u64 u; | |
40 | - } v; | |
41 | - v.u = val; | |
42 | -# ifdef CONFIG_X86_BSWAP | |
43 | - asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1" | |
44 | - : "=r" (v.s.a), "=r" (v.s.b) | |
45 | - : "0" (v.s.a), "1" (v.s.b)); | |
46 | -# else | |
47 | - v.s.a = __arch_swab32(v.s.a); | |
48 | - v.s.b = __arch_swab32(v.s.b); | |
49 | - asm("xchgl %0,%1" | |
50 | - : "=r" (v.s.a), "=r" (v.s.b) | |
51 | - : "0" (v.s.a), "1" (v.s.b)); | |
52 | -# endif | |
53 | - return v.u; | |
54 | -#else /* __i386__ */ | |
55 | - asm("bswapq %0" | |
56 | - : "=r" (val) | |
57 | - : "0" (val)); | |
58 | - return val; | |
59 | -#endif | |
60 | -} | |
61 | -#define __arch_swab64 __arch_swab64 | |
62 | - | |
63 | -#include <linux/byteorder.h> | |
4 | +#include <asm/swab.h> | |
5 | +#include <linux/byteorder/little_endian.h> | |
64 | 6 | |
65 | 7 | #endif /* _ASM_X86_BYTEORDER_H */ |
arch/x86/include/asm/swab.h
1 | +#ifndef _ASM_X86_SWAB_H | |
2 | +#define _ASM_X86_SWAB_H | |
3 | + | |
4 | +#include <asm/types.h> | |
5 | +#include <linux/compiler.h> | |
6 | + | |
7 | +static inline __attribute_const__ __u32 __arch_swab32(__u32 val) | |
8 | +{ | |
9 | +#ifdef __i386__ | |
10 | +# ifdef CONFIG_X86_BSWAP | |
11 | + asm("bswap %0" : "=r" (val) : "0" (val)); | |
12 | +# else | |
13 | + asm("xchgb %b0,%h0\n\t" /* swap lower bytes */ | |
14 | + "rorl $16,%0\n\t" /* swap words */ | |
15 | + "xchgb %b0,%h0" /* swap higher bytes */ | |
16 | + : "=q" (val) | |
17 | + : "0" (val)); | |
18 | +# endif | |
19 | + | |
20 | +#else /* __i386__ */ | |
21 | + asm("bswapl %0" | |
22 | + : "=r" (val) | |
23 | + : "0" (val)); | |
24 | +#endif | |
25 | + return val; | |
26 | +} | |
27 | +#define __arch_swab32 __arch_swab32 | |
28 | + | |
29 | +static inline __attribute_const__ __u64 __arch_swab64(__u64 val) | |
30 | +{ | |
31 | +#ifdef __i386__ | |
32 | + union { | |
33 | + struct { | |
34 | + __u32 a; | |
35 | + __u32 b; | |
36 | + } s; | |
37 | + __u64 u; | |
38 | + } v; | |
39 | + v.u = val; | |
40 | +# ifdef CONFIG_X86_BSWAP | |
41 | + asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1" | |
42 | + : "=r" (v.s.a), "=r" (v.s.b) | |
43 | + : "0" (v.s.a), "1" (v.s.b)); | |
44 | +# else | |
45 | + v.s.a = __arch_swab32(v.s.a); | |
46 | + v.s.b = __arch_swab32(v.s.b); | |
47 | + asm("xchgl %0,%1" | |
48 | + : "=r" (v.s.a), "=r" (v.s.b) | |
49 | + : "0" (v.s.a), "1" (v.s.b)); | |
50 | +# endif | |
51 | + return v.u; | |
52 | +#else /* __i386__ */ | |
53 | + asm("bswapq %0" | |
54 | + : "=r" (val) | |
55 | + : "0" (val)); | |
56 | + return val; | |
57 | +#endif | |
58 | +} | |
59 | +#define __arch_swab64 __arch_swab64 | |
60 | + | |
61 | +#endif /* _ASM_X86_SWAB_H */ |