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:
parent
c2741855af
commit
4c095fc9e9
|
@ -21,6 +21,8 @@
|
||||||
#include <program_loading.h>
|
#include <program_loading.h>
|
||||||
#include <timestamp.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
|
#define DCACHE_RAM_ROMSTAGE_STACK_SIZE 0x2000
|
||||||
|
|
||||||
static struct postcar_frame early_mtrrs;
|
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)
|
static void romstage_main(unsigned long bist)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const int num_guards = 4;
|
const int num_guards = 64;
|
||||||
const u32 stack_guard = 0xdeadbeef;
|
const u32 stack_guard = 0xdeadbeef;
|
||||||
u32 *stack_base;
|
u32 *stack_base;
|
||||||
u32 size;
|
u32 size;
|
||||||
|
const size_t stack_size = MAX(CONFIG_DCACHE_BSP_STACK_SIZE,
|
||||||
|
DCACHE_RAM_ROMSTAGE_STACK_SIZE);
|
||||||
|
|
||||||
/* Size of unallocated CAR. */
|
/* Size of unallocated CAR. */
|
||||||
size = ALIGN_DOWN(_car_stack_size, 16);
|
size = ALIGN_DOWN(_car_stack_size, 16);
|
||||||
|
|
||||||
size = MIN(size, DCACHE_RAM_ROMSTAGE_STACK_SIZE);
|
size = MIN(size, stack_size);
|
||||||
if (size < DCACHE_RAM_ROMSTAGE_STACK_SIZE)
|
if (size < stack_size)
|
||||||
printk(BIOS_DEBUG, "Romstage stack size limited to 0x%x!\n",
|
printk(BIOS_DEBUG, "Romstage stack size limited to 0x%x!\n",
|
||||||
size);
|
size);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue