[RFC PATCH 4/9] x86/purgatory: Avoid absolute reference to GDT
Ard Biesheuvel
ardb+git at google.com
Wed Apr 24 08:53:14 PDT 2024
From: Ard Biesheuvel <ardb at kernel.org>
The purgatory is almost entirely position independent, without any need
for any relocation processing at load time except for the reference to
the GDT in the entry code. Generate this reference at runtime instead,
to remove the last R_X86_64_64 relocation from this code.
While the GDT itself needs to be preserved in memory as long as it is
live, the GDT descriptor that is used to program the GDT can be
discarded so it can be allocated on the stack.
Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
---
arch/x86/purgatory/entry64.S | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/arch/x86/purgatory/entry64.S b/arch/x86/purgatory/entry64.S
index 9913877b0dbe..888661d9db9c 100644
--- a/arch/x86/purgatory/entry64.S
+++ b/arch/x86/purgatory/entry64.S
@@ -16,7 +16,11 @@
SYM_CODE_START(entry64)
/* Setup a gdt that should be preserved */
- lgdt gdt(%rip)
+ leaq gdt(%rip), %rax
+ pushq %rax
+ pushw $gdt_end - gdt - 1
+ lgdt (%rsp)
+ addq $10, %rsp
/* load the data segments */
movl $0x18, %eax /* data segment */
@@ -83,8 +87,8 @@ SYM_DATA_START_LOCAL(gdt)
* 0x08 unused
* so use them as gdt ptr
*/
- .word gdt_end - gdt - 1
- .quad gdt
+ .word 0
+ .quad 0
.word 0, 0, 0
/* 0x10 4GB flat code segment */
--
2.44.0.769.g3c40516874-goog
More information about the kexec
mailing list