summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/cbmem.h29
-rw-r--r--src/lib/cbmem_console.c6
-rw-r--r--src/lib/program.ld1
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)