diff options
-rw-r--r-- | src/include/cbmem.h | 29 | ||||
-rw-r--r-- | src/lib/cbmem_console.c | 6 | ||||
-rw-r--r-- | src/lib/program.ld | 1 |
3 files changed, 26 insertions, 10 deletions
diff --git a/src/include/cbmem.h b/src/include/cbmem.h index 9e12afe4a3..ec2b928ff8 100644 --- a/src/include/cbmem.h +++ b/src/include/cbmem.h @@ -108,37 +108,48 @@ void cbmem_add_records_to_cbtable(struct lb_header *header); #if ENV_RAMSTAGE #define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_rom_ = init_fn_; #define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) \ static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \ section(".rodata.cbmem_init_hooks"))) = init_fn_; #define POSTCAR_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused2_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_pc_ = init_fn_; #elif ENV_ROMSTAGE #define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) \ static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \ section(".rodata.cbmem_init_hooks"))) = init_fn_; #define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_ram_ = init_fn_; #define POSTCAR_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused2_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_pc_ = init_fn_; #elif ENV_POSTCAR #define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused2_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_rom_ = init_fn_; #define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_ram_ = init_fn_; #define POSTCAR_CBMEM_INIT_HOOK(init_fn_) \ static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \ section(".rodata.cbmem_init_hooks"))) = init_fn_; #else #define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_rom_ = init_fn_; #define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused2_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_ram_ = init_fn_; #define POSTCAR_CBMEM_INIT_HOOK(init_fn_) __attribute__((unused)) \ - static cbmem_init_hook_t init_fn_ ## _unused3_ = init_fn_; + static cbmem_init_hook_t init_fn_ ## _unused_pc_ = init_fn_; #endif /* ENV_RAMSTAGE */ +/* Early hooks get executed before other hooks. Use sparingly for hooks that create + CBMEM regions which need to remain in a constant location across boot modes. */ +#if ENV_ROMSTAGE +#define ROMSTAGE_CBMEM_INIT_HOOK_EARLY(init_fn_) \ + static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \ + section(".rodata.cbmem_init_hooks_early"))) = init_fn_; +#else +#define ROMSTAGE_CBMEM_INIT_HOOK_EARLY(init_fn_) __attribute__((unused)) \ + static cbmem_init_hook_t init_fn_ ## _unused_rom_ = init_fn_; +#endif /* ENV_ROMSTAGE */ + /* * Returns 0 for the stages where we know that cbmem does not come online. * Even if this function returns 1 for romstage, depending upon the point in diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c index 641824f942..a7d67a3981 100644 --- a/src/lib/cbmem_console.c +++ b/src/lib/cbmem_console.c @@ -145,7 +145,11 @@ static void cbmemc_reinit(int is_recovery) init_console_ptr(cbmem_cons_p, size); copy_console_buffer(previous_cons_p); } -ROMSTAGE_CBMEM_INIT_HOOK(cbmemc_reinit) + +/* Run the romstage hook early so that the console region is one of the earliest created, and + therefore more likely to stay in the same place even across different boot modes where some + other regions may sometimes not get created (e.g. RW_MCACHE in vboot recovery mode). */ +ROMSTAGE_CBMEM_INIT_HOOK_EARLY(cbmemc_reinit) RAMSTAGE_CBMEM_INIT_HOOK(cbmemc_reinit) POSTCAR_CBMEM_INIT_HOOK(cbmemc_reinit) diff --git a/src/lib/program.ld b/src/lib/program.ld index 8180d9f1dc..1c5cda40e1 100644 --- a/src/lib/program.ld +++ b/src/lib/program.ld @@ -27,6 +27,7 @@ #if ENV_RAMSTAGE || ENV_ROMSTAGE || ENV_POSTCAR . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _cbmem_init_hooks = .; + KEEP(*(.rodata.cbmem_init_hooks_early)); KEEP(*(.rodata.cbmem_init_hooks)); _ecbmem_init_hooks = .; RECORD_SIZE(cbmem_init_hooks) |