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 <dnojiri@chromium.org>
Change-Id: Ia73da70dbf3abb5ced48666e86715c8d24a431a0
Reviewed-on: https://chromium-review.googlesource.com/172635
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@google.com>
Commit-Queue: Daisuke Nojiri <dnojiri@google.com>
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index 214da75..0ae6c76 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -752,11 +752,10 @@
 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 4f0b3f2..5c498ee 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -615,10 +615,10 @@
 		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 @@
 		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 36d5603..e82be5b 100644
--- a/firmware/stub/vboot_api_stub.c
+++ b/firmware/stub/vboot_api_stub.c
@@ -91,7 +91,7 @@
 	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 fa13d4e..cefbf41 100644
--- a/tests/vboot_api_kernel3_tests.c
+++ b/tests/vboot_api_kernel3_tests.c
@@ -74,7 +74,7 @@
 	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 @@
 	return protect_retval;
 }
 
-VbError_t VbExEcStayInRO(void)
+VbError_t VbExEcDisableJump(void)
 {
-	ec_run_image = 0;
 	return run_retval;
 }