diff options
author | Joel Kitching <kitching@google.com> | 2020-02-08 12:23:23 +0800 |
---|---|---|
committer | Joel Kitching <kitching@google.com> | 2020-02-17 08:08:19 +0000 |
commit | 81726663bcfe07234eb286ec5eddbff5e55be813 (patch) | |
tree | c07bb1a1272808b2d606c63ad5e219fa52c63bea /src/security/vboot/bootmode.c | |
parent | e921911f1008169d236c4d2bd3e169a176cdf45c (diff) | |
download | coreboot-81726663bcfe07234eb286ec5eddbff5e55be813.tar.xz |
vboot: push clear recovery mode switch until BS_WRITE_TABLES
Serves two purposes:
(1) On some platforms, FSP initialization may cause a reboot.
Push clearing the recovery mode switch until after FSP code runs,
so that a manual recovery request (three-finger salute) will
function correctly under this condition.
(2) The recovery mode switch value is needed at BS_WRITE_TABLES
for adding an event to elog. (Previously this was done by
stashing the value in CBMEM_ID_EC_HOSTEVENT.)
BUG=b:124141368, b:35576380
TEST=make clean && make test-abuild
BRANCH=none
Change-Id: I30c02787c620b937e5a50a5ed94ac906e3112dad
Signed-off-by: Joel Kitching <kitching@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38779
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/security/vboot/bootmode.c')
-rw-r--r-- | src/security/vboot/bootmode.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/security/vboot/bootmode.c b/src/security/vboot/bootmode.c index 83baa815c7..2a911cbf10 100644 --- a/src/security/vboot/bootmode.c +++ b/src/security/vboot/bootmode.c @@ -101,14 +101,27 @@ int vboot_recovery_mode_enabled(void) int __weak clear_recovery_mode_switch(void) { - // Weak implementation. Nothing to do. return 0; } -void __weak log_recovery_mode_switch(void) +static void do_clear_recovery_mode_switch(void *unused) { - // Weak implementation. Nothing to do. + if (vboot_get_context()->flags & VB2_CONTEXT_FORCE_RECOVERY_MODE) + clear_recovery_mode_switch(); } +/* + * The recovery mode switch (typically backed by EC) is not cleared until + * BS_WRITE_TABLES for two reasons: + * + * (1) On some platforms, FSP initialization may cause a reboot. Push clearing + * the recovery mode switch until after FSP code runs, so that a manual recovery + * request (three-finger salute) will function correctly under this condition. + * + * (2) To give the implementation of clear_recovery_mode_switch a chance to + * add an event to elog. See the function in chromeec/switches.c. + */ +BOOT_STATE_INIT_ENTRY(BS_WRITE_TABLES, BS_ON_ENTRY, + do_clear_recovery_mode_switch, NULL); int __weak get_recovery_mode_retrain_switch(void) { |