arch/x86: Enforce CPU stack alignment

When rmodule is loaded CPU stack alignment is only guaranteed
to 4kiB. Implementation of cpu_info() requires that each
CPU sees its stack aligned to CONFIG_STACK_SIZE.

Add one spare CPU for the stack reserve, such that alignment can
be enforced runtime.

Change-Id: Ie04956c64df0dc7bb156002d3d4f2629f92b340e
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/26302
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Kyösti Mälkki
2018-05-15 19:50:20 +03:00
committed by Patrick Georgi
parent b318be2218
commit 2fbb6773e3
3 changed files with 21 additions and 17 deletions

View File

@ -18,6 +18,7 @@
#include <stdint.h>
#include <rmodule.h>
#include <arch/cpu.h>
#include <commonlib/helpers.h>
#include <cpu/cpu.h>
#include <cpu/intel/microcode.h>
#include <cpu/x86/cache.h>
@ -229,11 +230,11 @@ static void asmlinkage ap_init(unsigned int cpu)
static void setup_default_sipi_vector_params(struct sipi_params *sp)
{
sp->gdt = (uint32_t)&gdt;
sp->gdtlimit = (uint32_t)&gdt_end - (u32)&gdt - 1;
sp->idt_ptr = (uint32_t)&idtarg;
sp->gdt = (uintptr_t)&gdt;
sp->gdtlimit = (uintptr_t)&gdt_end - (uintptr_t)&gdt - 1;
sp->idt_ptr = (uintptr_t)&idtarg;
sp->stack_size = CONFIG_STACK_SIZE;
sp->stack_top = (uint32_t)&_estack;
sp->stack_top = ALIGN_DOWN((uintptr_t)&_estack, CONFIG_STACK_SIZE);
/* Adjust the stack top to take into account cpu_info. */
sp->stack_top -= sizeof(struct cpu_info);
}