summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2013-04-24 16:12:52 -0500
committerRonald G. Minnich <rminnich@gmail.com>2013-05-01 07:06:12 +0200
commita4feddf897023b37cfac2af529e787504849f985 (patch)
treef902d7de90ddd9c1358d04295aa1afad3dfa113c /src/lib
parent7e35efa83cdd6240e4f9282cc4d2703c40d472d5 (diff)
boot state: schedule static callbacks
Many of the boot state callbacks can be scheduled at compile time. Therefore, provide a way for a compilation unit to inform the boot state machine when its callbacks should be called. Each C module can export the callbacks and their scheduling requirements without changing the shared boot flow code. Change-Id: Ibc4cea4bd5ad45b2149c2d4aa91cbea652ed93ed Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/3133 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/hardwaremain.c20
-rw-r--r--src/lib/rmodule.ld4
2 files changed, 24 insertions, 0 deletions
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index dba47a7348..0a5a522b99 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -293,6 +293,23 @@ int boot_state_sched_on_exit(struct boot_state_callback *bscb,
return boot_state_sched_callback(state, bscb, BS_ON_EXIT);
}
+static void boot_state_schedule_static_entries(void)
+{
+ extern struct boot_state_init_entry _bs_init_begin;
+ extern struct boot_state_init_entry _bs_init_end;
+ struct boot_state_init_entry *cur;
+
+ cur = &_bs_init_begin;
+
+ while (cur != &_bs_init_end) {
+ if (cur->when == BS_ON_ENTRY)
+ boot_state_sched_on_entry(&cur->bscb, cur->state);
+ else
+ boot_state_sched_on_exit(&cur->bscb, cur->state);
+ cur++;
+ }
+}
+
void hardwaremain(int boot_complete)
{
timestamp_stash(TS_START_RAMSTAGE);
@@ -318,6 +335,9 @@ void hardwaremain(int boot_complete)
hard_reset();
}
+ /* Schedule the static boot state entries. */
+ boot_state_schedule_static_entries();
+
/* FIXME: Is there a better way to handle this? */
init_timer();
diff --git a/src/lib/rmodule.ld b/src/lib/rmodule.ld
index 96401a1715..0cdbb2fa25 100644
--- a/src/lib/rmodule.ld
+++ b/src/lib/rmodule.ld
@@ -61,6 +61,10 @@ SECTIONS
cpu_drivers = . ;
*(.rodata.cpu_driver)
ecpu_drivers = . ;
+ _bs_init_begin = .;
+ *(.bs_init)
+ _bs_init_end = .;
+
. = ALIGN(4);
*(.rodata);