]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
x86/kexec: Ensure preserve_context flag is set on return to kernel
authorDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 9 Jan 2025 14:04:14 +0000 (14:04 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 14 Jan 2025 11:52:47 +0000 (12:52 +0100)
The swap_pages() function will only actually *swap*, as its name implies, if
the preserve_context flag in the %r11 register is non-zero. On the way back
from a ::preserve_context kexec, ensure that the %r11 register is non-zero so
that the pages get swapped back.

Fixes: 9e5683e2d0b5 ("x86/kexec: Only swap pages for ::preserve_context mode")
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20250109140757.2841269-3-dwmw2@infradead.org
arch/x86/kernel/relocate_kernel_64.S

index 9bd601dd865908ec42c7859f1b324df7af0c16e4..6fce4b459652c1d98fa821b523c225633ee85955 100644 (file)
@@ -220,6 +220,7 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
        movq    kexec_pa_table_page(%rip), %rax
        movq    %rax, %cr3
        lea     PAGE_SIZE(%r8), %rsp
+       movl    $1, %r11d       /* Ensure preserve_context flag is set */
        call    swap_pages
        movq    kexec_va_control_page(%rip), %rax
        addq    $(virtual_mapped - relocate_kernel), %rax