cpu/intel/car: Make stack guards more useful on C_ENV_BOOTBLOCK

With C_ENVIRONMENT_BOOTBLOCK, CONFIG_DCACHE_BSP_STACK_SIZE needs to be
set to define a stack region that can be shared over all stages using
CAR. It makes sense to use that Kconfig option's value instead of a
hardcoded value. This will result in less false positives when the
stack size is big, for instance with FSP using the coreboot stack.

In many configurations with C_ENVIRONMENT_BOOTBLOCK the stack_base is
at the base of CAR. If the stack grows too large it operates out of
CAR, typically resulting in a hang. Therefore the stack guards are
extended to cover 256 bytes at the base to at least provide a warning
when the romstage is dangerously close of running out of stack.

Change-Id: I2ce1dda4d1f254e6c36de4d3fea26e12c34195ff
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34976
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Arthur Heymans 2019-08-18 08:40:56 +02:00 committed by Kyösti Mälkki
parent c2741855af
commit 4c095fc9e9
1 changed files with 7 additions and 3 deletions

View File

@ -21,6 +21,8 @@
#include <program_loading.h>
#include <timestamp.h>
/* If we do not have a constrained _car_stack region size, use the
following as a guideline for acceptable stack usage. */
#define DCACHE_RAM_ROMSTAGE_STACK_SIZE 0x2000
static struct postcar_frame early_mtrrs;
@ -43,16 +45,18 @@ static void prepare_and_run_postcar(struct postcar_frame *pcf)
static void romstage_main(unsigned long bist)
{
int i;
const int num_guards = 4;
const int num_guards = 64;
const u32 stack_guard = 0xdeadbeef;
u32 *stack_base;
u32 size;
const size_t stack_size = MAX(CONFIG_DCACHE_BSP_STACK_SIZE,
DCACHE_RAM_ROMSTAGE_STACK_SIZE);
/* Size of unallocated CAR. */
size = ALIGN_DOWN(_car_stack_size, 16);
size = MIN(size, DCACHE_RAM_ROMSTAGE_STACK_SIZE);
if (size < DCACHE_RAM_ROMSTAGE_STACK_SIZE)
size = MIN(size, stack_size);
if (size < stack_size)
printk(BIOS_DEBUG, "Romstage stack size limited to 0x%x!\n",
size);