5 #include "sw/device/silicon_creator/lib/bootstrap_fuzzer_util.h"
10 #include <type_traits>
13 #include "absl/types/optional.h"
14 #include "absl/types/span.h"
15 #include "gmock/gmock.h"
18 #include "sw/device/silicon_creator/lib/bootstrap_unittest_util.h"
19 #include "sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h"
20 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
21 #include "sw/device/silicon_creator/lib/drivers/mock_rstmgr.h"
22 #include "sw/device/silicon_creator/lib/drivers/mock_spi_device.h"
24 #include "flash_ctrl_regs.h"
26 #include "otp_ctrl_regs.h"
28 namespace bootstrap_fuzzer {
31 void Crash() { __builtin_trap(); }
34 StaticFuzzerEnvironment::StaticFuzzerEnvironment() {
35 testing::InitGoogleMock();
38 AbstractBootstrapMockGroup::AbstractBootstrapMockGroup(
StreamParser stream,
40 : verbose_(verbose), stream_(std::move(stream)) {}
44 using ::testing::Return;
46 ON_CALL(flash_ctrl_, DataErase(_, _)).WillByDefault(Return(kErrorOk));
47 ON_CALL(flash_ctrl_, DataWrite(_, _, _)).WillByDefault(Return(kErrorOk));
48 ON_CALL(flash_ctrl_, DataEraseVerify(_, _)).WillByDefault(Return(kErrorOk));
50 ON_CALL(rstmgr_, ReasonGet()).WillByDefault([&] {
53 1 << kRstmgrReasonPowerOn | 1 << kRstmgrReasonSoftwareRequest);
62 (stream_.
ParseIntOr<
size_t>(
"max_spi_cmd_count_", 1024) % 1024) + 16;
64 std::cout <<
"Clamped max_spi_cmd_count_: " << max_spi_cmd_count_
68 ON_CALL(spi_device_, FlashStatusGet()).WillByDefault([&] {
69 return flash_status_override_
70 ? uint32_t{1 << kSpiDeviceWelBit}
71 : stream_.
ParseIntOr<uint32_t>(
"flash_status", 0);
74 ON_CALL(spi_device_, CmdGet(testing::NotNull()))
78 if (spi_cmd_count_ < max_spi_cmd_count_) {
79 *cmd = stream_.
ParseCmdOr(bootstrap_unittest_util::ChipEraseCmd());
82 if (spi_cmd_count_ == max_spi_cmd_count_) {
83 *cmd = bootstrap_unittest_util::ChipEraseCmd();
84 flash_status_override_ =
true;
86 std::cout <<
"Attempting to end session: CHIP_ERASE" << std::endl;
90 if (spi_cmd_count_ == max_spi_cmd_count_ + 1) {
91 *cmd = bootstrap_unittest_util::ResetCmd();
93 std::cout <<
"Attempting to end session: RESET" << std::endl;
101 return kErrorUnknown;