From de84d24dcfd97fb80531e60590ffcfc7ed470e71 Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Wed, 21 Oct 2015 13:31:44 -0700 Subject: [PATCH] vboot: check vb2_shared_data flags for manual recovery vboot handoff should look at flags in struct vb2_shared_data when translating flags to VBSD_BOOT_REC_SWITCH_ON because VBSD_BOOT_REC_SWITCH_ON is supposed to indicate whether manual recovery was triggered or not while vb2_sd->recovery_reason will be able to provide that information only in some cases after CL:307586 is checked in. For example, this fixes a recovery loop problem: Without this fix, vb2_sd->recovery_reason won't be set to VB2_RECOVERY_RO_MANUAL when user hits esc+refresh+power at 'broken' screen. In the next boot, recovery_reason will be set to whatever reason which caused 'broken' screen. So, if we check recovery_reason == VB2_RECOVERY_RO_MANUAL, we won't set vb_sd->flags to VBSD_BOOT_REC_SWITCH_ON. That'll cause a recovery loop because VbBootRecovery traps us again in the 'broken' screen after not seeing VBSD_BOOT_REC_SWITCH_ON. BUG=chromium:501060 BRANCH=tot TEST=test_that -b veyron_jerry suite:faft_bios Change-Id: I3da642ff2d05c097d10db303fc8ab3358e10a5c7 Signed-off-by: Daisuke Nojiri Reviewed-on: https://chromium-review.googlesource.com/307946 Reviewed-by: Randall Spangler (cherry picked from commit d9679b02f6d21ed903bb02e107badb0fbf7da46c) Reviewed-on: https://chromium-review.googlesource.com/309247 Commit-Queue: Julius Werner Tested-by: Julius Werner Reviewed-by: Julius Werner --- src/vendorcode/google/chromeos/vboot2/vboot_handoff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c index a5c7de617c..963f3ed976 100644 --- a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c +++ b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c @@ -90,7 +90,7 @@ static void fill_vboot_handoff(struct vboot_handoff *vboot_handoff, if (vb2_sd->recovery_reason) { vb_sd->firmware_index = 0xFF; - if (vb2_sd->recovery_reason == VB2_RECOVERY_RO_MANUAL) + if (vb2_sd->flags & VB2_SD_FLAG_MANUAL_RECOVERY) vb_sd->flags |= VBSD_BOOT_REC_SWITCH_ON; *oflags |= VB_INIT_OUT_ENABLE_RECOVERY; *oflags |= VB_INIT_OUT_CLEAR_RAM;