x86/smpboot: Remove early_gdt_descr on 64-bit
authorBrian Gerst <brgerst@gmail.com>
Thu, 16 Mar 2023 22:21:04 +0000 (22:21 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 21 Mar 2023 12:35:53 +0000 (13:35 +0100)
Build the GDT descriptor on the stack instead.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Usama Arif <usama.arif@bytedance.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Usama Arif <usama.arif@bytedance.com>
Tested-by: Guilherme G. Piccoli <gpiccoli@igalia.com>
Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
Link: https://lore.kernel.org/r/20230316222109.1940300-8-usama.arif@bytedance.com
arch/x86/kernel/acpi/sleep.c
arch/x86/kernel/head_64.S
arch/x86/kernel/smpboot.c

index 1b4c43d..de89bb4 100644 (file)
@@ -127,8 +127,6 @@ int x86_acpi_suspend_lowlevel(void)
         * value is in the actual %rsp register.
         */
        current->thread.sp = (unsigned long)temp_stack + sizeof(temp_stack);
-       early_gdt_descr.address =
-                       (unsigned long)get_cpu_gdt_rw(smp_processor_id());
        initial_gs = per_cpu_offset(smp_processor_id());
        smpboot_control = smp_processor_id();
 #endif
index cc1b145..a5b46c2 100644 (file)
@@ -265,7 +265,12 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
         * addresses where we're currently running on. We have to do that here
         * because in 32bit we couldn't load a 64bit linear address.
         */
-       lgdt    early_gdt_descr(%rip)
+       subq    $16, %rsp
+       movw    $(GDT_SIZE-1), (%rsp)
+       leaq    gdt_page(%rdx), %rax
+       movq    %rax, 2(%rsp)
+       lgdt    (%rsp)
+       addq    $16, %rsp
 
        /* set up data segments */
        xorl %eax,%eax
@@ -667,10 +672,6 @@ SYM_DATA_END(level1_fixmap_pgt)
        .data
        .align 16
 
-SYM_DATA(early_gdt_descr,              .word GDT_ENTRIES*8-1)
-SYM_DATA_LOCAL(early_gdt_descr_base,   .quad INIT_PER_CPU_VAR(gdt_page))
-
-       .align 16
 SYM_DATA(smpboot_control,              .long 0)
 
        .align 16
index a1531cc..94e6c54 100644 (file)
@@ -1086,10 +1086,10 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle,
                start_ip = real_mode_header->trampoline_start64;
 #endif
        idle->thread.sp = (unsigned long)task_pt_regs(idle);
-       early_gdt_descr.address = (unsigned long)get_cpu_gdt_rw(cpu);
        initial_code = (unsigned long)start_secondary;
 
        if (IS_ENABLED(CONFIG_X86_32)) {
+               early_gdt_descr.address = (unsigned long)get_cpu_gdt_rw(cpu);
                initial_stack  = idle->thread.sp;
        } else {
                smpboot_control = cpu;