[sw/silicon_creator] Add flash_ctrl_bank_erase_perms_set(). Doc for flash_ctrl bank erase permissions was added in #11449. This commit adds `flash_ctrl_bank_erase_perms_set()` that need to be called before a bank erase. Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/flash_ctrl.c b/sw/device/silicon_creator/lib/drivers/flash_ctrl.c index ab7529b..cf3d2ef 100644 --- a/sw/device/silicon_creator/lib/drivers/flash_ctrl.c +++ b/sw/device/silicon_creator/lib/drivers/flash_ctrl.c
@@ -528,6 +528,27 @@ sec_mmio_write32(cfg_addr, reg); } +void flash_ctrl_bank_erase_perms_set(hardened_bool_t enable) { + uint32_t reg; + switch (launder32(enable)) { + case kHardenedBoolTrue: + HARDENED_CHECK_EQ(enable, kHardenedBoolTrue); + reg = bitfield_bit32_write( + 0, FLASH_CTRL_MP_BANK_CFG_SHADOWED_ERASE_EN_0_BIT, true); + reg = bitfield_bit32_write( + reg, FLASH_CTRL_MP_BANK_CFG_SHADOWED_ERASE_EN_1_BIT, true); + break; + case kHardenedBoolFalse: + HARDENED_CHECK_EQ(enable, kHardenedBoolFalse); + reg = 0; + break; + default: + HARDENED_UNREACHABLE(); + } + sec_mmio_write32_shadowed(kBase + FLASH_CTRL_MP_BANK_CFG_SHADOWED_REG_OFFSET, + reg); +} + /** * Information pages that should be locked by ROM_EXT before handing over * execution to the first owner boot stage. See
diff --git a/sw/device/silicon_creator/lib/drivers/flash_ctrl.h b/sw/device/silicon_creator/lib/drivers/flash_ctrl.h index 9a06558..b82448c 100644 --- a/sw/device/silicon_creator/lib/drivers/flash_ctrl.h +++ b/sw/device/silicon_creator/lib/drivers/flash_ctrl.h
@@ -152,6 +152,7 @@ kFlashCtrlSecMmioExecSet = 1, kFlashCtrlSecMmioInfoCfgSet = 1, kFlashCtrlSecMmioInfoPermsSet = 1, + kFlashCtrlSecMmioBankErasePermsSet = 1, kFlashCtrlSecMmioInit = 5, }; @@ -432,6 +433,17 @@ void flash_ctrl_info_cfg_set(flash_ctrl_info_page_t info_page, flash_ctrl_cfg_t cfg); /** + * Set bank erase permissions for both flash banks. + * + * The caller is responsible for calling + * `SEC_MMIO_WRITE_INCREMENT(kFlashCtrlSecMmioBankErasePermsSet)` when + * sec_mmio is being used to check expectations. + * + * @param enable Whether to enable bank erase. + */ +void flash_ctrl_bank_erase_perms_set(hardened_bool_t enable); + +/** * Enable execution from flash. * * Note: a ePMP region must also be configured in order to execute code in
diff --git a/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc b/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc index bcafd74..1bf028e 100644 --- a/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc +++ b/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
@@ -601,6 +601,20 @@ flash_ctrl_creator_info_pages_lockdown(); } +TEST_F(FlashCtrlTest, BankErasePermsSet) { + EXPECT_SEC_WRITE32_SHADOWED( + base_ + FLASH_CTRL_MP_BANK_CFG_SHADOWED_REG_OFFSET, + { + {FLASH_CTRL_MP_BANK_CFG_SHADOWED_ERASE_EN_0_BIT, 1}, + {FLASH_CTRL_MP_BANK_CFG_SHADOWED_ERASE_EN_1_BIT, 1}, + }); + flash_ctrl_bank_erase_perms_set(kHardenedBoolTrue); + + EXPECT_SEC_WRITE32_SHADOWED( + base_ + FLASH_CTRL_MP_BANK_CFG_SHADOWED_REG_OFFSET, 0); + flash_ctrl_bank_erase_perms_set(kHardenedBoolFalse); +} + struct EraseVerifyCase { /** * Address.
diff --git a/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc b/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc index a512ac6..51c31e9 100644 --- a/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc +++ b/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc
@@ -70,6 +70,10 @@ MockFlashCtrl::Instance().InfoCfgSet(info_page, cfg); } +void flash_ctrl_bank_erase_perms_set(hardened_bool_t enable) { + MockFlashCtrl::Instance().BankErasePermsSet(enable); +} + void flash_ctrl_exec_set(uint32_t exec_val) { MockFlashCtrl::Instance().ExecSet(exec_val); }
diff --git a/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h b/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h index e211fe8..0c38b59 100644 --- a/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h +++ b/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h
@@ -33,6 +33,7 @@ MOCK_METHOD(void, InfoPermsSet, (flash_ctrl_info_page_t, flash_ctrl_perms_t)); MOCK_METHOD(void, DataDefaultCfgSet, (flash_ctrl_cfg_t)); MOCK_METHOD(void, InfoCfgSet, (flash_ctrl_info_page_t, flash_ctrl_cfg_t)); + MOCK_METHOD(void, BankErasePermsSet, (hardened_bool_t)); MOCK_METHOD(void, ExecSet, (uint32_t)); MOCK_METHOD(void, CreatorInfoPagesLockdown, ()); }; @@ -107,6 +108,10 @@ MockFlashCtrl::Instance().InfoCfgSet(info_page, cfg); } +void flash_ctrl_bank_erase_perms_set(hardened_bool_t enable) { + MockFlashCtrl::Instance().BankErasePermsSet(enable); +} + void flash_ctrl_exec_set(uint32_t exec_val) { MockFlashCtrl::Instance().ExecSet(exec_val); }