Browse Source

crypto: x86/sha1-ssse3 - 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.

Swap the usages of R12 and RBP.  Use R12 for the REG_D register, and use
RBP to store the pre-aligned stack pointer.

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>
Josh Poimboeuf 8 years ago
parent
commit
6488bce756
1 changed files with 5 additions and 6 deletions
  1. 5 6
      arch/x86/crypto/sha1_ssse3_asm.S

+ 5 - 6
arch/x86/crypto/sha1_ssse3_asm.S

@@ -37,7 +37,7 @@
 #define REG_A	%ecx
 #define REG_A	%ecx
 #define REG_B	%esi
 #define REG_B	%esi
 #define REG_C	%edi
 #define REG_C	%edi
-#define REG_D	%ebp
+#define REG_D	%r12d
 #define REG_E	%edx
 #define REG_E	%edx
 
 
 #define REG_T1	%eax
 #define REG_T1	%eax
@@ -74,10 +74,10 @@
 	ENTRY(\name)
 	ENTRY(\name)
 
 
 	push	%rbx
 	push	%rbx
-	push	%rbp
 	push	%r12
 	push	%r12
+	push	%rbp
+	mov	%rsp, %rbp
 
 
-	mov	%rsp, %r12
 	sub	$64, %rsp		# allocate workspace
 	sub	$64, %rsp		# allocate workspace
 	and	$~15, %rsp		# align stack
 	and	$~15, %rsp		# align stack
 
 
@@ -99,10 +99,9 @@
 	xor	%rax, %rax
 	xor	%rax, %rax
 	rep stosq
 	rep stosq
 
 
-	mov	%r12, %rsp		# deallocate workspace
-
-	pop	%r12
+	mov	%rbp, %rsp		# deallocate workspace
 	pop	%rbp
 	pop	%rbp
+	pop	%r12
 	pop	%rbx
 	pop	%rbx
 	ret
 	ret