[sw/silicon_creator] Add loop completion checks to shutdown_init() Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/shutdown.c b/sw/device/silicon_creator/lib/shutdown.c index 44cde5e..8dac848 100644 --- a/sw/device/silicon_creator/lib/shutdown.c +++ b/sw/device/silicon_creator/lib/shutdown.c
@@ -104,22 +104,26 @@ // Get the enable and escalation settings for all four alert classes. // Each of these OTP words is composed of 4 byte enums with the enable and // escalate configs per alert class (a/b/c/d). + size_t i = 0; + rom_error_t error = kErrorOk; uint32_t class_enable = otp_read32(OTP_CTRL_PARAM_ROM_ALERT_CLASS_EN_OFFSET); uint32_t class_escalate = otp_read32(OTP_CTRL_PARAM_ROM_ALERT_ESCALATION_OFFSET); alert_enable_t enable[ALERT_CLASSES]; alert_escalate_t escalate[ALERT_CLASSES]; - for (size_t i = 0; i < ALERT_CLASSES; ++i) { + for (i = 0; launder32(i) < ALERT_CLASSES; ++i) { enable[i] = (alert_enable_t)bitfield_field32_read( class_enable, (bitfield_field32_t){.mask = 0xff, .index = i * 8}); escalate[i] = (alert_escalate_t)bitfield_field32_read( class_escalate, (bitfield_field32_t){.mask = 0xff, .index = i * 8}); } + if (i != ALERT_CLASSES) { + error = kErrorUnknown; + } // For each alert, read its corresponding OTP word and extract the class // configuration for the current lifecycle state. - rom_error_t error = kErrorOk; - for (size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; + for (i = 0; launder32(i) < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) { uint32_t value = otp_read32(OTP_CTRL_PARAM_ROM_ALERT_CLASSIFICATION_OFFSET + i * sizeof(uint32_t)); @@ -132,10 +136,14 @@ error = e; } } + if (i != ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) { + error = kErrorUnknown; + } // For each local alert, read its corresponding OTP word and extract the class // configuration for the current lifecycle state. - for (size_t i = 0; i < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; + for (i = 0; + launder32(i) < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) { uint32_t value = otp_read32(OTP_CTRL_PARAM_ROM_LOCAL_ALERT_CLASSIFICATION_OFFSET + @@ -149,6 +157,9 @@ error = e; } } + if (i != ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) { + error = kErrorUnknown; + } // For each alert class, configure the various escalation parameters. const alert_class_t kClasses[] = { @@ -158,18 +169,22 @@ kAlertClassD, }; alert_class_config_t config; - for (size_t i = 0; i < ALERT_CLASSES; ++i) { + for (i = 0; launder32(i) < ALERT_CLASSES; ++i) { config.enabled = enable[i]; config.escalation = escalate[i]; config.accum_threshold = otp_read32( OTP_CTRL_PARAM_ROM_ALERT_ACCUM_THRESH_OFFSET + i * sizeof(uint32_t)); config.timeout_cycles = otp_read32( OTP_CTRL_PARAM_ROM_ALERT_TIMEOUT_CYCLES_OFFSET + i * sizeof(uint32_t)); - for (size_t phase = 0; phase < ARRAYSIZE(config.phase_cycles); ++phase) { + size_t phase = 0; + for (; launder32(phase) < ARRAYSIZE(config.phase_cycles); ++phase) { config.phase_cycles[phase] = otp_read32( OTP_CTRL_PARAM_ROM_ALERT_PHASE_CYCLES_OFFSET + (i * ARRAYSIZE(config.phase_cycles) + phase) * sizeof(uint32_t)); } + if (phase != ARRAYSIZE(config.phase_cycles)) { + error = kErrorUnknown; + } rom_error_t e = alert_class_configure(kClasses[i], &config); if (e != kErrorOk) { @@ -178,6 +193,9 @@ error = e; } } + if (i != ALERT_CLASSES) { + error = kErrorUnknown; + } return error; }