mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
lib/crypto: x86/sha512: Follow the normal %rbp convention
The SHA-512 assembly functions push callee-save GPRs to the stack
*before* they set up the frame pointer (%rbp). (They are leaf
functions, but they need to set up a frame pointer anyway because they
allocate a 32-byte-aligned buffer on the stack.)
As a result, during these functions, 8(%rbp) doesn't contain a return
address like it is supposed to.
This differs from the convention used by C code, and it interferes with
the frame pointer unwinder (CONFIG_UNWINDER_FRAME_POINTER=y).
Specifically, if a call trace is dumped in these functions, then all
entries are populated purely from the fallback scan of the entire stack:
RIP: 0010:sha512_transform_rorx+0x673/0xdf0
[...]
Call Trace:
<TASK>
? sha512_blocks_avx2+0x37/0x60
? __sha512_update+0x80/0x230
? sha512+0x31/0x190
? sha512+0x114/0x190
[...]
? do_syscall_64+0x6f/0x3e0
With this fix to follow the normal %rbp convention, the call trace is
generated reliably:
RIP: 0010:sha512_transform_rorx+0x90c/0xdf0
[...]
Call Trace:
<TASK>
sha512_blocks_avx2+0x37/0x60
__sha512_update+0x80/0x230
sha512+0x114/0x190
[...]
do_syscall_64+0x6f/0x3e0
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://patch.msgid.link/20261011134843.166585-4-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
This commit is contained in:
parent
cc76c9b82b
commit
40f47fa10a
|
|
@ -276,6 +276,9 @@ frame_size = frame_WK + WK_SIZE
|
|||
########################################################################
|
||||
SYM_FUNC_START(sha512_transform_avx)
|
||||
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
# Save GPRs
|
||||
push %rbx
|
||||
push %r12
|
||||
|
|
@ -284,8 +287,6 @@ SYM_FUNC_START(sha512_transform_avx)
|
|||
push %r15
|
||||
|
||||
# Allocate Stack Space
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
sub $frame_size, %rsp
|
||||
and $~(0x20 - 1), %rsp
|
||||
|
||||
|
|
@ -348,9 +349,8 @@ SYM_FUNC_START(sha512_transform_avx)
|
|||
dec msglen
|
||||
jnz .Lupdateblock
|
||||
|
||||
# Restore Stack Pointer
|
||||
mov %rbp, %rsp
|
||||
pop %rbp
|
||||
# Deallocate Stack Space
|
||||
lea -40(%rbp), %rsp
|
||||
|
||||
# Restore GPRs
|
||||
pop %r15
|
||||
|
|
@ -358,6 +358,7 @@ SYM_FUNC_START(sha512_transform_avx)
|
|||
pop %r13
|
||||
pop %r12
|
||||
pop %rbx
|
||||
pop %rbp
|
||||
|
||||
RET
|
||||
SYM_FUNC_END(sha512_transform_avx)
|
||||
|
|
|
|||
|
|
@ -568,6 +568,9 @@ frame_size = frame_CTX + CTX_SIZE
|
|||
########################################################################
|
||||
SYM_FUNC_START(sha512_transform_rorx)
|
||||
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
# Save GPRs
|
||||
push %rbx
|
||||
push %r12
|
||||
|
|
@ -576,8 +579,6 @@ SYM_FUNC_START(sha512_transform_rorx)
|
|||
push %r15
|
||||
|
||||
# Allocate Stack Space
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
sub $frame_size, %rsp
|
||||
and $~(0x20 - 1), %rsp
|
||||
|
||||
|
|
@ -667,9 +668,8 @@ SYM_FUNC_START(sha512_transform_rorx)
|
|||
cmp frame_INPEND(%rsp), INP
|
||||
jne .Lloop0
|
||||
|
||||
# Restore Stack Pointer
|
||||
mov %rbp, %rsp
|
||||
pop %rbp
|
||||
# Deallocate Stack Space
|
||||
lea -40(%rbp), %rsp
|
||||
|
||||
# Restore GPRs
|
||||
pop %r15
|
||||
|
|
@ -677,6 +677,7 @@ SYM_FUNC_START(sha512_transform_rorx)
|
|||
pop %r13
|
||||
pop %r12
|
||||
pop %rbx
|
||||
pop %rbp
|
||||
|
||||
vzeroupper
|
||||
RET
|
||||
|
|
|
|||
|
|
@ -275,6 +275,9 @@ frame_size = frame_WK + WK_SIZE
|
|||
########################################################################
|
||||
SYM_FUNC_START(sha512_transform_ssse3)
|
||||
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
# Save GPRs
|
||||
push %rbx
|
||||
push %r12
|
||||
|
|
@ -283,8 +286,6 @@ SYM_FUNC_START(sha512_transform_ssse3)
|
|||
push %r15
|
||||
|
||||
# Allocate Stack Space
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
sub $frame_size, %rsp
|
||||
and $~(0x20 - 1), %rsp
|
||||
|
||||
|
|
@ -347,9 +348,8 @@ SYM_FUNC_START(sha512_transform_ssse3)
|
|||
dec msglen
|
||||
jnz .Lupdateblock
|
||||
|
||||
# Restore Stack Pointer
|
||||
mov %rbp, %rsp
|
||||
pop %rbp
|
||||
# Deallocate Stack Space
|
||||
lea -40(%rbp), %rsp
|
||||
|
||||
# Restore GPRs
|
||||
pop %r15
|
||||
|
|
@ -357,6 +357,7 @@ SYM_FUNC_START(sha512_transform_ssse3)
|
|||
pop %r13
|
||||
pop %r12
|
||||
pop %rbx
|
||||
pop %rbp
|
||||
|
||||
RET
|
||||
SYM_FUNC_END(sha512_transform_ssse3)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user