From 758fc8f45b6cc9e305a214be423877dcdf47848d Mon Sep 17 00:00:00 2001 From: Nicolas Boichat Date: Thu, 13 Apr 2017 10:53:02 +0800 Subject: [PATCH] rwsig: protect all flash before jumping to RW On "normal" EC, we do protect RW as part of software sync, which would call flash_command_protect (which indirectly calls flash_protect_at_boot). Here, we don't want to (and can't) rely on the host to tell us to protect the RW, so we need to protect it ourselves before jumping to RW. This does feel a little redundant with rollback_lock though, since ALL will protect both RW and ROLLBACK: a later CL will fix that up. BRANCH=none BUG=b:35587171 TEST=flashwp true; reboot; RO protects all flash before booting to RW Change-Id: I820cabb01d1ca4aa47b81fc013a1670134a6be09 Reviewed-on: https://chromium-review.googlesource.com/476453 Commit-Ready: Nicolas Boichat Tested-by: Nicolas Boichat Reviewed-by: Randall Spangler --- common/rwsig.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/common/rwsig.c b/common/rwsig.c index 244e201ad4..a4ba19e937 100644 --- a/common/rwsig.c +++ b/common/rwsig.c @@ -9,6 +9,7 @@ #include "console.h" #include "ec_commands.h" +#include "flash.h" #include "rollback.h" #include "rsa.h" #include "rwsig.h" @@ -32,10 +33,28 @@ static uint32_t * const rw_rst = void rwsig_jump_now(void) { + /* Protect all flash before jumping to RW. */ + /* - * TODO(b/35587171): This should also check RW flash is protected. + * This may do nothing if WP is not enabled, RO is not + * protected, or if ALL_AT_BOOT is already set. */ - system_run_image_copy(SYSTEM_IMAGE_RW); + flash_set_protect(EC_FLASH_PROTECT_ALL_AT_BOOT, -1); + + if (!(flash_get_protect() & EC_FLASH_PROTECT_ALL_NOW) && + flash_get_protect() & EC_FLASH_PROTECT_ALL_AT_BOOT) { + /* + * If flash protection is still not enabled (some chips may + * be able to enable it immediately), reboot. + */ + cflush(); + system_reset(SYSTEM_RESET_HARD | SYSTEM_RESET_PRESERVE_FLAGS); + } + + /* When system is locked, only boot to RW is all flash is protected. */ + if (!system_is_locked() || + flash_get_protect() & EC_FLASH_PROTECT_ALL_NOW) + system_run_image_copy(SYSTEM_IMAGE_RW); } /*