5 #include "sw/device/silicon_creator/lib/shutdown.h"
9 #include "gtest/gtest.h"
10 #include "sw/device/lib/base/global_mock.h"
13 #include "sw/device/lib/base/mock_abs_mmio.h"
14 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
15 #include "sw/device/silicon_creator/lib/drivers/mock_alert.h"
16 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
17 #include "sw/device/silicon_creator/lib/error.h"
18 #include "sw/device/silicon_creator/testing/rom_test.h"
20 #include "alert_handler_regs.h"
21 #include "flash_ctrl_regs.h"
23 #include "lc_ctrl_regs.h"
24 #include "otp_ctrl_regs.h"
25 #include "rv_core_ibex_regs.h"
27 namespace shutdown_unittest {
29 using ::testing::ElementsAre;
30 using ::testing::Invoke;
31 using ::testing::Return;
32 using ::testing::Test;
40 MOCK_METHOD(
void, shutdown_report_error, (rom_error_t));
41 MOCK_METHOD(
void, shutdown_software_escalate, ());
42 MOCK_METHOD(
void, shutdown_keymgr_kill, ());
43 MOCK_METHOD(
void, shutdown_reset, ());
44 MOCK_METHOD(
void, shutdown_flash_kill, ());
45 MOCK_METHOD(
void, shutdown_hang, ());
49 using MockShutdownImpl = testing::StrictMock<internal::MockShutdownImpl>;
51 void shutdown_report_error(rom_error_t error) {
52 return MockShutdownImpl::Instance().shutdown_report_error(error);
54 void shutdown_software_escalate(
void) {
55 return MockShutdownImpl::Instance().shutdown_software_escalate();
57 void shutdown_keymgr_kill(
void) {
58 return MockShutdownImpl::Instance().shutdown_keymgr_kill();
60 void shutdown_reset(
void) {
61 return MockShutdownImpl::Instance().shutdown_reset();
63 void shutdown_flash_kill(
void) {
64 return MockShutdownImpl::Instance().shutdown_flash_kill();
66 void shutdown_hang(
void) {
67 return MockShutdownImpl::Instance().shutdown_hang();
71 extern void unmocked_shutdown_flash_kill(
void);
72 extern void unmocked_shutdown_software_escalate(
void);
75 constexpr uint32_t Pack32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
76 uint32_t result = (a << 0) | (b << 8) | (c << 16) | (d << 24);
80 #define FULL(name, prod, prodend, dev, rma) \
82 name, kAlertClass##prod, kAlertClass##prodend, kAlertClass##dev, \
86 #define CLASSIFY(name, prod, prodend, dev, rma) \
87 Pack32(kAlertClass##prod, kAlertClass##prodend, kAlertClass##dev, \
96 #define ALERTS(Xmacro) \
97 Xmacro("Uart0FatalFault", C, C, X, X), \
98 Xmacro("Uart1FatalFault", C, C, X, X), \
99 Xmacro("Uart2FatalFault", C, C, X, X), \
100 Xmacro("Uart3FatalFault", C, C, X, X), \
101 Xmacro("GpioFatalFault", C, C, X, X), \
102 Xmacro("SpiDeviceFatalFault", C, C, X, X), \
103 Xmacro("SpiHost0FatalFault", C, C, X, X), \
104 Xmacro("SpiHost1FatalFault", C, C, X, X), \
105 Xmacro("I2c0FatalFault", C, C, X, X), \
106 Xmacro("I2c1FatalFault", C, C, X, X), \
107 Xmacro("I2c2FatalFault", C, C, X, X), \
108 Xmacro("PattgenFatalFault", C, C, X, X), \
109 Xmacro("OtpCtrlFatalMacroError", A, A, X, X), \
110 Xmacro("OtpCtrlFatalCheckError", A, A, X, X), \
111 Xmacro("LcCtrlFatalProgError", A, A, X, X), \
112 Xmacro("LcCtrlFatalStateError", A, A, X, X), \
113 Xmacro("LcCtrlFatalBusIntegError", A, A, X, X), \
114 Xmacro("PwrmgrAonFatalFault", C, C, X, X), \
115 Xmacro("RstmgrAonFatalFault", C, C, X, X), \
116 Xmacro("ClkmgrAonFatalFault", C, C, X, X), \
117 Xmacro("SysrstCtrlAonFatalFault", C, C, X, X), \
118 Xmacro("AdcCtrlAonFatalFault", C, C, X, X), \
119 Xmacro("PwmAonFatalFault", C, C, X, X), \
120 Xmacro("PinmuxAonFatalFault", C, C, X, X), \
121 Xmacro("AonTimerAonFatalFault", C, C, X, X), \
122 Xmacro("SensorCtrlAonRecovAs", B, B, X, X), \
123 Xmacro("SensorCtrlAonRecovCg", C, C, X, X), \
124 Xmacro("SensorCtrlAonRecovGd", C, C, X, X), \
125 Xmacro("SensorCtrlAonRecovTsHi", C, C, X, X), \
126 Xmacro("SensorCtrlAonRecovTsLo", C, C, X, X), \
127 Xmacro("SensorCtrlAonRecovFla", C, C, X, X), \
128 Xmacro("SensorCtrlAonRecovOtp", C, C, X, X), \
129 Xmacro("SensorCtrlAonRecovOt0", C, C, X, X), \
130 Xmacro("SensorCtrlAonRecovOt1", C, C, X, X), \
131 Xmacro("SensorCtrlAonRecovOt2", C, C, X, X), \
132 Xmacro("SensorCtrlAonRecovOt3", C, C, X, X), \
133 Xmacro("SensorCtrlAonRecovOt4", C, C, X, X), \
134 Xmacro("SensorCtrlAonRecovOt5", C, C, X, X), \
135 Xmacro("SramCtrlRetAonFatalIntgError", B, B, X, X), \
136 Xmacro("SramCtrlRetAonFatalParityError", B, B, X, X), \
137 Xmacro("FlashCtrlRecovErr", D, D, X, X), \
138 Xmacro("FlashCtrlRecovMpErr", D, D, X, X), \
139 Xmacro("FlashCtrlRecovEccErr", D, D, X, X), \
140 Xmacro("FlashCtrlFatalIntgErr", A, A, X, X), \
141 Xmacro("RvPlicFatalFault", A, A, X, X), \
142 Xmacro("AesRecovCtrlUpdateErr", D, D, X, X), \
143 Xmacro("AesFatalFault", A, A, X, X), \
144 Xmacro("HmacFatalFault", A, A, X, X), \
145 Xmacro("KmacFatalFault", A, A, X, X), \
146 Xmacro("KeymgrFatalFaultErr", A, A, X, X), \
147 Xmacro("KeymgrRecovOperationErr", D, D, X, X), \
148 Xmacro("CsrngFatalAlert", A, A, X, X), \
149 Xmacro("EntropySrcRecovAlert", D, D, X, X), \
150 Xmacro("EntropySrcFatalAlert", A, A, X, X), \
151 Xmacro("Edn0FatalAlert", A, A, X, X), \
152 Xmacro("Edn1FatalAlert", A, A, X, X), \
153 Xmacro("SramCtrlMainFatalIntgError", A, A, X, X), \
154 Xmacro("SramCtrlMainFatalParityError", A, A, X, X), \
155 Xmacro("OtbnFatal", A, A, X, X), \
156 Xmacro("OtbnRecov", D, D, X, X), \
157 Xmacro("RomCtrlFatal", A, A, X, X), \
158 Xmacro("Dummy61", X, X, X, X), \
159 Xmacro("Dummy62", X, X, X, X), \
160 Xmacro("Dummy63", X, X, X, X), \
161 Xmacro("Dummy64", X, X, X, X), \
162 Xmacro("Dummy65", X, X, X, X), \
163 Xmacro("Dummy66", X, X, X, X), \
164 Xmacro("Dummy67", X, X, X, X), \
165 Xmacro("Dummy68", X, X, X, X), \
166 Xmacro("Dummy69", X, X, X, X), \
167 Xmacro("Dummy70", X, X, X, X), \
168 Xmacro("Dummy71", X, X, X, X), \
169 Xmacro("Dummy72", X, X, X, X), \
170 Xmacro("Dummy73", X, X, X, X), \
171 Xmacro("Dummy74", X, X, X, X), \
172 Xmacro("Dummy75", X, X, X, X), \
173 Xmacro("Dummy76", X, X, X, X), \
174 Xmacro("Dummy77", X, X, X, X), \
175 Xmacro("Dummy78", X, X, X, X), \
176 Xmacro("Dummy79", X, X, X, X)
178 #define LOC_ALERTS(Xmacro) \
179 Xmacro("LocAlertPingFail", A, A, X, X), \
180 Xmacro("LocEscPingFail", A, A, X, X), \
181 Xmacro("LocAlertIntegrityFail", A, A, X, X), \
182 Xmacro("LocEscIntegrityFail", A, A, X, X), \
183 Xmacro("LocBusIntegrityFail", A, A, X, X), \
184 Xmacro("LocShadowRegUpdateFail", A, A, X, X), \
185 Xmacro("LocShadowRegStorageError", A, A, X, X), \
186 Xmacro("LocDummy7", X, X, X, X), \
187 Xmacro("LocDummy8", X, X, X, X), \
188 Xmacro("LocDummy9", X, X, X, X), \
189 Xmacro("LocDummy10", X, X, X, X), \
190 Xmacro("LocDummy11", X, X, X, X), \
191 Xmacro("LocDummy12", X, X, X, X), \
192 Xmacro("LocDummy13", X, X, X, X), \
193 Xmacro("LocDummy14", X, X, X, X), \
194 Xmacro("LocDummy15", X, X, X, X),
198 uint32_t rom_error_reporting;
199 uint32_t rom_bootstrap_en;
200 uint32_t rom_alert_class_en;
201 uint32_t rom_alert_escalation;
202 uint32_t rom_alert_classification[80];
203 uint32_t rom_local_alert_classification[16];
204 uint32_t rom_alert_accum_thresh[4];
205 uint32_t rom_alert_timeout_cycles[4];
206 uint32_t rom_alert_phase_cycles[4][4];
212 alert_class_t prodend;
218 .rom_error_reporting = (uint32_t)kShutdownErrorRedactNone,
219 .rom_bootstrap_en = 1,
220 .rom_alert_class_en = Pack32(kAlertEnableLocked, kAlertEnableEnabled,
221 kAlertEnableNone, kAlertEnableNone),
222 .rom_alert_escalation = Pack32(kAlertEscalatePhase3, kAlertEscalatePhase3,
223 kAlertEscalateNone, kAlertEscalateNone),
224 .rom_alert_classification = {ALERTS(CLASSIFY)},
225 .rom_local_alert_classification = {LOC_ALERTS(CLASSIFY)},
226 .rom_alert_accum_thresh = {0, 0, 0, 0},
227 .rom_alert_timeout_cycles = {0, 0, 0, 0},
228 .rom_alert_phase_cycles =
230 {0, 10, 10, 0xFFFFFFFF},
231 {0, 10, 10, 0xFFFFFFFF},
237 constexpr DefaultAlertClassification kDefaultAlertClassification[] = {
240 static_assert(
ARRAYSIZE(kDefaultAlertClassification) <=
241 (OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_CLASSIFICATION_SIZE /
243 "The default alert classification must be less than or equal to "
244 "the number of reserved OTP words");
246 static_assert(kTopEarlgreyAlertIdLast <
ARRAYSIZE(kDefaultAlertClassification),
247 "The number of alert sources must be smaller than the alert "
250 constexpr DefaultAlertClassification kDefaultLocAlertClassification[] = {
253 ARRAYSIZE(kDefaultLocAlertClassification) <=
254 (OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_LOCAL_ALERT_CLASSIFICATION_SIZE / 4),
255 "The default local alert classification must be less than or "
256 "equal to the number of reserved OTP words");
258 constexpr alert_class_t kClasses[] = {
265 alert_enable_t RomAlertClassEnable(alert_class_t cls) {
269 return kAlertEnableLocked;
271 return kAlertEnableEnabled;
273 return kAlertEnableNone;
275 return kAlertEnableNone;
279 return kAlertEnableLocked;
283 alert_escalate_t RomAlertClassEscalation(alert_class_t cls) {
287 return kAlertEscalatePhase3;
289 return kAlertEscalatePhase3;
291 return kAlertEscalateNone;
293 return kAlertEscalateNone;
297 return kAlertEscalatePhase3;
303 void SetupOtpReads() {
305 ON_CALL(otp_, read32(::testing::_)).WillByDefault([
this](uint32_t address) {
307 EXPECT_EQ(address % 4, 0);
308 EXPECT_GE(address, OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET);
310 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET +
sizeof(this->otp_config_));
312 uint32_t index = (address - OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET) / 4;
313 const uint32_t *words =
314 reinterpret_cast<const uint32_t *
>(&this->otp_config_);
319 void ExpectClassConfigure() {
320 ExpectClassConfigure(0);
321 ExpectClassConfigure(1);
322 ExpectClassConfigure(2);
323 ExpectClassConfigure(3);
326 void ExpectClassConfigure(
size_t i) {
327 alert_class_t expected_cls = kClasses[i];
328 EXPECT_CALL(alert_, alert_class_configure(expected_cls, ::testing::_))
329 .WillOnce(Invoke([
this, i](alert_class_t cls,
331 alert_class_t expected_cls = kClasses[i];
334 EXPECT_EQ(cls, expected_cls);
335 EXPECT_EQ(config->
enabled, RomAlertClassEnable(expected_cls));
336 EXPECT_EQ(config->
escalation, RomAlertClassEscalation(expected_cls));
338 otp_config_.rom_alert_accum_thresh[i]);
340 otp_config_.rom_alert_timeout_cycles[i]);
342 ElementsAre(otp_config_.rom_alert_phase_cycles[i][0],
343 otp_config_.rom_alert_phase_cycles[i][1],
344 otp_config_.rom_alert_phase_cycles[i][2],
345 otp_config_.rom_alert_phase_cycles[i][3]));
351 void ExpectFinalize(rom_error_t error) {
355 EXPECT_CALL(shutdown_, shutdown_report_error(error));
356 EXPECT_CALL(shutdown_, shutdown_software_escalate());
357 EXPECT_CALL(shutdown_, shutdown_keymgr_kill());
358 EXPECT_CALL(shutdown_, shutdown_reset());
359 EXPECT_CALL(shutdown_, shutdown_flash_kill());
360 EXPECT_CALL(shutdown_, shutdown_hang());
366 rom_test::NiceMockOtp otp_;
367 MockShutdownImpl shutdown_;
368 rom_test::MockAlert alert_;
369 rom_test::MockAbsMmio mmio_;
374 for (
size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
376 const auto &c = kDefaultAlertClassification[i];
377 alert_class_t cls = c.prod;
378 alert_enable_t en = RomAlertClassEnable(cls);
379 EXPECT_CALL(alert_, alert_configure(i, cls, en)).WillOnce(Return(kErrorOk));
381 for (
size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
383 const auto &c = kDefaultLocAlertClassification[i];
384 alert_class_t cls = c.prod;
385 alert_enable_t en = RomAlertClassEnable(cls);
386 EXPECT_CALL(alert_, alert_local_configure(i, cls, en))
387 .WillOnce(Return(kErrorOk));
389 ExpectClassConfigure();
390 EXPECT_EQ(shutdown_init(kLcStateProd), kErrorOk);
393 TEST_F(ShutdownTest, InitializeProdWithAlertError) {
395 for (
size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
397 const auto &c = kDefaultAlertClassification[i];
398 alert_class_t cls = c.prod;
399 alert_enable_t en = RomAlertClassEnable(cls);
403 EXPECT_CALL(alert_, alert_configure(i, cls, en))
404 .WillOnce(Return(i == 0 ? kErrorUnknown : kErrorOk));
406 for (
size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
408 const auto &c = kDefaultLocAlertClassification[i];
409 alert_class_t cls = c.prod;
410 alert_enable_t en = RomAlertClassEnable(cls);
411 EXPECT_CALL(alert_, alert_local_configure(i, cls, en))
412 .WillOnce(Return(kErrorOk));
414 ExpectClassConfigure();
416 EXPECT_EQ(shutdown_init(kLcStateProd), kErrorUnknown);
419 TEST_F(ShutdownTest, InitializeProdWithLocalAlertError) {
421 for (
size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
423 const auto &c = kDefaultAlertClassification[i];
424 alert_class_t cls = c.prod;
425 alert_enable_t en = RomAlertClassEnable(cls);
426 EXPECT_CALL(alert_, alert_configure(i, cls, en)).WillOnce(Return(kErrorOk));
428 for (
size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
430 const auto &c = kDefaultLocAlertClassification[i];
431 alert_class_t cls = c.prod;
432 alert_enable_t en = RomAlertClassEnable(cls);
436 EXPECT_CALL(alert_, alert_local_configure(i, cls, en))
437 .WillOnce(Return(i == 0 ? kErrorUnknown : kErrorOk));
439 ExpectClassConfigure();
441 EXPECT_EQ(shutdown_init(kLcStateProd), kErrorUnknown);
444 TEST_F(ShutdownTest, InitializeProdEnd) {
446 for (
size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
448 const auto &c = kDefaultAlertClassification[i];
449 alert_class_t cls = c.prodend;
450 alert_enable_t en = RomAlertClassEnable(cls);
451 EXPECT_CALL(alert_, alert_configure(i, cls, en)).WillOnce(Return(kErrorOk));
453 for (
size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
455 const auto &c = kDefaultLocAlertClassification[i];
456 alert_class_t cls = c.prodend;
457 alert_enable_t en = RomAlertClassEnable(cls);
458 EXPECT_CALL(alert_, alert_local_configure(i, cls, en))
459 .WillOnce(Return(kErrorOk));
461 ExpectClassConfigure();
462 EXPECT_EQ(shutdown_init(kLcStateProdEnd), kErrorOk);
465 TEST_F(ShutdownTest, InitializeDev) {
467 for (
size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
469 const auto &c = kDefaultAlertClassification[i];
470 alert_class_t cls = c.dev;
471 alert_enable_t en = RomAlertClassEnable(cls);
472 EXPECT_CALL(alert_, alert_configure(i, cls, en)).WillOnce(Return(kErrorOk));
474 for (
size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
476 const auto &c = kDefaultLocAlertClassification[i];
477 alert_class_t cls = c.dev;
478 alert_enable_t en = RomAlertClassEnable(cls);
479 EXPECT_CALL(alert_, alert_local_configure(i, cls, en))
480 .WillOnce(Return(kErrorOk));
482 ExpectClassConfigure();
483 EXPECT_EQ(shutdown_init(kLcStateDev), kErrorOk);
486 TEST_F(ShutdownTest, InitializeRma) {
488 for (
size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
490 const auto &c = kDefaultAlertClassification[i];
491 alert_class_t cls = c.rma;
492 alert_enable_t en = RomAlertClassEnable(cls);
493 EXPECT_CALL(alert_, alert_configure(i, cls, en)).WillOnce(Return(kErrorOk));
495 for (
size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
497 const auto &c = kDefaultLocAlertClassification[i];
498 alert_class_t cls = c.rma;
499 alert_enable_t en = RomAlertClassEnable(cls);
500 EXPECT_CALL(alert_, alert_local_configure(i, cls, en))
501 .WillOnce(Return(kErrorOk));
503 ExpectClassConfigure();
504 EXPECT_EQ(shutdown_init(kLcStateRma), kErrorOk);
507 TEST_F(ShutdownTest, RedactPolicyManufacturing) {
510 constexpr std::array<uint32_t, 9> kManufacturingStates = {
511 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED0,
512 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED1,
513 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED2,
514 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED3,
515 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED4,
516 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED5,
517 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED6,
518 LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED7,
519 LC_CTRL_LC_STATE_STATE_VALUE_RMA,
521 for (
const auto state : kManufacturingStates) {
524 static_cast<uint32_t
>(state));
525 EXPECT_EQ(shutdown_redact_policy(), kShutdownErrorRedactNone);
529 TEST_F(ShutdownTest, RedactPolicyProduction) {
531 constexpr std::array<uint32_t, 3> kProductionStates = {
532 LC_CTRL_LC_STATE_STATE_VALUE_DEV,
533 LC_CTRL_LC_STATE_STATE_VALUE_PROD,
534 LC_CTRL_LC_STATE_STATE_VALUE_PROD_END,
536 for (
const auto state : kProductionStates) {
539 static_cast<uint32_t
>(state));
542 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
543 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ERROR_REPORTING_OFFSET,
544 static_cast<uint32_t
>(kShutdownErrorRedactModule));
545 EXPECT_EQ(shutdown_redact_policy(), kShutdownErrorRedactModule);
549 TEST_F(ShutdownTest, RedactPolicyInvalid) {
554 EXPECT_EQ(shutdown_redact_policy(), kShutdownErrorRedactAll);
557 TEST_F(ShutdownTest, InitializeManufacturing) {
560 EXPECT_EQ(shutdown_init(kLcStateTest), kErrorOk);
569 OT_DISCARD(shutdown_init(
static_cast<lifecycle_state_t
>(0)));
574 TEST(ShutdownModule, RedactErrors) {
575 EXPECT_EQ(shutdown_redact(kErrorOk, kShutdownErrorRedactNone), 0);
576 EXPECT_EQ(shutdown_redact(kErrorOk, kShutdownErrorRedactError), 0);
577 EXPECT_EQ(shutdown_redact(kErrorOk, kShutdownErrorRedactModule), 0);
578 EXPECT_EQ(shutdown_redact(kErrorOk, kShutdownErrorRedactAll), 0);
580 rom_error_t error =
static_cast<rom_error_t
>(0xaabbccdd);
581 EXPECT_EQ(shutdown_redact(error, kShutdownErrorRedactNone), 0xaabbccdd);
582 EXPECT_EQ(shutdown_redact(error, kShutdownErrorRedactError), 0x00bbccdd);
583 EXPECT_EQ(shutdown_redact(error, kShutdownErrorRedactModule), 0x000000dd);
584 EXPECT_EQ(shutdown_redact(error, kShutdownErrorRedactAll), 0xffffffff);
587 TEST_F(ShutdownTest, ShutdownFinalize) {
589 ExpectFinalize(kErrorUnknown);
590 shutdown_finalize(kErrorUnknown);
593 TEST_F(ShutdownTest, FlashKill) {
596 unmocked_shutdown_flash_kill();
599 TEST_F(ShutdownTest, ShutdownIfErrorOk) { SHUTDOWN_IF_ERROR(kErrorOk); }
601 TEST_F(ShutdownTest, ShutdownIfErrorUnknown) {
604 ExpectFinalize(kErrorUnknown);
605 SHUTDOWN_IF_ERROR(kErrorUnknown);
610 TEST_F(ShutdownTest, SoftwareEscalate) {
612 RV_CORE_IBEX_SW_FATAL_ERR_REG_OFFSET,
614 unmocked_shutdown_software_escalate();