aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Poimboeuf <jpoimboe@redhat.com>2017-09-18 15:42:00 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2017-09-20 05:42:31 -0400
commit569f11c9f788959b640116b5bbd6d8a1f07326da (patch)
tree491fe651a7daa4fb738224b2e269ce9c8af4dd1d
parentbd6227a150fdb56e7bb734976ef6e53a2c1cb334 (diff)
crypto: x86/blowfish - Fix RBP usage
Using RBP as a temporary register breaks frame pointer convention and breaks stack traces when unwinding from an interrupt in the crypto code. Use R12 instead of RBP. R12 can't be used as the RT0 register because of x86 instruction encoding limitations. So use R12 for CTX and RDI for CTX. This means that CTX is no longer an implicit function argument. Instead it needs to be explicitly copied from RDI. Reported-by: Eric Biggers <ebiggers@google.com> Reported-by: Peter Zijlstra <peterz@infradead.org> Tested-by: Eric Biggers <ebiggers@google.com> Acked-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--arch/x86/crypto/blowfish-x86_64-asm_64.S48
1 files changed, 26 insertions, 22 deletions
diff --git a/arch/x86/crypto/blowfish-x86_64-asm_64.S b/arch/x86/crypto/blowfish-x86_64-asm_64.S
index 246c67006ed0..8c1fcb6bad21 100644
--- a/arch/x86/crypto/blowfish-x86_64-asm_64.S
+++ b/arch/x86/crypto/blowfish-x86_64-asm_64.S
@@ -33,7 +33,7 @@
33#define s3 ((16 + 2 + (3 * 256)) * 4) 33#define s3 ((16 + 2 + (3 * 256)) * 4)
34 34
35/* register macros */ 35/* register macros */
36#define CTX %rdi 36#define CTX %r12
37#define RIO %rsi 37#define RIO %rsi
38 38
39#define RX0 %rax 39#define RX0 %rax
@@ -56,12 +56,12 @@
56#define RX2bh %ch 56#define RX2bh %ch
57#define RX3bh %dh 57#define RX3bh %dh
58 58
59#define RT0 %rbp 59#define RT0 %rdi
60#define RT1 %rsi 60#define RT1 %rsi
61#define RT2 %r8 61#define RT2 %r8
62#define RT3 %r9 62#define RT3 %r9
63 63
64#define RT0d %ebp 64#define RT0d %edi
65#define RT1d %esi 65#define RT1d %esi
66#define RT2d %r8d 66#define RT2d %r8d
67#define RT3d %r9d 67#define RT3d %r9d
@@ -120,13 +120,14 @@
120 120
121ENTRY(__blowfish_enc_blk) 121ENTRY(__blowfish_enc_blk)
122 /* input: 122 /* input:
123 * %rdi: ctx, CTX 123 * %rdi: ctx
124 * %rsi: dst 124 * %rsi: dst
125 * %rdx: src 125 * %rdx: src
126 * %rcx: bool, if true: xor output 126 * %rcx: bool, if true: xor output
127 */ 127 */
128 movq %rbp, %r11; 128 movq %r12, %r11;
129 129
130 movq %rdi, CTX;
130 movq %rsi, %r10; 131 movq %rsi, %r10;
131 movq %rdx, RIO; 132 movq %rdx, RIO;
132 133
@@ -142,7 +143,7 @@ ENTRY(__blowfish_enc_blk)
142 round_enc(14); 143 round_enc(14);
143 add_roundkey_enc(16); 144 add_roundkey_enc(16);
144 145
145 movq %r11, %rbp; 146 movq %r11, %r12;
146 147
147 movq %r10, RIO; 148 movq %r10, RIO;
148 test %cl, %cl; 149 test %cl, %cl;
@@ -157,12 +158,13 @@ ENDPROC(__blowfish_enc_blk)
157 158
158ENTRY(blowfish_dec_blk) 159ENTRY(blowfish_dec_blk)
159 /* input: 160 /* input:
160 * %rdi: ctx, CTX 161 * %rdi: ctx
161 * %rsi: dst 162 * %rsi: dst
162 * %rdx: src 163 * %rdx: src
163 */ 164 */
164 movq %rbp, %r11; 165 movq %r12, %r11;
165 166
167 movq %rdi, CTX;
166 movq %rsi, %r10; 168 movq %rsi, %r10;
167 movq %rdx, RIO; 169 movq %rdx, RIO;
168 170
@@ -181,7 +183,7 @@ ENTRY(blowfish_dec_blk)
181 movq %r10, RIO; 183 movq %r10, RIO;
182 write_block(); 184 write_block();
183 185
184 movq %r11, %rbp; 186 movq %r11, %r12;
185 187
186 ret; 188 ret;
187ENDPROC(blowfish_dec_blk) 189ENDPROC(blowfish_dec_blk)
@@ -298,20 +300,21 @@ ENDPROC(blowfish_dec_blk)
298 300
299ENTRY(__blowfish_enc_blk_4way) 301ENTRY(__blowfish_enc_blk_4way)
300 /* input: 302 /* input:
301 * %rdi: ctx, CTX 303 * %rdi: ctx
302 * %rsi: dst 304 * %rsi: dst
303 * %rdx: src 305 * %rdx: src
304 * %rcx: bool, if true: xor output 306 * %rcx: bool, if true: xor output
305 */ 307 */
306 pushq %rbp; 308 pushq %r12;
307 pushq %rbx; 309 pushq %rbx;
308 pushq %rcx; 310 pushq %rcx;
309 311
310 preload_roundkey_enc(0); 312 movq %rdi, CTX
311
312 movq %rsi, %r11; 313 movq %rsi, %r11;
313 movq %rdx, RIO; 314 movq %rdx, RIO;
314 315
316 preload_roundkey_enc(0);
317
315 read_block4(); 318 read_block4();
316 319
317 round_enc4(0); 320 round_enc4(0);
@@ -324,39 +327,40 @@ ENTRY(__blowfish_enc_blk_4way)
324 round_enc4(14); 327 round_enc4(14);
325 add_preloaded_roundkey4(); 328 add_preloaded_roundkey4();
326 329
327 popq %rbp; 330 popq %r12;
328 movq %r11, RIO; 331 movq %r11, RIO;
329 332
330 test %bpl, %bpl; 333 test %r12b, %r12b;
331 jnz .L__enc_xor4; 334 jnz .L__enc_xor4;
332 335
333 write_block4(); 336 write_block4();
334 337
335 popq %rbx; 338 popq %rbx;
336 popq %rbp; 339 popq %r12;
337 ret; 340 ret;
338 341
339.L__enc_xor4: 342.L__enc_xor4:
340 xor_block4(); 343 xor_block4();
341 344
342 popq %rbx; 345 popq %rbx;
343 popq %rbp; 346 popq %r12;
344 ret; 347 ret;
345ENDPROC(__blowfish_enc_blk_4way) 348ENDPROC(__blowfish_enc_blk_4way)
346 349
347ENTRY(blowfish_dec_blk_4way) 350ENTRY(blowfish_dec_blk_4way)
348 /* input: 351 /* input:
349 * %rdi: ctx, CTX 352 * %rdi: ctx
350 * %rsi: dst 353 * %rsi: dst
351 * %rdx: src 354 * %rdx: src
352 */ 355 */
353 pushq %rbp; 356 pushq %r12;
354 pushq %rbx; 357 pushq %rbx;
355 preload_roundkey_dec(17);
356 358
357 movq %rsi, %r11; 359 movq %rdi, CTX;
360 movq %rsi, %r11
358 movq %rdx, RIO; 361 movq %rdx, RIO;
359 362
363 preload_roundkey_dec(17);
360 read_block4(); 364 read_block4();
361 365
362 round_dec4(17); 366 round_dec4(17);
@@ -373,7 +377,7 @@ ENTRY(blowfish_dec_blk_4way)
373 write_block4(); 377 write_block4();
374 378
375 popq %rbx; 379 popq %rbx;
376 popq %rbp; 380 popq %r12;
377 381
378 ret; 382 ret;
379ENDPROC(blowfish_dec_blk_4way) 383ENDPROC(blowfish_dec_blk_4way)