Skip to content

Commit 57e2428

Browse files
thejhIngo Molnar
authored andcommitted
x86/entry: Fix ORC unwinder for PUSH_REGS with save_ret=1
PUSH_REGS with save_ret=1 is used by interrupt entry helper functions that initially start with a UNWIND_HINT_FUNC ORC state. However, save_ret=1 means that we clobber the helper function's return address (and then later restore the return address further down on the stack); after that point, the only thing on the stack we can unwind through is the IRET frame, so use UNWIND_HINT_IRET_REGS until we have a full pt_regs frame. ( An alternate approach would be to move the pt_regs->di overwrite down such that it is the final step of pt_regs setup; but I don't want to rearrange entry code just to make unwinding a tiny bit more elegant. ) Fixes: 9e809d1 ("x86/entry: Reduce the code footprint of the 'idtentry' macro") Signed-off-by: Jann Horn <jannh@google.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Brian Gerst <brgerst@gmail.com> Cc: Juergen Gross <jgross@suse.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Kees Cook <keescook@chromium.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Link: https://lore.kernel.org/r/20250325-2025-03-unwind-fixes-v1-1-acd774364768@google.com
1 parent 2704ad5 commit 57e2428

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

arch/x86/entry/calling.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ For 32-bit we have the following conventions - kernel is built with
7070
pushq %rsi /* pt_regs->si */
7171
movq 8(%rsp), %rsi /* temporarily store the return address in %rsi */
7272
movq %rdi, 8(%rsp) /* pt_regs->di (overwriting original return address) */
73+
/* We just clobbered the return address - use the IRET frame for unwinding: */
74+
UNWIND_HINT_IRET_REGS offset=3*8
7375
.else
7476
pushq %rdi /* pt_regs->di */
7577
pushq %rsi /* pt_regs->si */

0 commit comments

Comments
 (0)