Commit 11e36b0f authored by Brian Gerst's avatar Brian Gerst Committed by Ingo Molnar
Browse files

x86/boot/64: Load the final kernel GDT during early boot directly, remove startup_gdt[]



Instead of loading a duplicate GDT just for early boot, load the kernel
GDT from its physical address.

Signed-off-by: default avatarBrian Gerst <brgerst@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lore.kernel.org/r/20240226220544.70769-1-brgerst@gmail.com
parent 533568e0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ struct gdt_page {
} __attribute__((aligned(PAGE_SIZE)));

DECLARE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page);
DECLARE_INIT_PER_CPU(gdt_page);

/* Provide the original GDT */
static inline struct desc_struct *get_cpu_gdt_rw(unsigned int cpu)
+2 −11
Original line number Diff line number Diff line
@@ -68,15 +68,6 @@ unsigned long vmemmap_base __ro_after_init = __VMEMMAP_BASE_L4;
EXPORT_SYMBOL(vmemmap_base);
#endif

/*
 * GDT used on the boot CPU before switching to virtual addresses.
 */
static struct desc_struct startup_gdt[GDT_ENTRIES] __initdata = {
	[GDT_ENTRY_KERNEL32_CS]         = GDT_ENTRY_INIT(DESC_CODE32, 0, 0xfffff),
	[GDT_ENTRY_KERNEL_CS]           = GDT_ENTRY_INIT(DESC_CODE64, 0, 0xfffff),
	[GDT_ENTRY_KERNEL_DS]           = GDT_ENTRY_INIT(DESC_DATA64, 0, 0xfffff),
};

#ifdef CONFIG_X86_5LEVEL
static void __head *fixup_pointer(void *ptr, unsigned long physaddr)
{
@@ -589,8 +580,8 @@ void __head startup_64_setup_gdt_idt(void)
	void *handler = NULL;

	struct desc_ptr startup_gdt_descr = {
		.address = (unsigned long)&RIP_REL_REF(startup_gdt),
		.size    = sizeof(startup_gdt) - 1,
		.address = (unsigned long)&RIP_REL_REF(init_per_cpu_var(gdt_page.gdt)),
		.size    = GDT_SIZE - 1,
	};

	/* Load GDT */