diff options
author | Aaron Durbin <adurbin@chromium.org> | 2013-04-24 16:12:52 -0500 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2013-05-01 07:06:12 +0200 |
commit | a4feddf897023b37cfac2af529e787504849f985 (patch) | |
tree | f902d7de90ddd9c1358d04295aa1afad3dfa113c /src/lib | |
parent | 7e35efa83cdd6240e4f9282cc4d2703c40d472d5 (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.c | 20 | ||||
-rw-r--r-- | src/lib/rmodule.ld | 4 |
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); |