summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDivya Jyothi <divya.jyothi@intel.com>2015-06-25 20:19:37 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-07-01 03:49:00 +0000
commitb4c205bf51cfebeac1ddc7617dba24d8111bc9ed (patch)
treec1399d4ecbae939623505eed9b955e1b91f43e3f
parentd2dabdae5d2b348f3c5fe3d13c64834451e214b5 (diff)
downloadchrome-ec-b4c205bf51cfebeac1ddc7617dba24d8111bc9ed.tar.gz
vboot_hash: Abort hash calculation on flash write
If flash is being written, any pending hash calculation is likely to be invalid. BRANCH=None BUG=chrome-os-partner:38103 TEST=on Cyan, run hundreds of flashrom cycles to make sure there are no read, erase or write errors Change-Id: I915f8db7998c56fc12e7d85173232882fb7ed80d Signed-off-by: Divya Jyothi <divya.jyothi@intel.com> Reviewed-on: https://chromium-review.googlesource.com/282211 Reviewed-by: Shawn N <shawnn@chromium.org> Commit-Queue: Bernie Thompson <bhthompson@chromium.org> Tested-by: Bernie Thompson <bhthompson@chromium.org>
-rw-r--r--common/flash.c20
-rw-r--r--common/vboot_hash.c7
-rw-r--r--include/vboot_hash.h12
3 files changed, 36 insertions, 3 deletions
diff --git a/common/flash.c b/common/flash.c
index 6d903eca95..b5dad96438 100644
--- a/common/flash.c
+++ b/common/flash.c
@@ -313,7 +313,15 @@ int flash_write(int offset, int size, const char *data)
return EC_ERROR_INVAL; /* Invalid range */
#ifdef CONFIG_VBOOT_HASH
- vboot_hash_invalidate(offset, size);
+ /*
+ * Abort hash calculations when flashrom flash updates
+ * are in progress.Otherwise invalidate the pre-computed hash,
+ * since it's likely to change after flash write
+ */
+ if (vboot_hash_in_progress())
+ vboot_hash_abort();
+ else
+ vboot_hash_invalidate(offset, size);
#endif
return flash_physical_write(offset, size, data);
@@ -325,7 +333,15 @@ int flash_erase(int offset, int size)
return EC_ERROR_INVAL; /* Invalid range */
#ifdef CONFIG_VBOOT_HASH
- vboot_hash_invalidate(offset, size);
+ /*
+ * Abort hash calculations when flashrom flash updates
+ * are in progress.Otherwise invalidate the pre-computed hash,
+ * since it's likely to be wrong after erase.
+ */
+ if (vboot_hash_in_progress())
+ vboot_hash_abort();
+ else
+ vboot_hash_invalidate(offset, size);
#endif
return flash_physical_erase(offset, size);
diff --git a/common/vboot_hash.c b/common/vboot_hash.c
index 1d203e77f9..ff2c56fb59 100644
--- a/common/vboot_hash.c
+++ b/common/vboot_hash.c
@@ -43,10 +43,15 @@ static int in_progress;
static struct sha256_ctx ctx;
+int vboot_hash_in_progress(void)
+{
+ return in_progress;
+}
+
/**
* Abort hash currently in progress, and invalidate any completed hash.
*/
-static void vboot_hash_abort(void)
+void vboot_hash_abort(void)
{
if (in_progress) {
want_abort = 1;
diff --git a/include/vboot_hash.h b/include/vboot_hash.h
index 002282b346..bad89275c2 100644
--- a/include/vboot_hash.h
+++ b/include/vboot_hash.h
@@ -20,4 +20,16 @@
*/
int vboot_hash_invalidate(int offset, int size);
+/**
+ * Get vboot progress status.
+ *
+ * @return 1 if vboot hashing is in progress, 0 otherwise.
+ */
+int vboot_hash_in_progress(void);
+
+/**
+ * Abort hash currently in progress, and invalidate any completed hash.
+ */
+void vboot_hash_abort(void);
+
#endif /* __CROS_EC_VBOOT_HASH_H */