diff options
author | Jan Beulich <JBeulich@suse.com> | 2013-05-29 08:43:54 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-05-30 19:36:23 -0400 |
commit | 2baad6121e2b2fa3428ee6cb2298107be11ab23a (patch) | |
tree | e2f944a9ff91a60ab7ac73152f1ff9a8bb56f96c /arch/x86 | |
parent | e9d0626ed43a41a3fc526d1df06122b0d4eac174 (diff) |
x86, crc32-pclmul: Fix build with older binutils
binutils prior to 2.18 (e.g. the ones found on SLE10) don't support
assembling PEXTRD, so a macro based approach like the one for PCLMULQDQ
in the same file should be used.
This requires making the helper macros capable of recognizing 32-bit
general purpose register operands.
[ hpa: tagging for stable as it is a low risk build fix ]
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Link: http://lkml.kernel.org/r/51A6142A02000078000D99D8@nat28.tlf.novell.com
Cc: Alexander Boyko <alexander_boyko@xyratex.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Huang Ying <ying.huang@intel.com>
Cc: <stable@vger.kernel.org> v3.9
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/crypto/crc32-pclmul_asm.S | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/inst.h | 74 |
2 files changed, 73 insertions, 3 deletions
diff --git a/arch/x86/crypto/crc32-pclmul_asm.S b/arch/x86/crypto/crc32-pclmul_asm.S index 94c27df8a549..f247304299a2 100644 --- a/arch/x86/crypto/crc32-pclmul_asm.S +++ b/arch/x86/crypto/crc32-pclmul_asm.S | |||
@@ -240,7 +240,7 @@ fold_64: | |||
240 | pand %xmm3, %xmm1 | 240 | pand %xmm3, %xmm1 |
241 | PCLMULQDQ 0x00, CONSTANT, %xmm1 | 241 | PCLMULQDQ 0x00, CONSTANT, %xmm1 |
242 | pxor %xmm2, %xmm1 | 242 | pxor %xmm2, %xmm1 |
243 | pextrd $0x01, %xmm1, %eax | 243 | PEXTRD 0x01, %xmm1, %eax |
244 | 244 | ||
245 | ret | 245 | ret |
246 | ENDPROC(crc32_pclmul_le_16) | 246 | ENDPROC(crc32_pclmul_le_16) |
diff --git a/arch/x86/include/asm/inst.h b/arch/x86/include/asm/inst.h index 280bf7fb6aba..3e115273ed88 100644 --- a/arch/x86/include/asm/inst.h +++ b/arch/x86/include/asm/inst.h | |||
@@ -9,12 +9,68 @@ | |||
9 | 9 | ||
10 | #define REG_NUM_INVALID 100 | 10 | #define REG_NUM_INVALID 100 |
11 | 11 | ||
12 | #define REG_TYPE_R64 0 | 12 | #define REG_TYPE_R32 0 |
13 | #define REG_TYPE_XMM 1 | 13 | #define REG_TYPE_R64 1 |
14 | #define REG_TYPE_XMM 2 | ||
14 | #define REG_TYPE_INVALID 100 | 15 | #define REG_TYPE_INVALID 100 |
15 | 16 | ||
17 | .macro R32_NUM opd r32 | ||
18 | \opd = REG_NUM_INVALID | ||
19 | .ifc \r32,%eax | ||
20 | \opd = 0 | ||
21 | .endif | ||
22 | .ifc \r32,%ecx | ||
23 | \opd = 1 | ||
24 | .endif | ||
25 | .ifc \r32,%edx | ||
26 | \opd = 2 | ||
27 | .endif | ||
28 | .ifc \r32,%ebx | ||
29 | \opd = 3 | ||
30 | .endif | ||
31 | .ifc \r32,%esp | ||
32 | \opd = 4 | ||
33 | .endif | ||
34 | .ifc \r32,%ebp | ||
35 | \opd = 5 | ||
36 | .endif | ||
37 | .ifc \r32,%esi | ||
38 | \opd = 6 | ||
39 | .endif | ||
40 | .ifc \r32,%edi | ||
41 | \opd = 7 | ||
42 | .endif | ||
43 | #ifdef CONFIG_X86_64 | ||
44 | .ifc \r32,%r8d | ||
45 | \opd = 8 | ||
46 | .endif | ||
47 | .ifc \r32,%r9d | ||
48 | \opd = 9 | ||
49 | .endif | ||
50 | .ifc \r32,%r10d | ||
51 | \opd = 10 | ||
52 | .endif | ||
53 | .ifc \r32,%r11d | ||
54 | \opd = 11 | ||
55 | .endif | ||
56 | .ifc \r32,%r12d | ||
57 | \opd = 12 | ||
58 | .endif | ||
59 | .ifc \r32,%r13d | ||
60 | \opd = 13 | ||
61 | .endif | ||
62 | .ifc \r32,%r14d | ||
63 | \opd = 14 | ||
64 | .endif | ||
65 | .ifc \r32,%r15d | ||
66 | \opd = 15 | ||
67 | .endif | ||
68 | #endif | ||
69 | .endm | ||
70 | |||
16 | .macro R64_NUM opd r64 | 71 | .macro R64_NUM opd r64 |
17 | \opd = REG_NUM_INVALID | 72 | \opd = REG_NUM_INVALID |
73 | #ifdef CONFIG_X86_64 | ||
18 | .ifc \r64,%rax | 74 | .ifc \r64,%rax |
19 | \opd = 0 | 75 | \opd = 0 |
20 | .endif | 76 | .endif |
@@ -63,6 +119,7 @@ | |||
63 | .ifc \r64,%r15 | 119 | .ifc \r64,%r15 |
64 | \opd = 15 | 120 | \opd = 15 |
65 | .endif | 121 | .endif |
122 | #endif | ||
66 | .endm | 123 | .endm |
67 | 124 | ||
68 | .macro XMM_NUM opd xmm | 125 | .macro XMM_NUM opd xmm |
@@ -118,10 +175,13 @@ | |||
118 | .endm | 175 | .endm |
119 | 176 | ||
120 | .macro REG_TYPE type reg | 177 | .macro REG_TYPE type reg |
178 | R32_NUM reg_type_r32 \reg | ||
121 | R64_NUM reg_type_r64 \reg | 179 | R64_NUM reg_type_r64 \reg |
122 | XMM_NUM reg_type_xmm \reg | 180 | XMM_NUM reg_type_xmm \reg |
123 | .if reg_type_r64 <> REG_NUM_INVALID | 181 | .if reg_type_r64 <> REG_NUM_INVALID |
124 | \type = REG_TYPE_R64 | 182 | \type = REG_TYPE_R64 |
183 | .elseif reg_type_r32 <> REG_NUM_INVALID | ||
184 | \type = REG_TYPE_R32 | ||
125 | .elseif reg_type_xmm <> REG_NUM_INVALID | 185 | .elseif reg_type_xmm <> REG_NUM_INVALID |
126 | \type = REG_TYPE_XMM | 186 | \type = REG_TYPE_XMM |
127 | .else | 187 | .else |
@@ -162,6 +222,16 @@ | |||
162 | .byte \imm8 | 222 | .byte \imm8 |
163 | .endm | 223 | .endm |
164 | 224 | ||
225 | .macro PEXTRD imm8 xmm gpr | ||
226 | R32_NUM extrd_opd1 \gpr | ||
227 | XMM_NUM extrd_opd2 \xmm | ||
228 | PFX_OPD_SIZE | ||
229 | PFX_REX extrd_opd1 extrd_opd2 | ||
230 | .byte 0x0f, 0x3a, 0x16 | ||
231 | MODRM 0xc0 extrd_opd1 extrd_opd2 | ||
232 | .byte \imm8 | ||
233 | .endm | ||
234 | |||
165 | .macro AESKEYGENASSIST rcon xmm1 xmm2 | 235 | .macro AESKEYGENASSIST rcon xmm1 xmm2 |
166 | XMM_NUM aeskeygen_opd1 \xmm1 | 236 | XMM_NUM aeskeygen_opd1 \xmm1 |
167 | XMM_NUM aeskeygen_opd2 \xmm2 | 237 | XMM_NUM aeskeygen_opd2 \xmm2 |