Arthur Heymans has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/69123 )
Change subject: cpu/x86: Set up a separate stack for APs ......................................................................
cpu/x86: Set up a separate stack for APs
APs use a lot less stack, so set up a separate stack for those in .bss.
Now that CPU_INFO_V2 is the only code path that is used, there is no need to align stacks in c_start.S.
Change-Id: I7a681a2e3003da0400843daa5d6d6180d952abf5 Signed-off-by: Arthur Heymans arthur@aheymans.xyz --- M src/arch/x86/c_start.S M src/cpu/x86/Kconfig M src/cpu/x86/mp_init.c 3 files changed, 29 insertions(+), 7 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/23/69123/1
diff --git a/src/arch/x86/c_start.S b/src/arch/x86/c_start.S index 02a9b89..e4f52e4 100644 --- a/src/arch/x86/c_start.S +++ b/src/arch/x86/c_start.S @@ -11,11 +11,9 @@ .global _estack .global _stack_size
-/* Stack alignment is not enforced with rmodule loader, reserve one - * extra CPU such that alignment can be enforced on entry. */ -.align CONFIG_STACK_SIZE +.align 16 _stack: -.space (CONFIG_MAX_CPUS+1)*CONFIG_STACK_SIZE +.space CONFIG_STACK_SIZE _estack: .set _stack_size, _estack - _stack
@@ -76,7 +74,7 @@
/* Set new stack with enforced alignment. */ movl $_estack, %esp - andl $(~(CONFIG_STACK_SIZE-1)), %esp + andl $(0xfffffff0), %esp
push_cpu_info
diff --git a/src/cpu/x86/Kconfig b/src/cpu/x86/Kconfig index 1d6b489..7927e52 100644 --- a/src/cpu/x86/Kconfig +++ b/src/cpu/x86/Kconfig @@ -209,4 +209,11 @@ However, modern OSes use PAT to control cacheability instead of using MTRRs.
+config AP_STACK_SIZE + hex + default 0x200 + help + This is the amount of stack each AP needs. The BSP stack size can be + larger and is set with STACK_SIZE. + endif # ARCH_X86 diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c index e3b294f..6cfa96e 100644 --- a/src/cpu/x86/mp_init.c +++ b/src/cpu/x86/mp_init.c @@ -209,6 +209,8 @@ park_this_cpu(NULL); }
+static __aligned(16) uint8_t ap_stack[CONFIG_AP_STACK_SIZE * CONFIG_MAX_CPUS]; + static void setup_default_sipi_vector_params(struct sipi_params *sp) { sp->gdt = (uintptr_t)&gdt; @@ -216,8 +218,8 @@ sp->idt_ptr = (uintptr_t)&idtarg; sp->per_cpu_segment_descriptors = (uintptr_t)&per_cpu_segment_descriptors; sp->per_cpu_segment_selector = per_cpu_segment_selector; - sp->stack_size = CONFIG_STACK_SIZE; - sp->stack_top = ALIGN_DOWN((uintptr_t)&_estack, CONFIG_STACK_SIZE); + sp->stack_size = CONFIG_AP_STACK_SIZE; + sp->stack_top = (uintptr_t)ap_stack + ARRAY_SIZE(ap_stack); }
static const unsigned int fixed_mtrrs[NUM_FIXED_MTRRS] = {