Debugging kexec failures is painful, as anything going wrong in execution of the critical relocate_kernel() function tends to just lead to a triple fault. Thus leading to *weeks* of my life that I won't get back. Having hacked something up for my own use, I figured I should share it... Add a CONFIG_KEXEC_DEBUG option which sets up a trivial exception handler in that environment, and outputs to the early_printk serial console if configured. Currently only I/O-based 8250 serial ports are supported, but that could be extended. While we're here, clean the code up a little and fix some other problems. Most notably, load a suitable GDT on the way back into the kernel after a KEXEC_PRESERVE_CONTEXT invocation instead of trusting the called code to do so. And explicitly map the control_code_page into the identmap used by relocate_kernel() instead of depending on it being in the same superpage as something else that gets mapped. I should probably bring the i386 version into line with this, although the lack of rip-based addressing makes all the PIC code a bit harder. David Woodhouse (20): x86/kexec: Ensure control_code_page is mapped in kexec page tables x86/kexec: Restore GDT on return from preserve_context kexec x86/kexec: Clean up and document register use in relocate_kernel_64.S x86/kexec: Use named labels in swap_pages in relocate_kernel_64.S x86/kexec: Only swap pages for preserve_context mode x86/kexec: Allocate PGD for x86_64 transition page tables separately x86/kexec: Copy control page into place in machine_kexec_prepare() x86/kexec: Invoke copy of relocate_kernel() instead of the original x86/kexec: Move relocate_kernel to kernel .data section x86/kexec: Add data section to relocate_kernel x86/kexec: Drop page_list argument from relocate_kernel() x86/kexec: Eliminate writes through kernel mapping of relocate_kernel page x86/kexec: Clean up register usage in relocate_kernel() x86/kexec: Mark relocate_kernel page as ROX instead of RWX x86/kexec: Add CONFIG_KEXEC_DEBUG option x86/kexec: Debugging support: load a GDT x86/kexec: Debugging support: Load an IDT and basic exception entry points x86/kexec: Debugging support: Dump registers on exception x86/kexec: Add 8250 serial port output [DO NOT MERGE] x86/kexec: Add int3 in kexec path for testing arch/x86/Kconfig.debug | 8 + arch/x86/include/asm/kexec.h | 34 +++- arch/x86/include/asm/sections.h | 1 + arch/x86/kernel/callthunks.c | 6 + arch/x86/kernel/early_printk.c | 6 + arch/x86/kernel/machine_kexec_64.c | 127 ++++++++---- arch/x86/kernel/relocate_kernel_64.S | 385 +++++++++++++++++++++++++++-------- arch/x86/kernel/vmlinux.lds.S | 16 +-