aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/bootstate.h4
-rw-r--r--src/lib/hardwaremain.c4
2 files changed, 8 insertions, 0 deletions
diff --git a/src/include/bootstate.h b/src/include/bootstate.h
index 09178a56f0..481a8bc54a 100644
--- a/src/include/bootstate.h
+++ b/src/include/bootstate.h
@@ -195,4 +195,8 @@ struct boot_state_init_entry {
bsie_ ## func_ ##_## state_ ##_## when_ BOOT_STATE_INIT_ATTR = \
& func_ ##_## state_ ##_## when_;
+/* Hook per arch when coreboot is exiting to payload or ACPI OS resume. It's
+ * the very last thing done before the transition. */
+void arch_bootstate_coreboot_exit(void);
+
#endif /* BOOTSTATE_H */
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index 7e2098888c..9c127ff1cc 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -115,6 +115,8 @@ static struct boot_state boot_states[] = {
BS_INIT_ENTRY(BS_PAYLOAD_BOOT, bs_payload_boot),
};
+void __attribute__((weak)) arch_bootstate_coreboot_exit(void) { }
+
static boot_state_t bs_pre_device(void *arg)
{
return BS_DEV_INIT_CHIPS;
@@ -198,6 +200,7 @@ static boot_state_t bs_os_resume_check(void *arg)
static boot_state_t bs_os_resume(void *wake_vector)
{
#if CONFIG_HAVE_ACPI_RESUME
+ arch_bootstate_coreboot_exit();
acpi_resume(wake_vector);
#endif
return BS_WRITE_TABLES;
@@ -227,6 +230,7 @@ static boot_state_t bs_payload_load(void *arg)
static boot_state_t bs_payload_boot(void *arg)
{
+ arch_bootstate_coreboot_exit();
payload_run();
printk(BIOS_EMERG, "Boot failed\n");