5 #include "sw/device/tests/penetrationtests/firmware/fi/rom_fi.h"
9 #include "sw/device/lib/base/status.h"
11 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
13 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
14 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
15 #include "sw/device/lib/ujson/ujson.h"
16 #include "sw/device/tests/penetrationtests/firmware/lib/pentest_lib.h"
17 #include "sw/device/tests/penetrationtests/json/rom_fi_commands.h"
20 #include "rom_ctrl_regs.h"
23 #define NOP1 "addi x0, x0, 0\n"
24 #define NOP10 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1 NOP1
25 #define NOP30 NOP10 NOP10 NOP10
28 static dif_rv_core_ibex_t rv_core_ibex;
30 static dif_rom_ctrl_t rom_ctrl;
39 pentest_set_trigger_high();
50 pentest_set_trigger_low();
53 reg_alerts = pentest_get_triggered_alerts();
58 dif_rv_core_ibex_error_status_t codes;
59 TRY(dif_rv_core_ibex_get_error_status(&rv_core_ibex, &codes));
61 rom_fi_digest_t uj_output;
62 memset(uj_output.digest, 0,
sizeof(uj_output.digest));
63 for (
size_t i = 0; i < 8; i++) {
64 if (
memcmp(&expected_digest, &fi_digest[i],
65 ROM_CTRL_DIGEST_MULTIREG_COUNT)) {
73 uj_output.err_status = codes;
74 memcpy(uj_output.alerts, reg_alerts.alerts,
sizeof(reg_alerts.alerts));
75 memcpy(uj_output.ast_alerts, sensor_alerts.alerts,
76 sizeof(sensor_alerts.alerts));
77 RESP_OK(ujson_serialize_rom_fi_digest_t, uj, &uj_output);
82 penetrationtest_cpuctrl_t uj_data;
83 TRY(ujson_deserialize_penetrationtest_cpuctrl_t(uj, &uj_data));
85 pentest_select_trigger_type(kPentestTriggerTypeSw);
86 pentest_init(kPentestTriggerSourceAes,
87 kPentestPeripheralIoDiv4 | kPentestPeripheralEdn |
88 kPentestPeripheralCsrng | kPentestPeripheralEntropy |
89 kPentestPeripheralKmac);
93 pentest_configure_alert_handler();
96 penetrationtest_device_info_t uj_output;
97 TRY(pentest_configure_cpu(
98 uj_data.icache_disable, uj_data.dummy_instr_disable,
99 uj_data.enable_jittery_clock, uj_data.enable_sram_readback,
100 &uj_output.clock_jitter_locked, &uj_output.clock_jitter_en,
101 &uj_output.sram_main_readback_locked, &uj_output.sram_ret_readback_locked,
102 &uj_output.sram_main_readback_en, &uj_output.sram_ret_readback_en));
107 TRY(dif_rom_ctrl_init(rom_ctrl_reg, &rom_ctrl));
110 TRY(dif_rv_core_ibex_init(
115 TRY(pentest_read_device_id(uj_output.device_id));
116 RESP_OK(ujson_serialize_penetrationtest_device_info_t, uj, &uj_output);
122 rom_fi_subcommand_t cmd;
123 TRY(ujson_deserialize_rom_fi_subcommand_t(uj, &cmd));
125 case kRomFiSubcommandInit:
126 return handle_rom_fi_init(uj);
127 case kRomFiSubcommandRead:
128 return handle_rom_read(uj);
130 LOG_ERROR(
"Unrecognized Rom FI subcommand: %d", cmd);
131 return INVALID_ARGUMENT();