Messages in this thread | | | From | Ard Biesheuvel <> | Date | Tue, 27 Feb 2024 15:57:42 +0100 | Subject | Re: [PATCH v2] x86/boot/64: Load kernel GDT in early boot |
| |
On Mon, 26 Feb 2024 at 23:05, Brian Gerst <brgerst@gmail.com> wrote: > > Instead of loading a duplicate GDT just for early boot, load the kernel > GDT from its physical address. > > Signed-off-by: Brian Gerst <brgerst@gmail.com> > --- > v2: Updated to latest tip tree >
Acked-by: Ard Biesheuvel <ardb@kernel.org>
> arch/x86/include/asm/desc.h | 1 + > arch/x86/kernel/head64.c | 13 ++----------- > 2 files changed, 3 insertions(+), 11 deletions(-) > > diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h > index ec95fe44fa3a..62dc9f59ea76 100644 > --- a/arch/x86/include/asm/desc.h > +++ b/arch/x86/include/asm/desc.h > @@ -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) > diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c > index 72351c3121a6..fd77a266f29d 100644 > --- a/arch/x86/kernel/head64.c > +++ b/arch/x86/kernel/head64.c > @@ -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 */ > > base-commit: afb9cce6ad6e808cf659f43925941be96f61b9c9 > -- > 2.43.2 >
| |