mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-25 02:35:22 +00:00
vboot2: Support reboot requested by secdata
When a TPM goes from the disabled state to the enabled state, it must reboot after being enabled, before it can be initialized. In vboot1, TLCL was part of vboot and this was handled internally. In vboot2, the caller must set a context flag, so that vboot can decide whether to allow the reboot, or whether to go directly to recovery mode. This check is necessary to handle the following cases: 1) The device is booting normally, but the TPM needs a reboot. This should simply reboot, without going to recovery mode. 2) The device is booting in recovery mode, but the TPM needs a reboot. If this is the first time it asked us, allow the reboot. 3) The TPM asked for a reboot last time, so we did. And it's still asking. Don't reboot, because that runs the risk that whatever is wrong won't be fixed next boot either, and we'll get stuck in a reboot loop that will prevent recovery. Boot into recovery mode. Add a new NvStorage bit to track whether the TPM requested a reboot on the previous boot. That's better than what we did in vboot1, where we used a special recovery request. Vboot1 couldn't track getting stuck in a reboot loop in normal mode, only in recovery mode. The new code can catch both. BUG=chrome-os-partner:45462 BRANCH=ryu TEST=make runtests Change-Id: I2ee54af107275ccf64a6cb41132b7a0fc02bb983 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/300572 Tested-by: Furquan Shaikh <furquan@chromium.org> Reviewed-by: Furquan Shaikh <furquan@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
committed by
chrome-bot
parent
85f646613c
commit
c8e48545d5
@@ -44,6 +44,27 @@ int vb2api_fw_phase1(struct vb2_context *ctx)
|
||||
/* Initialize NV context */
|
||||
vb2_nv_init(ctx);
|
||||
|
||||
/*
|
||||
* Handle caller-requested reboot due to secdata. Do this before we
|
||||
* even look at secdata. If we fail because of a reboot loop we'll be
|
||||
* the first failure so will get to set the recovery reason.
|
||||
*/
|
||||
if (!(ctx->flags & VB2_CONTEXT_SECDATA_WANTS_REBOOT)) {
|
||||
/* No reboot requested */
|
||||
vb2_nv_set(ctx, VB2_NV_TPM_REQUESTED_REBOOT, 0);
|
||||
} else if (vb2_nv_get(ctx, VB2_NV_TPM_REQUESTED_REBOOT)) {
|
||||
/*
|
||||
* Reboot requested... again. Fool me once, shame on you.
|
||||
* Fool me twice, shame on me. Fail into recovery to avoid
|
||||
* a reboot loop.
|
||||
*/
|
||||
vb2_fail(ctx, VB2_RECOVERY_RO_TPM_REBOOT, 0);
|
||||
} else {
|
||||
/* Reboot requested for the first time */
|
||||
vb2_nv_set(ctx, VB2_NV_TPM_REQUESTED_REBOOT, 1);
|
||||
return VB2_ERROR_API_PHASE1_SECDATA_REBOOT;
|
||||
}
|
||||
|
||||
/* Initialize secure data */
|
||||
rv = vb2_secdata_init(ctx);
|
||||
if (rv)
|
||||
|
||||
Reference in New Issue
Block a user