aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Poimboeuf <jpoimboe@redhat.com>2017-09-18 15:42:08 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2017-09-20 05:42:36 -0400
commitd3dfbfe2e6e7ecd620531d5201314ad14c4ed5b3 (patch)
tree3ca1e7bf788cdc1a2c3f3b5e58e0cf7f4d99e1e2
parent673ac6fbc74f835e2125df9ee39e8a2a423832e2 (diff)
crypto: x86/sha256-avx2 - 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. There's no need to use RBP as a temporary register for the TBL value, because it always stores the same value: the address of the K256 table. Instead just reference the address of K256 directly. 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/sha256-avx2-asm.S22
1 files changed, 7 insertions, 15 deletions
diff --git a/arch/x86/crypto/sha256-avx2-asm.S b/arch/x86/crypto/sha256-avx2-asm.S
index 89c8f09787d2..1420db15dcdd 100644
--- a/arch/x86/crypto/sha256-avx2-asm.S
+++ b/arch/x86/crypto/sha256-avx2-asm.S
@@ -98,8 +98,6 @@ d = %r8d
98e = %edx # clobbers NUM_BLKS 98e = %edx # clobbers NUM_BLKS
99y3 = %esi # clobbers INP 99y3 = %esi # clobbers INP
100 100
101
102TBL = %rbp
103SRND = CTX # SRND is same register as CTX 101SRND = CTX # SRND is same register as CTX
104 102
105a = %eax 103a = %eax
@@ -531,7 +529,6 @@ STACK_SIZE = _RSP + _RSP_SIZE
531ENTRY(sha256_transform_rorx) 529ENTRY(sha256_transform_rorx)
532.align 32 530.align 32
533 pushq %rbx 531 pushq %rbx
534 pushq %rbp
535 pushq %r12 532 pushq %r12
536 pushq %r13 533 pushq %r13
537 pushq %r14 534 pushq %r14
@@ -568,8 +565,6 @@ ENTRY(sha256_transform_rorx)
568 mov CTX, _CTX(%rsp) 565 mov CTX, _CTX(%rsp)
569 566
570loop0: 567loop0:
571 lea K256(%rip), TBL
572
573 ## Load first 16 dwords from two blocks 568 ## Load first 16 dwords from two blocks
574 VMOVDQ 0*32(INP),XTMP0 569 VMOVDQ 0*32(INP),XTMP0
575 VMOVDQ 1*32(INP),XTMP1 570 VMOVDQ 1*32(INP),XTMP1
@@ -597,19 +592,19 @@ last_block_enter:
597 592
598.align 16 593.align 16
599loop1: 594loop1:
600 vpaddd 0*32(TBL, SRND), X0, XFER 595 vpaddd K256+0*32(SRND), X0, XFER
601 vmovdqa XFER, 0*32+_XFER(%rsp, SRND) 596 vmovdqa XFER, 0*32+_XFER(%rsp, SRND)
602 FOUR_ROUNDS_AND_SCHED _XFER + 0*32 597 FOUR_ROUNDS_AND_SCHED _XFER + 0*32
603 598
604 vpaddd 1*32(TBL, SRND), X0, XFER 599 vpaddd K256+1*32(SRND), X0, XFER
605 vmovdqa XFER, 1*32+_XFER(%rsp, SRND) 600 vmovdqa XFER, 1*32+_XFER(%rsp, SRND)
606 FOUR_ROUNDS_AND_SCHED _XFER + 1*32 601 FOUR_ROUNDS_AND_SCHED _XFER + 1*32
607 602
608 vpaddd 2*32(TBL, SRND), X0, XFER 603 vpaddd K256+2*32(SRND), X0, XFER
609 vmovdqa XFER, 2*32+_XFER(%rsp, SRND) 604 vmovdqa XFER, 2*32+_XFER(%rsp, SRND)
610 FOUR_ROUNDS_AND_SCHED _XFER + 2*32 605 FOUR_ROUNDS_AND_SCHED _XFER + 2*32
611 606
612 vpaddd 3*32(TBL, SRND), X0, XFER 607 vpaddd K256+3*32(SRND), X0, XFER
613 vmovdqa XFER, 3*32+_XFER(%rsp, SRND) 608 vmovdqa XFER, 3*32+_XFER(%rsp, SRND)
614 FOUR_ROUNDS_AND_SCHED _XFER + 3*32 609 FOUR_ROUNDS_AND_SCHED _XFER + 3*32
615 610
@@ -619,10 +614,11 @@ loop1:
619 614
620loop2: 615loop2:
621 ## Do last 16 rounds with no scheduling 616 ## Do last 16 rounds with no scheduling
622 vpaddd 0*32(TBL, SRND), X0, XFER 617 vpaddd K256+0*32(SRND), X0, XFER
623 vmovdqa XFER, 0*32+_XFER(%rsp, SRND) 618 vmovdqa XFER, 0*32+_XFER(%rsp, SRND)
624 DO_4ROUNDS _XFER + 0*32 619 DO_4ROUNDS _XFER + 0*32
625 vpaddd 1*32(TBL, SRND), X1, XFER 620
621 vpaddd K256+1*32(SRND), X1, XFER
626 vmovdqa XFER, 1*32+_XFER(%rsp, SRND) 622 vmovdqa XFER, 1*32+_XFER(%rsp, SRND)
627 DO_4ROUNDS _XFER + 1*32 623 DO_4ROUNDS _XFER + 1*32
628 add $2*32, SRND 624 add $2*32, SRND
@@ -676,9 +672,6 @@ loop3:
676 ja done_hash 672 ja done_hash
677 673
678do_last_block: 674do_last_block:
679 #### do last block
680 lea K256(%rip), TBL
681
682 VMOVDQ 0*16(INP),XWORD0 675 VMOVDQ 0*16(INP),XWORD0
683 VMOVDQ 1*16(INP),XWORD1 676 VMOVDQ 1*16(INP),XWORD1
684 VMOVDQ 2*16(INP),XWORD2 677 VMOVDQ 2*16(INP),XWORD2
@@ -718,7 +711,6 @@ done_hash:
718 popq %r14 711 popq %r14
719 popq %r13 712 popq %r13
720 popq %r12 713 popq %r12
721 popq %rbp
722 popq %rbx 714 popq %rbx
723 ret 715 ret
724ENDPROC(sha256_transform_rorx) 716ENDPROC(sha256_transform_rorx)