Commit 5d30a683888c60b8f93bef3ddc139d1a91ca58f4

Authored by Harvey Harrison
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
... ... @@ -22,4 +22,5 @@
22 22 unifdef-y += unistd_64.h
23 23 unifdef-y += vm86.h
24 24 unifdef-y += vsyscall.h
  25 +unifdef-y += swab.h
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 */