* [PATCH v2] x86/kexec: Push kjump return address even for non-kjump kexec
@ 2026-04-28 20:59 David Woodhouse
2026-05-07 22:08 ` Dave Hansen
0 siblings, 1 reply; 2+ messages in thread
From: David Woodhouse @ 2026-04-28 20:59 UTC (permalink / raw)
To: Dave Hansen, Rohan Kakulawaram, kexec
Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H. Peter Anvin, David Woodhouse, Kai Huang, Paolo Bonzini,
Uros Bizjak, Sohil Mehta, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1887 bytes --]
From: David Woodhouse <dwmw@amazon.co.uk>
The version of purgatory code shipped by kexec-tools attempts to look
above the top of its stack to find a return address for a kjump, even
in a non-kjump kexec. Since commit 2cacf7f23a02 ("x86/kexec: Fix stack
and handling of re-entry point for ::preserve_context") the word above
the stack might not be there, leading to a fault (which is at least
now caught by my exception-handling code in kexec).
That commit fixed things for the actual kjump path, but no longer
"gratuitously" pushes the unused return address to the stack in the
non-kjump path. Put that *back* in the non-kjump path, to prevent
purgatory from crashing when trying to access it.
Reported-by: Rohan Kakulawaram <rohanka@google.com>
Tested-by: Rohan Kakulawaram <rohanka@google.com>
Fixes: 2cacf7f23a02 ("x86/kexec: Fix stack and handling of re-entry point for ::preserve_context")
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
v2: Improve comment
arch/x86/kernel/relocate_kernel_64.S | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S
index 4ffba68dc57b..eaeb77464c06 100644
--- a/arch/x86/kernel/relocate_kernel_64.S
+++ b/arch/x86/kernel/relocate_kernel_64.S
@@ -136,6 +136,14 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
* %r13 original CR4 when relocate_kernel() was invoked
*/
+ /*
+ * Set return address to 0 if not preserving context. The purgatory
+ * shipped in kexec-tools will unconditionally look for the return
+ * address on the stack and set a kexec_jump_back_entry= command
+ * line option if it's non-zero. There's no other way that it can
+ * tell a preserve-context (kjump) kexec from a normal one.
+ */
+ pushq $0
/* store the start address on the stack */
pushq %rdx
--
2.43.0
[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5069 bytes --]
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] x86/kexec: Push kjump return address even for non-kjump kexec
2026-04-28 20:59 [PATCH v2] x86/kexec: Push kjump return address even for non-kjump kexec David Woodhouse
@ 2026-05-07 22:08 ` Dave Hansen
0 siblings, 0 replies; 2+ messages in thread
From: Dave Hansen @ 2026-05-07 22:08 UTC (permalink / raw)
To: David Woodhouse, Rohan Kakulawaram, kexec
Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H. Peter Anvin, David Woodhouse, Kai Huang, Paolo Bonzini,
Uros Bizjak, Sohil Mehta, linux-kernel
On 4/28/26 13:59, David Woodhouse wrote:
> + /*
> + * Set return address to 0 if not preserving context. The purgatory
> + * shipped in kexec-tools will unconditionally look for the return
> + * address on the stack and set a kexec_jump_back_entry= command
> + * line option if it's non-zero. There's no other way that it can
> + * tell a preserve-context (kjump) kexec from a normal one.
> + */
> + pushq $0
Thanks for the update. LGTM:
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-05-07 22:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-28 20:59 [PATCH v2] x86/kexec: Push kjump return address even for non-kjump kexec David Woodhouse
2026-05-07 22:08 ` Dave Hansen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox