From b4c205bf51cfebeac1ddc7617dba24d8111bc9ed Mon Sep 17 00:00:00 2001 From: Divya Jyothi Date: Thu, 25 Jun 2015 20:19:37 -0700 Subject: [PATCH] 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 Reviewed-on: https://chromium-review.googlesource.com/282211 Reviewed-by: Shawn N Commit-Queue: Bernie Thompson Tested-by: Bernie Thompson --- common/flash.c | 20 ++++++++++++++++++-- common/vboot_hash.c | 7 ++++++- include/vboot_hash.h | 12 ++++++++++++ 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 */