5 #ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_BOOTSTRAP_FUZZER_UTIL_H_
6 #define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_BOOTSTRAP_FUZZER_UTIL_H_
12 #include "absl/types/optional.h"
13 #include "absl/types/span.h"
14 #include "sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h"
15 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
16 #include "sw/device/silicon_creator/lib/drivers/mock_rstmgr.h"
17 #include "sw/device/silicon_creator/lib/drivers/mock_spi_device.h"
19 namespace bootstrap_fuzzer {
34 : data_(data), verbose_(verbose) {}
48 std::cout << std::hex <<
"Parsed spi_device_cmd_t: {"
61 template <
typename IntType>
62 IntType
ParseIntOr(
const char *log_label, IntType default_value) {
63 const IntType value = ParseInt<IntType>().value_or(default_value);
65 std::cout << std::hex <<
"Parsed " << log_label <<
": 0x" << value
72 template <
typename IntType>
73 absl::optional<IntType> ParseInt() {
75 std::is_integral<IntType>::value || std::is_enum<IntType>::value,
76 "IntType must be an integral or enum type");
77 if (data_.length() <
sizeof(IntType)) {
81 memcpy(&n, data_.data(),
sizeof(IntType));
82 data_ = data_.subspan(
sizeof(IntType));
86 absl::optional<spi_device_cmd_t> ParseCmd() {
87 auto opcode = ParseInt<uint8_t>();
88 auto address = ParseInt<uint32_t>();
89 auto payload_byte_count = ParseInt<size_t>();
90 if (!opcode || !address || !payload_byte_count) {
94 .
opcode =
static_cast<spi_device_opcode_t
>(*opcode & UINT8_MAX),
97 *payload_byte_count % (kSpiDevicePayloadAreaNumBytes + 1),
102 absl::Span<const uint8_t> data_;
103 bool verbose_{
false};
144 bool verbose_{
false};
145 bool flash_status_override_{
false};
146 size_t max_spi_cmd_count_{0};
147 size_t spi_cmd_count_{0};
149 ::rom_test::NiceMockSpiDevice spi_device_;
150 ::rom_test::NiceMockRstmgr rstmgr_;
151 ::rom_test::NiceMockFlashCtrl flash_ctrl_;
152 ::rom_test::NiceMockOtp otp_;