6 #include "sw/device/lib/base/status.h"
8 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
10 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
11 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
12 #include "sw/device/lib/ujson/ujson.h"
13 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
14 #include "sw/device/tests/penetrationtests/json/lc_ctrl_fi_commands.h"
19 #define NOP1 "addi x0, x0, 0\n"
20 #define NOP10 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1
21 #define NOP100 NOP10 NOP10 NOP10 NOP10 NOP10 NOP10 NOP10 NOP10 NOP10 NOP10
23 static dif_rv_core_ibex_t rv_core_ibex;
24 static dif_lc_ctrl_t lc;
27 penetrationtest_cpuctrl_t uj_data;
28 TRY(ujson_deserialize_penetrationtest_cpuctrl_t(uj, &uj_data));
30 pentest_select_trigger_type(kPentestTriggerTypeSw);
34 pentest_init(kPentestTriggerSourceAes,
35 kPentestPeripheralIoDiv4 | kPentestPeripheralCsrng);
38 penetrationtest_device_info_t uj_output;
39 TRY(pentest_configure_cpu(
40 uj_data.icache_disable, uj_data.dummy_instr_disable,
41 uj_data.enable_jittery_clock, uj_data.enable_sram_readback,
42 &uj_output.clock_jitter_locked, &uj_output.clock_jitter_en,
43 &uj_output.sram_main_readback_locked, &uj_output.sram_ret_readback_locked,
44 &uj_output.sram_main_readback_en, &uj_output.sram_ret_readback_en));
47 TRY(dif_rv_core_ibex_init(
54 TRY(dif_lc_ctrl_init(lc_reg, &lc));
58 pentest_configure_alert_handler();
61 TRY(pentest_read_device_id(uj_output.device_id));
62 RESP_OK(ujson_serialize_penetrationtest_device_info_t, uj, &uj_output);
71 pentest_clear_sensor_recov_alerts();
79 pentest_set_trigger_high();
83 pentest_set_trigger_low();
86 reg_alerts = pentest_get_triggered_alerts();
99 lc_ctrl_fi_corruption_t uj_output;
101 if (lc_state_cmp != lc_state_ref) {
105 if (lc_count_cmp != lc_count_ref) {
114 dif_rv_core_ibex_error_status_t err_ibx;
115 TRY(dif_rv_core_ibex_get_error_status(&rv_core_ibex, &err_ibx));
118 uj_output.state = lc_state_cmp;
119 uj_output.counter = lc_count_cmp;
120 uj_output.err_status = err_ibx;
121 memcpy(uj_output.alerts, reg_alerts.alerts,
sizeof(reg_alerts.alerts));
122 memcpy(uj_output.ast_alerts, sensor_alerts.alerts,
123 sizeof(sensor_alerts.alerts));
124 RESP_OK(ujson_serialize_lc_ctrl_fi_corruption_t, uj, &uj_output);
130 lc_ctrl_fi_subcommand_t cmd;
131 TRY(ujson_deserialize_lc_ctrl_fi_subcommand_t(uj, &cmd));
133 case kLcCtrlFiSubcommandInit:
134 return handle_lc_ctrl_fi_init(uj);
135 case kLcCtrlFiSubcommandRuntimeCorruption:
136 return handle_lc_ctrl_fi_runtime_corruption(uj);
138 LOG_ERROR(
"Unrecognized LC CTRL FI subcommand: %d", cmd);
139 return INVALID_ARGUMENT();