bootstate: add arch specific hook at coreboot exit

The bootstate machine allows one to schedule work at the
boundaries of each state. However, there are no priorities by
design. As such if there are things that need to be performed
that are interdependent between callbacks there's no way to
do that aside from explicitly putting the call in one of the
callbacks.

This situation arises around BS_OS_RESUME, BS_PAYLOAD_LOAD,
and BS_PAYLOAD_BOOT as those are the states where coreboot is
about to exit. As such, provide an architecture specific hook
at these key places so that one is guaranteed any work done
in arch_bootstate_coreboot_exit() is after all callbacks in
the state machine.

BUG=chrome-os-partner:60657
BRANCH=reef

Change-Id: Icb4afb341ab15af0670501b9d21799e564fb32c6
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/17767
Tested-by: build bot (Jenkins)
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-by: Andrey Petrov <andrey.petrov@intel.com>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index 7e20988..9c127ff 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -115,6 +115,8 @@
 	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(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_boot(void *arg)
 {
+	arch_bootstate_coreboot_exit();
 	payload_run();
 
 	printk(BIOS_EMERG, "Boot failed\n");