From: Eric Biggers <ebiggers@kernel.org>
To: linux-crypto@vger.kernel.org
Cc: Ard Biesheuvel <ardb@kernel.org>,
"Jason A . Donenfeld" <Jason@zx2c4.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
x86@kernel.org, Eric Biggers <ebiggers@kernel.org>
Subject: [PATCH 3/3] lib/crypto: x86/sha512: Follow the normal %rbp convention
Date: Sun, 11 Oct 2026 15:48:43 +0200 [thread overview]
Message-ID: <20261011134843.166585-4-ebiggers@kernel.org> (raw)
In-Reply-To: <20261011134843.166585-1-ebiggers@kernel.org>
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
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
---
lib/crypto/x86/sha512-avx-asm.S | 11 ++++++-----
lib/crypto/x86/sha512-avx2-asm.S | 11 ++++++-----
lib/crypto/x86/sha512-ssse3-asm.S | 11 ++++++-----
3 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/lib/crypto/x86/sha512-avx-asm.S b/lib/crypto/x86/sha512-avx-asm.S
index 7732aa8fd850..a17dfedc1c51 100644
--- a/lib/crypto/x86/sha512-avx-asm.S
+++ b/lib/crypto/x86/sha512-avx-asm.S
@@ -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)
diff --git a/lib/crypto/x86/sha512-avx2-asm.S b/lib/crypto/x86/sha512-avx2-asm.S
index 22bdbfd899d0..2256d51297e1 100644
--- a/lib/crypto/x86/sha512-avx2-asm.S
+++ b/lib/crypto/x86/sha512-avx2-asm.S
@@ -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
diff --git a/lib/crypto/x86/sha512-ssse3-asm.S b/lib/crypto/x86/sha512-ssse3-asm.S
index 4cae7445b2a8..1a37b7a735cf 100644
--- a/lib/crypto/x86/sha512-ssse3-asm.S
+++ b/lib/crypto/x86/sha512-ssse3-asm.S
@@ -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)
--
2.56.0
next prev parent reply other threads:[~2026-10-11 13:49 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-11 13:48 [PATCH 0/3] lib/crypto: x86/sha: Follow the normal %rbp convention Eric Biggers
2026-10-11 13:48 ` [PATCH 1/3] lib/crypto: x86/sha1: " Eric Biggers
2026-10-11 13:48 ` [PATCH 2/3] lib/crypto: x86/sha256: " Eric Biggers
2026-10-11 13:48 ` Eric Biggers [this message]
2026-10-12 5:22 ` [PATCH 0/3] lib/crypto: x86/sha: " Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261011134843.166585-4-ebiggers@kernel.org \
--to=ebiggers@kernel.org \
--cc=Jason@zx2c4.com \
--cc=ardb@kernel.org \
--cc=herbert@gondor.apana.org.au \
--cc=linux-crypto@vger.kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox