Julius Werner (jwerner@chromium.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/18302
-gerrit
commit 789f55284928ff877c64d14702e568e6e2d8550f Author: Julius Werner jwerner@chromium.org Date: Mon Feb 6 14:24:58 2017 -0800
car: Make CAR_GLOBALs work in romstage-linked libverstage
Our verstage code can currently be linked in four different ways, as controlled by chipset-selected Kconfig (excluding the extra complication from RETURN_FROM_VERSTAGE):
1. as libverstage linked directly into the bootblock 2. as a standalone stage between bootblock and romstage 3. as libverstage linked directly into the romstage 4. as a standalone stage between romstage and ramstage
Unfortunately, <rules.h> defines ENV_VERSTAGE in all these cases (including 1 and 3, where it doesn't define ENV_BOOTBLOCK or ENV_ROMSTAGE, respectively), which makes it tricky to use when trying to draw any conclusions about the execution environment. The CAR_GLOBAL code seems to have only considered options 1 and 2, and unconditionally counts ENV_VERSTAGE as a pre-CAR-migration stage. This currently breaks vboot on Haswell platforms like Falco because tlcl_lib_init() never really runs.
This patch fixes case 3 for those platforms. Case 4 might still be broken since it looks like vboot/Makefile.inc would incorrectly define __PRE_RAM__ for that undeniably post-RAM stage. However, I don't think any platforms actually use that configuration right now and I am not sure if it was really ever considered an intended execution mode (despite receiving some consideration in vboot_loader.c). (If it was not, it should probably be explicitly prevented by Kconfig dependencies and respective code should be removed.)
Change-Id: I6bb84a9bf1cd54f2e02ca1f665740a9c88d88df4 Signed-off-by: Julius Werner jwerner@chromium.org --- src/arch/x86/include/arch/early_variables.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h index e78b846..ca64c59 100644 --- a/src/arch/x86/include/arch/early_variables.h +++ b/src/arch/x86/include/arch/early_variables.h @@ -30,11 +30,12 @@ asm(".previous"); #endif /* __clang__ */
/* - * In stages that use CAR (verstage, C bootblock) all CAR_GLOBAL variables are - * accessed unconditionally because cbmem is never initialized until romstage - * when dram comes up. + * In stages that use CAR (early-style verstage, C bootblock) all CAR_GLOBAL + * variables are accessed unconditionally because cbmem is never initialized + * until romstage when dram comes up. */ -#if ENV_VERSTAGE || ENV_BOOTBLOCK +#if ENV_BOOTBLOCK || \ + (ENV_VERSTAGE && IS_ENABLED(CONFIG_VBOOT_STARTS_IN_BOOTBLOCK)) static inline void *car_get_var_ptr(void *var) { return var;