[PATCH v2 02/12] x86/crypto: Fix RBP usage in camellia-x86_64-asm_64.S

From: Josh Poimboeuf
Date: Mon Sep 18 2017 - 15:44:49 EST


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. Both are callee-saved registers, so the
substitution is straightforward.

Reported-by: Eric Biggers <ebiggers@xxxxxxxxxx>
Reported-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Tested-by: Eric Biggers <ebiggers@xxxxxxxxxx>
Acked-by: Eric Biggers <ebiggers@xxxxxxxxxx>
Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
---
arch/x86/crypto/camellia-x86_64-asm_64.S | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/arch/x86/crypto/camellia-x86_64-asm_64.S b/arch/x86/crypto/camellia-x86_64-asm_64.S
index 310319c601ed..95ba6956a7f6 100644
--- a/arch/x86/crypto/camellia-x86_64-asm_64.S
+++ b/arch/x86/crypto/camellia-x86_64-asm_64.S
@@ -75,17 +75,17 @@
#define RCD1bh %dh

#define RT0 %rsi
-#define RT1 %rbp
+#define RT1 %r12
#define RT2 %r8

#define RT0d %esi
-#define RT1d %ebp
+#define RT1d %r12d
#define RT2d %r8d

#define RT2bl %r8b

#define RXOR %r9
-#define RRBP %r10
+#define RR12 %r10
#define RDST %r11

#define RXORd %r9d
@@ -197,7 +197,7 @@ ENTRY(__camellia_enc_blk)
* %rdx: src
* %rcx: bool xor
*/
- movq %rbp, RRBP;
+ movq %r12, RR12;

movq %rcx, RXOR;
movq %rsi, RDST;
@@ -227,13 +227,13 @@ ENTRY(__camellia_enc_blk)

enc_outunpack(mov, RT1);

- movq RRBP, %rbp;
+ movq RR12, %r12;
ret;

.L__enc_xor:
enc_outunpack(xor, RT1);

- movq RRBP, %rbp;
+ movq RR12, %r12;
ret;
ENDPROC(__camellia_enc_blk)

@@ -248,7 +248,7 @@ ENTRY(camellia_dec_blk)
movl $24, RXORd;
cmovel RXORd, RT2d; /* max */

- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rsi, RDST;
movq %rdx, RIO;

@@ -271,7 +271,7 @@ ENTRY(camellia_dec_blk)

dec_outunpack();

- movq RRBP, %rbp;
+ movq RR12, %r12;
ret;
ENDPROC(camellia_dec_blk)

@@ -433,7 +433,7 @@ ENTRY(__camellia_enc_blk_2way)
*/
pushq %rbx;

- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rcx, RXOR;
movq %rsi, RDST;
movq %rdx, RIO;
@@ -461,14 +461,14 @@ ENTRY(__camellia_enc_blk_2way)

enc_outunpack2(mov, RT2);

- movq RRBP, %rbp;
+ movq RR12, %r12;
popq %rbx;
ret;

.L__enc2_xor:
enc_outunpack2(xor, RT2);

- movq RRBP, %rbp;
+ movq RR12, %r12;
popq %rbx;
ret;
ENDPROC(__camellia_enc_blk_2way)
@@ -485,7 +485,7 @@ ENTRY(camellia_dec_blk_2way)
cmovel RXORd, RT2d; /* max */

movq %rbx, RXOR;
- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rsi, RDST;
movq %rdx, RIO;

@@ -508,7 +508,7 @@ ENTRY(camellia_dec_blk_2way)

dec_outunpack2();

- movq RRBP, %rbp;
+ movq RR12, %r12;
movq RXOR, %rbx;
ret;
ENDPROC(camellia_dec_blk_2way)
--
2.13.5