summaryrefslogtreecommitdiff
path: root/virt/lib
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2017-12-19 03:40:26 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-02-25 13:05:42 +0300
commiteda4a83657b8e289560b40bb2dc33ed3b654142f (patch)
tree50b69cf4541d198d6ba6d47be0ccdc8302ec1db4 /virt/lib
parent5e6f51aac15ac93605187fd11b9bc75a240a53f8 (diff)
downloadlinux-eda4a83657b8e289560b40bb2dc33ed3b654142f.tar.xz
crypto: x86/twofish-3way - Fix %rbp usage
commit d8c7fe9f2a486a6e5f0d5229ca43807af5ab22c6 upstream. Using %rbp as a temporary register breaks frame pointer convention and breaks stack traces when unwinding from an interrupt in the crypto code. In twofish-3way, we can't simply replace %rbp with another register because there are none available. Instead, we use the stack to hold the values that %rbp, %r11, and %r12 were holding previously. Each of these values represents the half of the output from the previous Feistel round that is being passed on unchanged to the following round. They are only used once per round, when they are exchanged with %rax, %rbx, and %rcx. As a result, we free up 3 registers (one per block) and can reassign them so that %rbp is not used, and additionally %r14 and %r15 are not used so they do not need to be saved/restored. There may be a small overhead caused by replacing 'xchg REG, REG' with the needed sequence 'mov MEM, REG; mov REG, MEM; mov REG, REG' once per round. But, counterintuitively, when I tested "ctr-twofish-3way" on a Haswell processor, the new version was actually about 2% faster. (Perhaps 'xchg' is not as well optimized as plain moves.) Reported-by: syzbot <syzkaller@googlegroups.com> Signed-off-by: Eric Biggers <ebiggers@google.com> Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'virt/lib')
0 files changed, 0 insertions, 0 deletions