Skip to content

Commit b25eb5f

Browse files
dwmw2Ingo Molnar
authored andcommitted
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
1 parent e27dffb commit b25eb5f

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

arch/x86/kernel/relocate_kernel_64.S

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ SYM_DATA(kexec_pa_table_page, .quad 0)
4040
SYM_DATA(kexec_pa_swap_page, .quad 0)
4141
SYM_DATA_LOCAL(pa_backup_pages_map, .quad 0)
4242

43+
.balign 16
44+
SYM_DATA_START_LOCAL(kexec_debug_gdt)
45+
.word kexec_debug_gdt_end - kexec_debug_gdt - 1
46+
.long 0
47+
.word 0
48+
.quad 0x00cf9a000000ffff /* __KERNEL32_CS */
49+
.quad 0x00af9a000000ffff /* __KERNEL_CS */
50+
.quad 0x00cf92000000ffff /* __KERNEL_DS */
51+
SYM_DATA_END_LABEL(kexec_debug_gdt, SYM_L_LOCAL, kexec_debug_gdt_end)
52+
4353
.section .text..relocate_kernel,"ax";
4454
.code64
4555
SYM_CODE_START_NOALIGN(relocate_kernel)
@@ -116,6 +126,19 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
116126
/* store the start address on the stack */
117127
pushq %rdx
118128

129+
/* Create a GDTR (16 bits limit, 64 bits addr) on stack */
130+
leaq kexec_debug_gdt(%rip), %rax
131+
pushq %rax
132+
pushw (%rax)
133+
134+
/* Load the GDT, put the stack back */
135+
lgdt (%rsp)
136+
addq $10, %rsp
137+
138+
/* Test that we can load segments */
139+
movq %ds, %rax
140+
movq %rax, %ds
141+
119142
/*
120143
* Clear X86_CR4_CET (if it was set) such that we can clear CR0_WP
121144
* below.

0 commit comments

Comments
 (0)