vboot_wrapper: handling VBERROR_TPM_REBOOT_REQUIRED from VbInit().

Doing reset while VBERROR_TPM_REBOOT_REQUIRED occured.

BUG=chromium:389568
TEST=Manual force VBERROR_TPM_REBOOT_REQUIRED returned from VbInit()
     and system will reboot.

Original-Change-Id: I9d7c4b3a380a931a728f792b4013b3b9bf65dfae
Original-Signed-off-by: Kevin Cheng <kevin.cheng@intel.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/206337
Original-Reviewed-by: Randall Spangler <rspangler@chromium.org>
(cherry picked from commit 32728dd9fc43a95d6f763a85f9cc7a660a66b175)
Original-Reviewed-on: https://chromium-review.googlesource.com/206948
Original-Reviewed-by: Shawn Nematbakhsh <shawnn@chromium.org>
(cherry picked from commit 1ea5e233386d236ce20f3d1695fac3a1bc49d4bd)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

Change-Id: Ib93fdf7b22918f563d3e29207a75fc831bee186a
Reviewed-on: http://review.coreboot.org/8163
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Tested-by: build bot (Jenkins)
This commit is contained in:
Kevin Cheng 2014-06-30 17:51:48 -07:00 committed by Marc Jones
parent 224f922604
commit 3c21e4687b
3 changed files with 13 additions and 1 deletions

View File

@ -57,6 +57,7 @@ struct vboot_context {
void (*log_msg)(const char *fmt, va_list args); void (*log_msg)(const char *fmt, va_list args);
void (*fatal_error)(void); void (*fatal_error)(void);
void *(*get_region)(uintptr_t offset_addr, size_t size, void *dest); void *(*get_region)(uintptr_t offset_addr, size_t size, void *dest);
void (*reset)(void);
}; };
#endif /* VBOOT_CONTEXT_H */ #endif /* VBOOT_CONTEXT_H */

View File

@ -229,6 +229,11 @@ static void vboot_clean_up(struct vboot_context *context)
cbmem_entry_remove(context->vblocks); cbmem_entry_remove(context->vblocks);
} }
static void reset(void)
{
hard_reset();
}
static void vboot_invoke_wrapper(struct vboot_handoff *vboot_handoff) static void vboot_invoke_wrapper(struct vboot_handoff *vboot_handoff)
{ {
VbCommonParams cparams; VbCommonParams cparams;
@ -298,6 +303,7 @@ static void vboot_invoke_wrapper(struct vboot_handoff *vboot_handoff)
context.log_msg = &log_msg; context.log_msg = &log_msg;
context.fatal_error = &fatal_error; context.fatal_error = &fatal_error;
context.get_region = &vboot_get_region; context.get_region = &vboot_get_region;
context.reset = &reset;
vboot_run_stub(&context); vboot_run_stub(&context);

View File

@ -43,8 +43,13 @@ static void vboot_wrapper(void *arg)
res = VbInit(context->cparams, &context->handoff->init_params); res = VbInit(context->cparams, &context->handoff->init_params);
VbExDebug("VbInit() returned 0x%08x\n", res); VbExDebug("VbInit() returned 0x%08x\n", res);
if (res != VBERROR_SUCCESS) if (res != VBERROR_SUCCESS) {
if(res == VBERROR_TPM_REBOOT_REQUIRED) {
VbExDebug("TPM Reboot Required. Proceeding reboot.\n");
gcontext->reset();
}
return; return;
}
VbExDebug("Calling VbSelectFirmware()\n"); VbExDebug("Calling VbSelectFirmware()\n");
res = VbSelectFirmware(context->cparams, context->fparams); res = VbSelectFirmware(context->cparams, context->fparams);