diff options
author | Josh Poimboeuf <jpoimboe@redhat.com> | 2017-09-18 15:42:08 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-09-20 05:42:36 -0400 |
commit | d3dfbfe2e6e7ecd620531d5201314ad14c4ed5b3 (patch) | |
tree | 3ca1e7bf788cdc1a2c3f3b5e58e0cf7f4d99e1e2 | |
parent | 673ac6fbc74f835e2125df9ee39e8a2a423832e2 (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.S | 22 |
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 | |||
98 | e = %edx # clobbers NUM_BLKS | 98 | e = %edx # clobbers NUM_BLKS |
99 | y3 = %esi # clobbers INP | 99 | y3 = %esi # clobbers INP |
100 | 100 | ||
101 | |||
102 | TBL = %rbp | ||
103 | SRND = CTX # SRND is same register as CTX | 101 | SRND = CTX # SRND is same register as CTX |
104 | 102 | ||
105 | a = %eax | 103 | a = %eax |
@@ -531,7 +529,6 @@ STACK_SIZE = _RSP + _RSP_SIZE | |||
531 | ENTRY(sha256_transform_rorx) | 529 | ENTRY(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 | ||
570 | loop0: | 567 | loop0: |
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 |
599 | loop1: | 594 | loop1: |
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 | ||
620 | loop2: | 615 | loop2: |
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 | ||
678 | do_last_block: | 674 | do_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 |
724 | ENDPROC(sha256_transform_rorx) | 716 | ENDPROC(sha256_transform_rorx) |