mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
x86/kexec: Add relocate_kernel() debugging support: Load a GDT
There are some failure modes which lead to triple-faults in the relocate_kernel() function, which is fairly much undebuggable for normal mortals. Adding a GDT in the relocate_kernel() environment is step 1 towards being able to catch faults and do something more useful. Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Brian Gerst <brgerst@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/20250312144257.2348250-2-dwmw2@infradead.org
This commit is contained in:
parent
e27dffba1b
commit
b25eb5f5e4
|
|
@ -40,6 +40,16 @@ SYM_DATA(kexec_pa_table_page, .quad 0)
|
|||
SYM_DATA(kexec_pa_swap_page, .quad 0)
|
||||
SYM_DATA_LOCAL(pa_backup_pages_map, .quad 0)
|
||||
|
||||
.balign 16
|
||||
SYM_DATA_START_LOCAL(kexec_debug_gdt)
|
||||
.word kexec_debug_gdt_end - kexec_debug_gdt - 1
|
||||
.long 0
|
||||
.word 0
|
||||
.quad 0x00cf9a000000ffff /* __KERNEL32_CS */
|
||||
.quad 0x00af9a000000ffff /* __KERNEL_CS */
|
||||
.quad 0x00cf92000000ffff /* __KERNEL_DS */
|
||||
SYM_DATA_END_LABEL(kexec_debug_gdt, SYM_L_LOCAL, kexec_debug_gdt_end)
|
||||
|
||||
.section .text..relocate_kernel,"ax";
|
||||
.code64
|
||||
SYM_CODE_START_NOALIGN(relocate_kernel)
|
||||
|
|
@ -116,6 +126,19 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
|
|||
/* store the start address on the stack */
|
||||
pushq %rdx
|
||||
|
||||
/* Create a GDTR (16 bits limit, 64 bits addr) on stack */
|
||||
leaq kexec_debug_gdt(%rip), %rax
|
||||
pushq %rax
|
||||
pushw (%rax)
|
||||
|
||||
/* Load the GDT, put the stack back */
|
||||
lgdt (%rsp)
|
||||
addq $10, %rsp
|
||||
|
||||
/* Test that we can load segments */
|
||||
movq %ds, %rax
|
||||
movq %rax, %ds
|
||||
|
||||
/*
|
||||
* Clear X86_CR4_CET (if it was set) such that we can clear CR0_WP
|
||||
* below.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user