From 5cdae3c505f3c0e9c261e19a5b3733161e696603 Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Tue, 17 Mar 2026 19:44:56 +0000 Subject: [PATCH] x86/kexec: Fix and expand comments for kexec_reloc() The order of shutdown is delicate. Explain things a little better. Fix two comments about leaving Long Mode. Signed-off-by: Andrew Cooper Acked-by: Jan Beulich Release-Acked-by: Oleksii Kurochko --- xen/arch/x86/x86_64/kexec_reloc.S | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/x86_64/kexec_reloc.S b/xen/arch/x86/x86_64/kexec_reloc.S index b52d31a654..d0951ea1e1 100644 --- a/xen/arch/x86/x86_64/kexec_reloc.S +++ b/xen/arch/x86/x86_64/kexec_reloc.S @@ -27,6 +27,14 @@ .section .text.kexec, "ax", @progbits .code64 + /* + * kexec_reloc() is entered in it's natural position within Xen. + * + * A copy of .text.kexec is identity mapped at %rdi within the + * pagetables in %rsi. Xen's .text is mapped into %rsi at it's high + * alias allowing to pivot, but most other things including the stacks + * are not mapped. + */ FUNC(kexec_reloc, PAGE_SIZE) /* %rdi - code page maddr */ /* %rsi - page table maddr */ @@ -36,10 +44,17 @@ FUNC(kexec_reloc, PAGE_SIZE) movq %rcx, %rbp - /* Setup stack. */ + /* + * Move to the identity mapped stack. + * + * Note this mapping doesn't exist until the pagetable switch. + */ leaq (.Lreloc_stack_base - kexec_reloc)(%rdi), %rsp - /* Load reloc page table. */ + /* + * Move to the relocation pagetables. Xen's .text is mapped allowing + * the pivot, but very little else is. + */ movq %rsi, %cr3 /* Jump to identity mapped code. */ @@ -153,12 +168,12 @@ FUNC_LOCAL(compatibility_mode) movl %eax, %gs movl %eax, %ss - /* Disable paging and therefore leave 64 bit mode. */ + /* Disable paging and therefore leave long mode. */ movl %cr0, %eax andl $~X86_CR0_PG, %eax movl %eax, %cr0 - /* Disable long mode */ + /* Clear EFER.LME */ movl $MSR_EFER, %ecx rdmsr andl $~EFER_LME, %eax