linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] x86-64: Remove global variables from boot
@ 2023-02-22 22:12 Brian Gerst
  2023-02-22 22:12 ` [PATCH 1/6] x86/smpboot: Use CPU number instead of APIC ID for single CPU startup Brian Gerst
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:12 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

This is on top of the parallel boot v10 series.

Remove the global variables initial_gs, initial_stack, and
early_gdt_descr from the 64-bit boot code.  The stack, GDT, and GSBASE
can be determined from the CPU number.

Brian Gerst (6):
  x86/smpboot: Use CPU number instead of APIC ID for single CPU startup
  x86/smpboot: Use current_task to get idle thread
  x86/smpboot: Remove initial_stack on 64-bit
  x86/smpbppt: Remove early_gdt_descr on 64-bit
  x86/smpboot: Remove initial_gs
  x86/smpboot: Simplify boot CPU setup

 arch/x86/include/asm/processor.h |   6 +-
 arch/x86/include/asm/realmode.h  |   1 -
 arch/x86/include/asm/smp.h       |   1 -
 arch/x86/kernel/acpi/sleep.c     |   5 +-
 arch/x86/kernel/asm-offsets.c    |   1 +
 arch/x86/kernel/head_64.S        | 108 ++++++++++++-------------------
 arch/x86/kernel/smpboot.c        |   6 +-
 arch/x86/xen/xen-head.S          |   2 +-
 kernel/smpboot.c                 |   2 +-
 9 files changed, 53 insertions(+), 79 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 1/6] x86/smpboot: Use CPU number instead of APIC ID for single CPU startup
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
@ 2023-02-22 22:12 ` Brian Gerst
  2023-02-22 22:12 ` [PATCH 2/6] x86/smpboot: Use current_task to get idle thread Brian Gerst
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:12 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

Encoding the CPU number directly in smpboot_control skips the APIC ID
lookup when booting a single CPU.  This will enable the boot CPU to use
the same code as secondaries, since the APIC ID array is not populated
during early boot.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/kernel/head_64.S | 12 +++++++-----
 arch/x86/kernel/smpboot.c |  2 +-
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 0e4e53d231db..c1253aa737ca 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -252,20 +252,22 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	jz	.Lsetup_cpu
 
 	/*
-	 * Secondary CPUs find out the offsets via the APIC ID. For parallel
-	 * boot the APIC ID is retrieved from CPUID, otherwise it's encoded
-	 * in smpboot_control:
+	 * For parallel boot, the APIC ID is retrieved from CPUID, and then
+	 * used to look up the CPU number.  For booting a single CPU, the
+	 * CPU number is encoded in smpboot_control.
+	 *
 	 * Bit 31	STARTUP_SECONDARY flag (checked above)
 	 * Bit 30	STARTUP_APICID_CPUID_0B flag (use CPUID 0x0b)
 	 * Bit 29	STARTUP_APICID_CPUID_01 flag (use CPUID 0x01)
-	 * Bit 0-24	APIC ID if STARTUP_APICID_CPUID_xx flags are not set
+	 * Bit 0-24	CPU# if STARTUP_APICID_CPUID_xx flags are not set
 	 */
 	testl	$STARTUP_APICID_CPUID_0B, %edx
 	jnz	.Luse_cpuid_0b
 	testl	$STARTUP_APICID_CPUID_01, %edx
 	jnz	.Luse_cpuid_01
 	andl	$0x0FFFFFFF, %edx
-	jmp	.Lsetup_AP
+	movl	%edx, %ecx
+	jmp	.Linit_cpu_data
 
 .Luse_cpuid_01:
 	mov	$0x01, %eax
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 5b6d72b3d14b..e1a2843c2841 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1140,7 +1140,7 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle,
 		early_gdt_descr.address = (unsigned long)get_cpu_gdt_rw(cpu);
 		initial_stack  = idle->thread.sp;
 	} else if (!do_parallel_bringup) {
-		smpboot_control = STARTUP_SECONDARY | apicid;
+		smpboot_control = STARTUP_SECONDARY | cpu;
 	}
 
 	/* Enable the espfix hack for this CPU */
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/6] x86/smpboot: Use current_task to get idle thread
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
  2023-02-22 22:12 ` [PATCH 1/6] x86/smpboot: Use CPU number instead of APIC ID for single CPU startup Brian Gerst
@ 2023-02-22 22:12 ` Brian Gerst
  2023-02-22 22:12 ` [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit Brian Gerst
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:12 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

The idle_threads array is not populated during early boot.  Use
current_task instead, which is initialized to init_task for the boot
CPU.

Also simplify start_cpu0().  Since the boot CPU never really goes
offline, the GSBASE is still set up and can be used for per-cpu
accesses.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/kernel/asm-offsets.c | 1 +
 arch/x86/kernel/head_64.S     | 7 ++-----
 kernel/smpboot.c              | 2 +-
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c
index 8650f29387e0..445bce086717 100644
--- a/arch/x86/kernel/asm-offsets.c
+++ b/arch/x86/kernel/asm-offsets.c
@@ -114,6 +114,7 @@ static void __used common(void)
 	OFFSET(TSS_sp1, tss_struct, x86_tss.sp1);
 	OFFSET(TSS_sp2, tss_struct, x86_tss.sp2);
 	OFFSET(X86_top_of_stack, pcpu_hot, top_of_stack);
+	OFFSET(X86_current_task, pcpu_hot, current_task);
 #ifdef CONFIG_CALL_DEPTH_TRACKING
 	OFFSET(X86_call_depth, pcpu_hot, call_depth);
 #endif
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index c1253aa737ca..c32e5b06a9ce 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -315,7 +315,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	movq	%rcx, early_gdt_descr_base(%rip)
 
 	/* Find the idle task stack */
-	movq	idle_threads(%rbx), %rcx
+	movq	pcpu_hot + X86_current_task(%rbx), %rcx
 	movq	TASK_threadsp(%rcx), %rcx
 	movq	%rcx, initial_stack(%rip)
 #endif /* CONFIG_SMP */
@@ -460,12 +460,9 @@ SYM_CODE_END(secondary_startup_64)
 SYM_CODE_START(start_cpu0)
 	ANNOTATE_NOENDBR
 	UNWIND_HINT_EMPTY
-	/* Load the per-cpu base for CPU#0 */
-	leaq	__per_cpu_offset(%rip), %rbx
-	movq	(%rbx), %rbx
 
 	/* Find the idle task stack */
-	movq	idle_threads(%rbx), %rcx
+	movq	PER_CPU_VAR(pcpu_hot) + X86_current_task, %rcx
 	movq	TASK_threadsp(%rcx), %rsp
 
 	jmp	.Ljump_to_C_code
diff --git a/kernel/smpboot.c b/kernel/smpboot.c
index a18a21dff9bc..2c7396da470c 100644
--- a/kernel/smpboot.c
+++ b/kernel/smpboot.c
@@ -25,7 +25,7 @@
  * For the hotplug case we keep the task structs around and reuse
  * them.
  */
-DEFINE_PER_CPU(struct task_struct *, idle_threads);
+static DEFINE_PER_CPU(struct task_struct *, idle_threads);
 
 struct task_struct *idle_thread_get(unsigned int cpu)
 {
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
  2023-02-22 22:12 ` [PATCH 1/6] x86/smpboot: Use CPU number instead of APIC ID for single CPU startup Brian Gerst
  2023-02-22 22:12 ` [PATCH 2/6] x86/smpboot: Use current_task to get idle thread Brian Gerst
@ 2023-02-22 22:12 ` Brian Gerst
  2023-02-23  8:05   ` David Woodhouse
  2023-02-22 22:12 ` [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr " Brian Gerst
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:12 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

Load RSP from current_task->thread.sp instead.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/processor.h |  6 +++++-
 arch/x86/kernel/acpi/sleep.c     |  2 +-
 arch/x86/kernel/head_64.S        | 35 ++++++++++++++++++--------------
 arch/x86/xen/xen-head.S          |  2 +-
 4 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 8d73004e4cac..7f64b69c2b0e 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -647,7 +647,11 @@ static inline void spin_lock_prefetch(const void *x)
 #define KSTK_ESP(task)		(task_pt_regs(task)->sp)
 
 #else
-#define INIT_THREAD { }
+extern unsigned long __end_init_task[];
+
+#define INIT_THREAD {							\
+	.sp	= (unsigned long)&__end_init_task - PTREGS_SIZE,	\
+}
 
 extern unsigned long KSTK_ESP(struct task_struct *task);
 
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 47e75c056cb5..008fda8b1982 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -113,7 +113,7 @@ int x86_acpi_suspend_lowlevel(void)
 	saved_magic = 0x12345678;
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
-	initial_stack = (unsigned long)temp_stack + sizeof(temp_stack);
+	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());
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index c32e5b06a9ce..f7905ba4b992 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -62,8 +62,8 @@ SYM_CODE_START_NOALIGN(startup_64)
 	 * tables and then reload them.
 	 */
 
-	/* Set up the stack for verify_cpu(), similar to initial_stack below */
-	leaq	(__end_init_task - FRAME_SIZE)(%rip), %rsp
+	/* Set up the stack for verify_cpu() */
+	leaq	(__end_init_task - PTREGS_SIZE)(%rip), %rsp
 
 	leaq	_text(%rip), %rdi
 
@@ -245,11 +245,11 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 #ifdef CONFIG_SMP
 	/*
 	 * Is this the boot CPU coming up? If so everything is available
-	 * in initial_gs, initial_stack and early_gdt_descr.
+	 * in initial_gs and early_gdt_descr.
 	 */
 	movl	smpboot_control(%rip), %edx
 	testl	$STARTUP_SECONDARY, %edx
-	jz	.Lsetup_cpu
+	jz	.Linit_cpu0_data
 
 	/*
 	 * For parallel boot, the APIC ID is retrieved from CPUID, and then
@@ -302,6 +302,10 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	hlt
 	jmp	1b
 
+.Linit_cpu0_data:
+	movq	__per_cpu_offset(%rip), %rdx
+	jmp	.Lsetup_cpu
+
 .Linit_cpu_data:
 	/* Get the per cpu offset for the given CPU# which is in ECX */
 	leaq	__per_cpu_offset(%rip), %rbx
@@ -314,13 +318,21 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	addq	%rbx, %rcx
 	movq	%rcx, early_gdt_descr_base(%rip)
 
-	/* Find the idle task stack */
-	movq	pcpu_hot + X86_current_task(%rbx), %rcx
-	movq	TASK_threadsp(%rcx), %rcx
-	movq	%rcx, initial_stack(%rip)
+	movq	%rbx, %rdx
+#else
+	xorl	%edx, %edx
 #endif /* CONFIG_SMP */
 
 .Lsetup_cpu:
+	/*
+	 * Setup a boot time stack - Any secondary CPU will have lost its stack
+	 * by now because the cr3-switch above unmaps the real-mode stack
+	 *
+	 * RDX contains the per-cpu offset
+	 */
+	movq	pcpu_hot + X86_current_task(%rdx), %rax
+	movq	TASK_threadsp(%rax), %rsp
+
 	/*
 	 * We must switch to a new descriptor in kernel space for the GDT
 	 * because soon the kernel won't have access anymore to the userspace
@@ -355,12 +367,6 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	movl	initial_gs+4(%rip),%edx
 	wrmsr
 
-	/*
-	 * Setup a boot time stack - Any secondary CPU will have lost its stack
-	 * by now because the cr3-switch above unmaps the real-mode stack
-	 */
-	movq initial_stack(%rip), %rsp
-
 	/* Drop the realmode protection. For the boot CPU the pointer is NULL! */
 	movq	trampoline_lock(%rip), %rax
 	testq	%rax, %rax
@@ -517,7 +523,6 @@ SYM_DATA(initial_vc_handler,	.quad handle_vc_boot_ghcb)
  * The FRAME_SIZE gap is a convention which helps the in-kernel unwinder
  * reliably detect the end of the stack.
  */
-SYM_DATA(initial_stack, .quad init_thread_union + THREAD_SIZE - FRAME_SIZE)
 SYM_DATA(trampoline_lock, .quad 0);
 	__FINITDATA
 
diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S
index e36ea4268bd2..91f7a53519a7 100644
--- a/arch/x86/xen/xen-head.S
+++ b/arch/x86/xen/xen-head.S
@@ -49,7 +49,7 @@ SYM_CODE_START(startup_xen)
 	ANNOTATE_NOENDBR
 	cld
 
-	mov initial_stack(%rip), %rsp
+	leaq	(__end_init_task - PTREGS_SIZE)(%rip), %rsp
 
 	/* Set up %gs.
 	 *
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr on 64-bit
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
                   ` (2 preceding siblings ...)
  2023-02-22 22:12 ` [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit Brian Gerst
@ 2023-02-22 22:12 ` Brian Gerst
  2023-02-23  6:49   ` H. Peter Anvin
  2023-02-22 22:13 ` [PATCH 5/6] x86/smpboot: Remove initial_gs Brian Gerst
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:12 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

Build the GDT descriptor on the stack instead.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/kernel/acpi/sleep.c |  2 --
 arch/x86/kernel/head_64.S    | 19 +++++++------------
 2 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 008fda8b1982..6538ddb55f28 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -114,8 +114,6 @@ int x86_acpi_suspend_lowlevel(void)
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
 	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());
 	/* Force the startup into boot mode */
 	saved_smpboot_ctrl = xchg(&smpboot_control, 0);
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index f7905ba4b992..0dd57d573a0e 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -245,7 +245,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 #ifdef CONFIG_SMP
 	/*
 	 * Is this the boot CPU coming up? If so everything is available
-	 * in initial_gs and early_gdt_descr.
+	 * in initial_gs.
 	 */
 	movl	smpboot_control(%rip), %edx
 	testl	$STARTUP_SECONDARY, %edx
@@ -313,11 +313,6 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	/* Save it for GS BASE setup */
 	movq	%rbx, initial_gs(%rip)
 
-	/* Calculate the GDT address */
-	movq	$gdt_page, %rcx
-	addq	%rbx, %rcx
-	movq	%rcx, early_gdt_descr_base(%rip)
-
 	movq	%rbx, %rdx
 #else
 	xorl	%edx, %edx
@@ -339,7 +334,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
@@ -754,11 +754,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
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 5/6] x86/smpboot: Remove initial_gs
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
                   ` (3 preceding siblings ...)
  2023-02-22 22:12 ` [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr " Brian Gerst
@ 2023-02-22 22:13 ` Brian Gerst
  2023-02-22 22:13 ` [PATCH 6/6] x86/smpboot: Simplify boot CPU setup Brian Gerst
  2023-02-23 13:44 ` [PATCH 0/6] x86-64: Remove global variables from boot David Woodhouse
  6 siblings, 0 replies; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:13 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

Use the percpu offset directly to set GSBASE.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/realmode.h |  1 -
 arch/x86/kernel/acpi/sleep.c    |  1 -
 arch/x86/kernel/head_64.S       | 34 ++++++++++-----------------------
 3 files changed, 10 insertions(+), 26 deletions(-)

diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
index f0357cfe2fb0..87e5482acd0d 100644
--- a/arch/x86/include/asm/realmode.h
+++ b/arch/x86/include/asm/realmode.h
@@ -60,7 +60,6 @@ extern struct real_mode_header *real_mode_header;
 extern unsigned char real_mode_blob_end[];
 
 extern unsigned long initial_code;
-extern unsigned long initial_gs;
 extern unsigned long initial_stack;
 #ifdef CONFIG_AMD_MEM_ENCRYPT
 extern unsigned long initial_vc_handler;
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 6538ddb55f28..214dd4a79860 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -114,7 +114,6 @@ int x86_acpi_suspend_lowlevel(void)
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
 	current->thread.sp = (unsigned long)temp_stack + sizeof(temp_stack);
-	initial_gs = per_cpu_offset(smp_processor_id());
 	/* Force the startup into boot mode */
 	saved_smpboot_ctrl = xchg(&smpboot_control, 0);
 #endif
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 0dd57d573a0e..9ed87ba0609f 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -67,18 +67,10 @@ SYM_CODE_START_NOALIGN(startup_64)
 
 	leaq	_text(%rip), %rdi
 
-	/*
-	 * initial_gs points to initial fixed_percpu_data struct with storage for
-	 * the stack protector canary. Global pointer fixups are needed at this
-	 * stage, so apply them as is done in fixup_pointer(), and initialize %gs
-	 * such that the canary can be accessed at %gs:40 for subsequent C calls.
-	 */
+	/* Setup GSBASE to allow stack canary access for C code */
 	movl	$MSR_GS_BASE, %ecx
-	movq	initial_gs(%rip), %rax
-	movq	$_text, %rdx
-	subq	%rdx, %rax
-	addq	%rdi, %rax
-	movq	%rax, %rdx
+	leaq	INIT_PER_CPU_VAR(fixed_percpu_data)(%rip), %rdx
+	movl	%edx, %eax
 	shrq	$32,  %rdx
 	wrmsr
 
@@ -243,10 +235,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	ANNOTATE_NOENDBR // above
 
 #ifdef CONFIG_SMP
-	/*
-	 * Is this the boot CPU coming up? If so everything is available
-	 * in initial_gs.
-	 */
+	/* Is this the boot CPU coming up? */
 	movl	smpboot_control(%rip), %edx
 	testl	$STARTUP_SECONDARY, %edx
 	jz	.Linit_cpu0_data
@@ -308,12 +297,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 
 .Linit_cpu_data:
 	/* Get the per cpu offset for the given CPU# which is in ECX */
-	leaq	__per_cpu_offset(%rip), %rbx
-	movq	(%rbx,%rcx,8), %rbx
-	/* Save it for GS BASE setup */
-	movq	%rbx, initial_gs(%rip)
-
-	movq	%rbx, %rdx
+	movq	__per_cpu_offset(,%rcx,8), %rdx
 #else
 	xorl	%edx, %edx
 #endif /* CONFIG_SMP */
@@ -363,8 +347,11 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	 * the per cpu areas are set up.
 	 */
 	movl	$MSR_GS_BASE,%ecx
-	movl	initial_gs(%rip),%eax
-	movl	initial_gs+4(%rip),%edx
+#ifndef CONFIG_SMP
+	leaq	INIT_PER_CPU_VAR(fixed_percpu_data)(%rip), %rdx
+#endif
+	movl	%edx, %eax
+	shrq	$32, %rdx
 	wrmsr
 
 	/* Drop the realmode protection. For the boot CPU the pointer is NULL! */
@@ -514,7 +501,6 @@ SYM_CODE_END(vc_boot_ghcb)
 	__REFDATA
 	.balign	8
 SYM_DATA(initial_code,	.quad x86_64_start_kernel)
-SYM_DATA(initial_gs,	.quad INIT_PER_CPU_VAR(fixed_percpu_data))
 #ifdef CONFIG_AMD_MEM_ENCRYPT
 SYM_DATA(initial_vc_handler,	.quad handle_vc_boot_ghcb)
 #endif
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 6/6] x86/smpboot: Simplify boot CPU setup
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
                   ` (4 preceding siblings ...)
  2023-02-22 22:13 ` [PATCH 5/6] x86/smpboot: Remove initial_gs Brian Gerst
@ 2023-02-22 22:13 ` Brian Gerst
  2023-02-23 12:36   ` David Woodhouse
  2023-02-23 13:44 ` [PATCH 0/6] x86-64: Remove global variables from boot David Woodhouse
  6 siblings, 1 reply; 15+ messages in thread
From: Brian Gerst @ 2023-02-22 22:13 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar,
	Brian Gerst

Now that the per-cpu GSBASE, stack, and GDT descriptor can be derived
dynammically by CPU number, the boot CPU can use a fixed CPU number and
take the same path as secondary CPUs.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/smp.h |  1 -
 arch/x86/kernel/head_64.S  | 25 +++++++------------------
 arch/x86/kernel/smpboot.c  |  6 +++---
 3 files changed, 10 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
index b4b29e052b6e..32c9157238c0 100644
--- a/arch/x86/include/asm/smp.h
+++ b/arch/x86/include/asm/smp.h
@@ -202,7 +202,6 @@ extern unsigned int smpboot_control;
 #endif /* !__ASSEMBLY__ */
 
 /* Control bits for startup_64 */
-#define STARTUP_SECONDARY	0x80000000
 #define STARTUP_APICID_CPUID_0B	0x40000000
 #define STARTUP_APICID_CPUID_01	0x20000000
 
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 9ed87ba0609f..949c13b26811 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -235,28 +235,22 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	ANNOTATE_NOENDBR // above
 
 #ifdef CONFIG_SMP
-	/* Is this the boot CPU coming up? */
-	movl	smpboot_control(%rip), %edx
-	testl	$STARTUP_SECONDARY, %edx
-	jz	.Linit_cpu0_data
-
 	/*
 	 * For parallel boot, the APIC ID is retrieved from CPUID, and then
 	 * used to look up the CPU number.  For booting a single CPU, the
 	 * CPU number is encoded in smpboot_control.
 	 *
-	 * Bit 31	STARTUP_SECONDARY flag (checked above)
 	 * Bit 30	STARTUP_APICID_CPUID_0B flag (use CPUID 0x0b)
 	 * Bit 29	STARTUP_APICID_CPUID_01 flag (use CPUID 0x01)
 	 * Bit 0-24	CPU# if STARTUP_APICID_CPUID_xx flags are not set
 	 */
-	testl	$STARTUP_APICID_CPUID_0B, %edx
+	movl	smpboot_control(%rip), %ecx
+	testl	$STARTUP_APICID_CPUID_0B, %ecx
 	jnz	.Luse_cpuid_0b
-	testl	$STARTUP_APICID_CPUID_01, %edx
+	testl	$STARTUP_APICID_CPUID_01, %ecx
 	jnz	.Luse_cpuid_01
-	andl	$0x0FFFFFFF, %edx
-	movl	%edx, %ecx
-	jmp	.Linit_cpu_data
+	andl	$0x0FFFFFFF, %ecx
+	jmp	.Lsetup_cpu
 
 .Luse_cpuid_01:
 	mov	$0x01, %eax
@@ -277,7 +271,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 
 .Lfind_cpunr:
 	cmpl	(%rbx,%rcx,4), %edx
-	jz	.Linit_cpu_data
+	jz	.Lsetup_cpu
 	inc	%ecx
 	cmpl	nr_cpu_ids(%rip), %ecx
 	jb	.Lfind_cpunr
@@ -291,18 +285,13 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
 	hlt
 	jmp	1b
 
-.Linit_cpu0_data:
-	movq	__per_cpu_offset(%rip), %rdx
-	jmp	.Lsetup_cpu
-
-.Linit_cpu_data:
+.Lsetup_cpu:
 	/* Get the per cpu offset for the given CPU# which is in ECX */
 	movq	__per_cpu_offset(,%rcx,8), %rdx
 #else
 	xorl	%edx, %edx
 #endif /* CONFIG_SMP */
 
-.Lsetup_cpu:
 	/*
 	 * Setup a boot time stack - Any secondary CPU will have lost its stack
 	 * by now because the cr3-switch above unmaps the real-mode stack
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index e1a2843c2841..c159a5c2df9f 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1140,7 +1140,7 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle,
 		early_gdt_descr.address = (unsigned long)get_cpu_gdt_rw(cpu);
 		initial_stack  = idle->thread.sp;
 	} else if (!do_parallel_bringup) {
-		smpboot_control = STARTUP_SECONDARY | cpu;
+		smpboot_control = cpu;
 	}
 
 	/* Enable the espfix hack for this CPU */
@@ -1580,7 +1580,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
 		 */
 		if (eax) {
 			pr_debug("Using CPUID 0xb for parallel CPU startup\n");
-			smpboot_control = STARTUP_SECONDARY | STARTUP_APICID_CPUID_0B;
+			smpboot_control = STARTUP_APICID_CPUID_0B;
 		} else {
 			pr_info("Disabling parallel bringup because CPUID 0xb looks untrustworthy\n");
 			do_parallel_bringup = false;
@@ -1588,7 +1588,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
 	} else if (do_parallel_bringup) {
 		/* Without X2APIC, what's in CPUID 0x01 should suffice. */
 		pr_debug("Using CPUID 0x1 for parallel CPU startup\n");
-		smpboot_control = STARTUP_SECONDARY | STARTUP_APICID_CPUID_01;
+		smpboot_control = STARTUP_APICID_CPUID_01;
 	}
 
 	if (do_parallel_bringup) {
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr on 64-bit
  2023-02-22 22:12 ` [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr " Brian Gerst
@ 2023-02-23  6:49   ` H. Peter Anvin
  2023-02-23 12:10     ` Brian Gerst
  0 siblings, 1 reply; 15+ messages in thread
From: H. Peter Anvin @ 2023-02-23  6:49 UTC (permalink / raw)
  To: Brian Gerst, linux-kernel, x86
  Cc: David Woodhouse, Usama Arif, Thomas Gleixner, Borislav Petkov,
	Peter Zijlstra, Andy Lutomirski, Ingo Molnar

On February 22, 2023 2:12:59 PM PST, Brian Gerst <brgerst@gmail.com> wrote:
>Build the GDT descriptor on the stack instead.
>
>Signed-off-by: Brian Gerst <brgerst@gmail.com>
>---
> arch/x86/kernel/acpi/sleep.c |  2 --
> arch/x86/kernel/head_64.S    | 19 +++++++------------
> 2 files changed, 7 insertions(+), 14 deletions(-)
>
>diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
>index 008fda8b1982..6538ddb55f28 100644
>--- a/arch/x86/kernel/acpi/sleep.c
>+++ b/arch/x86/kernel/acpi/sleep.c
>@@ -114,8 +114,6 @@ int x86_acpi_suspend_lowlevel(void)
> #else /* CONFIG_64BIT */
> #ifdef CONFIG_SMP
> 	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());
> 	/* Force the startup into boot mode */
> 	saved_smpboot_ctrl = xchg(&smpboot_control, 0);
>diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
>index f7905ba4b992..0dd57d573a0e 100644
>--- a/arch/x86/kernel/head_64.S
>+++ b/arch/x86/kernel/head_64.S
>@@ -245,7 +245,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
> #ifdef CONFIG_SMP
> 	/*
> 	 * Is this the boot CPU coming up? If so everything is available
>-	 * in initial_gs and early_gdt_descr.
>+	 * in initial_gs.
> 	 */
> 	movl	smpboot_control(%rip), %edx
> 	testl	$STARTUP_SECONDARY, %edx
>@@ -313,11 +313,6 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
> 	/* Save it for GS BASE setup */
> 	movq	%rbx, initial_gs(%rip)
> 
>-	/* Calculate the GDT address */
>-	movq	$gdt_page, %rcx
>-	addq	%rbx, %rcx
>-	movq	%rcx, early_gdt_descr_base(%rip)
>-
> 	movq	%rbx, %rdx
> #else
> 	xorl	%edx, %edx
>@@ -339,7 +334,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
>@@ -754,11 +754,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

This is known to break at least some hypervisors, probably old by now, but...

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit
  2023-02-22 22:12 ` [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit Brian Gerst
@ 2023-02-23  8:05   ` David Woodhouse
  2023-02-23  8:27     ` David Woodhouse
  0 siblings, 1 reply; 15+ messages in thread
From: David Woodhouse @ 2023-02-23  8:05 UTC (permalink / raw)
  To: Brian Gerst, linux-kernel, x86
  Cc: Usama Arif, Thomas Gleixner, Borislav Petkov, H . Peter Anvin,
	Peter Zijlstra, Andy Lutomirski, Ingo Molnar

[-- Attachment #1: Type: text/plain, Size: 1250 bytes --]

On Wed, 2023-02-22 at 17:12 -0500, Brian Gerst wrote:
> @@ -245,11 +245,11 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
>  #ifdef CONFIG_SMP
>         /*
>          * Is this the boot CPU coming up? If so everything is available
> -        * in initial_gs, initial_stack and early_gdt_descr.
> +        * in initial_gs and early_gdt_descr.
>          */
>         movl    smpboot_control(%rip), %edx
>         testl   $STARTUP_SECONDARY, %edx
> -       jz      .Lsetup_cpu
> +       jz      .Linit_cpu0_data
>  
>         /*
>          * For parallel boot, the APIC ID is retrieved from CPUID, and then
> @@ -302,6 +302,10 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
>         hlt
>         jmp     1b
>  
> +.Linit_cpu0_data:
> +       movq    __per_cpu_offset(%rip), %rdx
> +       jmp     .Lsetup_cpu
> +

Aren't all CPUs taking this .Linit_cpu0_data path for non-parallel
startup, not just cpu0? I think you want something more like

.Linit_cpuN_data:
	orl	$0x0fffffff, %edx
	leaq	__per_cpu_offset(%rip), %rbx
	movq	(%rbx,%rdx,8), %rdx
	jmp	.Lsetup_cpu
 

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit
  2023-02-23  8:05   ` David Woodhouse
@ 2023-02-23  8:27     ` David Woodhouse
  0 siblings, 0 replies; 15+ messages in thread
From: David Woodhouse @ 2023-02-23  8:27 UTC (permalink / raw)
  To: Brian Gerst, linux-kernel, x86
  Cc: Usama Arif, Thomas Gleixner, Borislav Petkov, H . Peter Anvin,
	Peter Zijlstra, Andy Lutomirski, Ingo Molnar

[-- Attachment #1: Type: text/plain, Size: 386 bytes --]

On Thu, 2023-02-23 at 08:05 +0000, David Woodhouse wrote:
> 
> 
> Aren't all CPUs taking this .Linit_cpu0_data path for non-parallel
> startup, not just cpu0? I think you want something more like
> 
> .Linit_cpuN_data:
> 	orl	$0x0fffffff, %edx
> 	leaq	__per_cpu_offset(%rip), %rbx
> 	movq	(%rbx,%rdx,8), %rdx
> 	jmp	.Lsetup_cpu
>  

Er, nope. Forget that. More coffee...

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr on 64-bit
  2023-02-23  6:49   ` H. Peter Anvin
@ 2023-02-23 12:10     ` Brian Gerst
  0 siblings, 0 replies; 15+ messages in thread
From: Brian Gerst @ 2023-02-23 12:10 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: linux-kernel, x86, David Woodhouse, Usama Arif, Thomas Gleixner,
	Borislav Petkov, Peter Zijlstra, Andy Lutomirski, Ingo Molnar

On Thu, Feb 23, 2023 at 1:50 AM H. Peter Anvin <hpa@zytor.com> wrote:
>
> On February 22, 2023 2:12:59 PM PST, Brian Gerst <brgerst@gmail.com> wrote:
> >Build the GDT descriptor on the stack instead.
> >
> >Signed-off-by: Brian Gerst <brgerst@gmail.com>
> >---
> > arch/x86/kernel/acpi/sleep.c |  2 --
> > arch/x86/kernel/head_64.S    | 19 +++++++------------
> > 2 files changed, 7 insertions(+), 14 deletions(-)
> >
> >diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
> >index 008fda8b1982..6538ddb55f28 100644
> >--- a/arch/x86/kernel/acpi/sleep.c
> >+++ b/arch/x86/kernel/acpi/sleep.c
> >@@ -114,8 +114,6 @@ int x86_acpi_suspend_lowlevel(void)
> > #else /* CONFIG_64BIT */
> > #ifdef CONFIG_SMP
> >       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());
> >       /* Force the startup into boot mode */
> >       saved_smpboot_ctrl = xchg(&smpboot_control, 0);
> >diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
> >index f7905ba4b992..0dd57d573a0e 100644
> >--- a/arch/x86/kernel/head_64.S
> >+++ b/arch/x86/kernel/head_64.S
> >@@ -245,7 +245,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
> > #ifdef CONFIG_SMP
> >       /*
> >        * Is this the boot CPU coming up? If so everything is available
> >-       * in initial_gs and early_gdt_descr.
> >+       * in initial_gs.
> >        */
> >       movl    smpboot_control(%rip), %edx
> >       testl   $STARTUP_SECONDARY, %edx
> >@@ -313,11 +313,6 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
> >       /* Save it for GS BASE setup */
> >       movq    %rbx, initial_gs(%rip)
> >
> >-      /* Calculate the GDT address */
> >-      movq    $gdt_page, %rcx
> >-      addq    %rbx, %rcx
> >-      movq    %rcx, early_gdt_descr_base(%rip)
> >-
> >       movq    %rbx, %rdx
> > #else
> >       xorl    %edx, %edx
> >@@ -339,7 +334,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
> >@@ -754,11 +754,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
>
> This is known to break at least some hypervisors, probably old by now, but...

I remember some ancient versions of Xen stored the address of the
descriptor, instead of the contents.  But looking at load_direct_gdt()
and load_fixmap_gdt() which both load a descriptor on the stack, I
don't think that is still a concern.

--
Brian Gerst

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 6/6] x86/smpboot: Simplify boot CPU setup
  2023-02-22 22:13 ` [PATCH 6/6] x86/smpboot: Simplify boot CPU setup Brian Gerst
@ 2023-02-23 12:36   ` David Woodhouse
  0 siblings, 0 replies; 15+ messages in thread
From: David Woodhouse @ 2023-02-23 12:36 UTC (permalink / raw)
  To: Brian Gerst, linux-kernel, x86
  Cc: Usama Arif, Thomas Gleixner, Borislav Petkov, H . Peter Anvin,
	Peter Zijlstra, Andy Lutomirski, Ingo Molnar

[-- Attachment #1: Type: text/plain, Size: 345 bytes --]

On Wed, 2023-02-22 at 17:13 -0500, Brian Gerst wrote:
> 
>  /* Control bits for startup_64 */
> -#define STARTUP_SECONDARY      0x80000000
>  #define STARTUP_APICID_CPUID_0B        0x40000000
>  #define STARTUP_APICID_CPUID_01        0x20000000

Might as well change CPUID_01 to 0x80000000 while you're at it?


[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 0/6] x86-64: Remove global variables from boot
  2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
                   ` (5 preceding siblings ...)
  2023-02-22 22:13 ` [PATCH 6/6] x86/smpboot: Simplify boot CPU setup Brian Gerst
@ 2023-02-23 13:44 ` David Woodhouse
  2023-02-23 14:24   ` Brian Gerst
  6 siblings, 1 reply; 15+ messages in thread
From: David Woodhouse @ 2023-02-23 13:44 UTC (permalink / raw)
  To: Brian Gerst, linux-kernel, x86
  Cc: Usama Arif, Thomas Gleixner, Borislav Petkov, H . Peter Anvin,
	Peter Zijlstra, Andy Lutomirski, Ingo Molnar

[-- Attachment #1: Type: text/plain, Size: 1369 bytes --]

On Wed, 2023-02-22 at 17:12 -0500, Brian Gerst wrote:
> This is on top of the parallel boot v10 series.
> 
> Remove the global variables initial_gs, initial_stack, and
> early_gdt_descr from the 64-bit boot code.  The stack, GDT, and GSBASE
> can be determined from the CPU number.
> 
> Brian Gerst (6):
>   x86/smpboot: Use CPU number instead of APIC ID for single CPU startup
>   x86/smpboot: Use current_task to get idle thread


I think those first two should be folded into the 'x86/smpboot: Support
parallel startup of secondary CPUs' patch rather than follow-on
patches?

>   x86/smpboot: Remove initial_stack on 64-bit
>   x86/smpbppt: Remove early_gdt_descr on 64-bit
>   x86/smpboot: Remove initial_gs
>   x86/smpboot: Simplify boot CPU setup

Those four probably make sense to come separately. For each of them,

Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>

I've pulled in the v10 series from Usama, squashed the first two as I
suggested, added the last four on top to do some testing:
https://git.infradead.org/users/dwmw2/linux.git/shortlog/refs/heads/parallel-6.2-rc8-part1

Rather than overthinking the SoB chain, I've left Usama's signoff as
the last on the original series, and on the assumption that Usama will
continue posting, I'll give them the choice of my R-b or S-o-B on what
are now the final four.

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 0/6] x86-64: Remove global variables from boot
  2023-02-23 13:44 ` [PATCH 0/6] x86-64: Remove global variables from boot David Woodhouse
@ 2023-02-23 14:24   ` Brian Gerst
  2023-02-23 19:14     ` [External] " Usama Arif
  0 siblings, 1 reply; 15+ messages in thread
From: Brian Gerst @ 2023-02-23 14:24 UTC (permalink / raw)
  To: David Woodhouse
  Cc: linux-kernel, x86, Usama Arif, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar

On Thu, Feb 23, 2023 at 8:44 AM David Woodhouse <dwmw2@infradead.org> wrote:
>
> On Wed, 2023-02-22 at 17:12 -0500, Brian Gerst wrote:
> > This is on top of the parallel boot v10 series.
> >
> > Remove the global variables initial_gs, initial_stack, and
> > early_gdt_descr from the 64-bit boot code.  The stack, GDT, and GSBASE
> > can be determined from the CPU number.
> >
> > Brian Gerst (6):
> >   x86/smpboot: Use CPU number instead of APIC ID for single CPU startup
> >   x86/smpboot: Use current_task to get idle thread
>
>
> I think those first two should be folded into the 'x86/smpboot: Support
> parallel startup of secondary CPUs' patch rather than follow-on
> patches?

Yes, that makes sense.

> >   x86/smpboot: Remove initial_stack on 64-bit
> >   x86/smpbppt: Remove early_gdt_descr on 64-bit
> >   x86/smpboot: Remove initial_gs
> >   x86/smpboot: Simplify boot CPU setup
>
> Those four probably make sense to come separately. For each of them,
>
> Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
>
> I've pulled in the v10 series from Usama, squashed the first two as I
> suggested, added the last four on top to do some testing:
> https://git.infradead.org/users/dwmw2/linux.git/shortlog/refs/heads/parallel-6.2-rc8-part1

Looks good.  I noticed a typo in the commit log of the last patch
(dynammically -> dynamically).  Can you fix that or should I resend?

Thanks

--
Brian Gerst

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [External] Re: [PATCH 0/6] x86-64: Remove global variables from boot
  2023-02-23 14:24   ` Brian Gerst
@ 2023-02-23 19:14     ` Usama Arif
  0 siblings, 0 replies; 15+ messages in thread
From: Usama Arif @ 2023-02-23 19:14 UTC (permalink / raw)
  To: Brian Gerst, David Woodhouse
  Cc: linux-kernel, x86, Thomas Gleixner, Borislav Petkov,
	H . Peter Anvin, Peter Zijlstra, Andy Lutomirski, Ingo Molnar



On 23/02/2023 14:24, Brian Gerst wrote:
> On Thu, Feb 23, 2023 at 8:44 AM David Woodhouse <dwmw2@infradead.org> wrote:
>>
>> On Wed, 2023-02-22 at 17:12 -0500, Brian Gerst wrote:
>>> This is on top of the parallel boot v10 series.
>>>
>>> Remove the global variables initial_gs, initial_stack, and
>>> early_gdt_descr from the 64-bit boot code.  The stack, GDT, and GSBASE
>>> can be determined from the CPU number.
>>>
>>> Brian Gerst (6):
>>>    x86/smpboot: Use CPU number instead of APIC ID for single CPU startup
>>>    x86/smpboot: Use current_task to get idle thread
>>
>>
>> I think those first two should be folded into the 'x86/smpboot: Support
>> parallel startup of secondary CPUs' patch rather than follow-on
>> patches?
> 
> Yes, that makes sense.
> 
>>>    x86/smpboot: Remove initial_stack on 64-bit
>>>    x86/smpbppt: Remove early_gdt_descr on 64-bit
>>>    x86/smpboot: Remove initial_gs
>>>    x86/smpboot: Simplify boot CPU setup
>>
>> Those four probably make sense to come separately. For each of them,
>>
>> Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
>>
>> I've pulled in the v10 series from Usama, squashed the first two as I
>> suggested, added the last four on top to do some testing:
>> https://git.infradead.org/users/dwmw2/linux.git/shortlog/refs/heads/parallel-6.2-rc8-part1
> 
> Looks good.  I noticed a typo in the commit log of the last patch
> (dynammically -> dynamically).  Can you fix that or should I resend?
> 
> Thanks
> 
> --
> Brian Gerst

I have tested the branch on top of v6.2 release and sent it as v11. Have 
also fixed the typo.

Thanks,
Usama

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2023-02-23 19:17 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-22 22:12 [PATCH 0/6] x86-64: Remove global variables from boot Brian Gerst
2023-02-22 22:12 ` [PATCH 1/6] x86/smpboot: Use CPU number instead of APIC ID for single CPU startup Brian Gerst
2023-02-22 22:12 ` [PATCH 2/6] x86/smpboot: Use current_task to get idle thread Brian Gerst
2023-02-22 22:12 ` [PATCH 3/6] x86/smpboot: Remove initial_stack on 64-bit Brian Gerst
2023-02-23  8:05   ` David Woodhouse
2023-02-23  8:27     ` David Woodhouse
2023-02-22 22:12 ` [PATCH 4/6] x86/smpbppt: Remove early_gdt_descr " Brian Gerst
2023-02-23  6:49   ` H. Peter Anvin
2023-02-23 12:10     ` Brian Gerst
2023-02-22 22:13 ` [PATCH 5/6] x86/smpboot: Remove initial_gs Brian Gerst
2023-02-22 22:13 ` [PATCH 6/6] x86/smpboot: Simplify boot CPU setup Brian Gerst
2023-02-23 12:36   ` David Woodhouse
2023-02-23 13:44 ` [PATCH 0/6] x86-64: Remove global variables from boot David Woodhouse
2023-02-23 14:24   ` Brian Gerst
2023-02-23 19:14     ` [External] " Usama Arif

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).