From 8912169231e589b0400debed26f9cedbbe6d9561 Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Thu, 10 Oct 2013 11:51:45 -0700 Subject: Disable EC jump after RW image starts TEST=Built and booted Peppy. Ran flashrom from user space and verified the EC firmware was updated after reboot. CQ-DEPEND=CL:172651, CL:172652, CL:178324 BRANCH=none BUG=chromium:325286 Signed-off-by: Daisuke Nojiri Change-Id: Ia73da70dbf3abb5ced48666e86715c8d24a431a0 Reviewed-on: https://chromium-review.googlesource.com/172635 Reviewed-by: Randall Spangler Tested-by: Daisuke Nojiri Commit-Queue: Daisuke Nojiri --- firmware/include/vboot_api.h | 7 +++---- firmware/lib/vboot_api_kernel.c | 13 +++++++++++-- firmware/stub/vboot_api_stub.c | 2 +- tests/vboot_api_kernel3_tests.c | 5 ++--- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h index 214da753..0ae6c76b 100644 --- a/firmware/include/vboot_api.h +++ b/firmware/include/vboot_api.h @@ -752,11 +752,10 @@ VbError_t VbExEcRunningRW(int *in_rw); VbError_t VbExEcJumpToRW(void); /** - * Tell the EC to stay in RO code until it reboots. Subsequent calls to - * VbExEcJumpToRW() this boot will fail. Fails if the EC is not currently in - * RO code. + * Tell the EC to refuse another jump until it reboots. Subsequent calls to + * VbExEcJumpToRW() in this boot will fail. */ -VbError_t VbExEcStayInRO(void); +VbError_t VbExEcDisableJump(void); /** * Read the SHA-256 hash of the rewriteable EC image. diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c index 4f0b3f20..5c498eea 100644 --- a/firmware/lib/vboot_api_kernel.c +++ b/firmware/lib/vboot_api_kernel.c @@ -615,10 +615,10 @@ VbError_t VbEcSoftwareSync(VbCommonParams *cparams) if (rv != VBERROR_SUCCESS) return rv; - rv = VbExEcStayInRO(); + rv = VbExEcDisableJump(); if (rv != VBERROR_SUCCESS) { VBDEBUG(("VbEcSoftwareSync() - " - "VbExEcStayInRO() returned %d\n", rv)); + "VbExEcDisableJump() returned %d\n", rv)); VbSetRecoveryRequest(VBNV_RECOVERY_EC_SOFTWARE_SYNC); return VBERROR_EC_REBOOT_TO_RO_REQUIRED; } @@ -803,6 +803,15 @@ VbError_t VbEcSoftwareSync(VbCommonParams *cparams) VbSetRecoveryRequest(VBNV_RECOVERY_EC_JUMP_RW); return VBERROR_EC_REBOOT_TO_RO_REQUIRED; } + VBDEBUG(("VbEcSoftwareSync() jumped to EC-RW\n")); + + rv = VbExEcDisableJump(); + if (rv != VBERROR_SUCCESS) { + VBDEBUG(("VbEcSoftwareSync() - " + "VbExEcDisableJump() returned %d\n", rv)); + VbSetRecoveryRequest(VBNV_RECOVERY_EC_SOFTWARE_SYNC); + return VBERROR_EC_REBOOT_TO_RO_REQUIRED; + } VBDEBUG(("VbEcSoftwareSync() in RW; done\n")); return VBERROR_SUCCESS; diff --git a/firmware/stub/vboot_api_stub.c b/firmware/stub/vboot_api_stub.c index 36d56032..e82be5b2 100644 --- a/firmware/stub/vboot_api_stub.c +++ b/firmware/stub/vboot_api_stub.c @@ -91,7 +91,7 @@ VbError_t VbExEcRebootToRO(void) return VBERROR_UNKNOWN; } -VbError_t VbExEcStayInRO(void) +VbError_t VbExEcDisableJump(void) { return VBERROR_SUCCESS; } diff --git a/tests/vboot_api_kernel3_tests.c b/tests/vboot_api_kernel3_tests.c index fa13d4e9..cefbf416 100644 --- a/tests/vboot_api_kernel3_tests.c +++ b/tests/vboot_api_kernel3_tests.c @@ -74,7 +74,7 @@ static void ResetMocks(void) trust_ec = 0; mock_in_rw = 0; ec_protected = 0; - ec_run_image = -1; /* 0 = RO, 1 = RW */ + ec_run_image = 0; /* 0 = RO, 1 = RW */ ec_updated = 0; in_rw_retval = VBERROR_SUCCESS; protect_retval = VBERROR_SUCCESS; @@ -129,9 +129,8 @@ VbError_t VbExEcProtectRW(void) return protect_retval; } -VbError_t VbExEcStayInRO(void) +VbError_t VbExEcDisableJump(void) { - ec_run_image = 0; return run_retval; } -- cgit v1.2.1