5 #include "sw/device/silicon_creator/rom/rom.h"
18 #include "sw/device/silicon_creator/lib/base/boot_measurements.h"
20 #include "sw/device/silicon_creator/lib/base/static_critical_version.h"
21 #include "sw/device/silicon_creator/lib/boot_data.h"
22 #include "sw/device/silicon_creator/lib/boot_log.h"
23 #include "sw/device/silicon_creator/lib/cfi.h"
24 #include "sw/device/silicon_creator/lib/chip_info.h"
25 #include "sw/device/silicon_creator/lib/drivers/alert.h"
26 #include "sw/device/silicon_creator/lib/drivers/ast.h"
27 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
28 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
29 #include "sw/device/silicon_creator/lib/drivers/ibex.h"
30 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
31 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
32 #include "sw/device/silicon_creator/lib/drivers/otp.h"
33 #include "sw/device/silicon_creator/lib/drivers/pinmux.h"
34 #include "sw/device/silicon_creator/lib/drivers/pwrmgr.h"
35 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
36 #include "sw/device/silicon_creator/lib/drivers/rnd.h"
37 #include "sw/device/silicon_creator/lib/drivers/rstmgr.h"
38 #include "sw/device/silicon_creator/lib/drivers/sensor_ctrl.h"
39 #include "sw/device/silicon_creator/lib/drivers/uart.h"
40 #include "sw/device/silicon_creator/lib/drivers/watchdog.h"
41 #include "sw/device/silicon_creator/lib/error.h"
42 #include "sw/device/silicon_creator/lib/otbn_boot_services.h"
43 #include "sw/device/silicon_creator/lib/shutdown.h"
44 #include "sw/device/silicon_creator/lib/sigverify/sigverify.h"
45 #include "sw/device/silicon_creator/lib/stack_utilization.h"
46 #include "sw/device/silicon_creator/rom/boot_policy.h"
47 #include "sw/device/silicon_creator/rom/boot_policy_ptrs.h"
48 #include "sw/device/silicon_creator/rom/bootstrap.h"
49 #include "sw/device/silicon_creator/rom/rom_epmp.h"
50 #include "sw/device/silicon_creator/rom/rom_state.h"
51 #include "sw/device/silicon_creator/rom/sigverify_keys_ecdsa_p256.h"
52 #include "sw/device/silicon_creator/rom/sigverify_keys_spx.h"
53 #include "sw/device/silicon_creator/rom/sigverify_otp_keys.h"
55 #include "hmac_regs.h"
57 #include "otp_ctrl_regs.h"
58 #include "rstmgr_regs.h"
79 #define ROM_CFI_FUNC_COUNTERS_TABLE(X) \
80 X(kCfiRomMain, 0x14b) \
81 X(kCfiRomInit, 0x7dc) \
82 X(kCfiRomVerify, 0x5a7) \
83 X(kCfiRomTryBoot, 0x235) \
84 X(kCfiRomPreBootCheck, 0x43a) \
89 CFI_DEFINE_COUNTERS(rom_counters, ROM_CFI_FUNC_COUNTERS_TABLE);
92 lifecycle_state_t lc_state = (lifecycle_state_t)0;
100 uint32_t flash_ecc_exc_handler_en;
102 uint32_t reset_reason_check;
104 static inline bool rom_console_enabled(
void) {
105 return otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BANNER_EN_OFFSET) !=
119 static void rom_banner(
void) {
120 if (!rom_console_enabled()) {
124 const uint64_t kTitle1 = 0x617469546e65704f;
126 const uint32_t kTitle2 = 0x3a6e;
127 const uint32_t kNewline = 0x0a0d;
129 lifecycle_hw_rev_get(&hw);
130 uart_write_imm(kTitle1);
131 uart_write_imm(kTitle2);
132 uart_write_hex(hw.silicon_creator_id,
sizeof(hw.silicon_creator_id),
'-');
133 uart_write_hex(hw.product_id,
sizeof(hw.product_id),
'-');
134 uart_write_hex(hw.revision_id,
sizeof(hw.revision_id), kNewline);
140 static void rom_bootstrap_message(
void) {
142 const uint64_t kBootstrap1 = 0x61727473746f6f62;
144 const uint64_t kBootstrap2 = 0x0a0d313a70;
145 uart_write_imm(kBootstrap1);
146 uart_write_imm(kBootstrap2);
153 static rom_error_t rom_init(
void) {
154 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomInit, 1);
156 uint32_t reset_reasons = rstmgr_reason_get();
160 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_RESET_REASON_CHECK_VALUE_OFFSET) &
162 if (reset_reasons != (1U << RSTMGR_RESET_INFO_LOW_POWER_EXIT_BIT)) {
182 static_critical_version = kStaticCriticalVersion2;
187 CSR_WRITE(CSR_REG_SECURESEED, rnd_uint32());
190 uint32_t cpuctrl_csr;
191 CSR_READ(CSR_REG_CPUCTRL, &cpuctrl_csr);
194 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_CPUCTRL_OFFSET));
197 lc_state = lifecycle_state_get();
200 rom_epmp_config_debug_rom(lc_state);
207 watchdog_init(lc_state);
211 HARDENED_RETURN_IF_ERROR(sensor_ctrl_configure(lc_state));
212 pwrmgr_cdc_sync(kSensorCtrlSyncCycles);
218 HARDENED_RETURN_IF_ERROR(shutdown_init(lc_state));
222 flash_ecc_exc_handler_en = otp_read32(
223 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_FLASH_ECC_EXC_HANDLER_EN_OFFSET);
226 rom_epmp_state_init(lc_state);
229 HARDENED_RETURN_IF_ERROR(ast_check(lc_state));
233 uint32_t reset_mask =
234 (1 << kRstmgrReasonPowerOn) |
235 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RET_RAM_RESET_MASK_OFFSET);
236 if ((reset_reasons & reset_mask) != 0) {
237 retention_sram_init();
239 retention_sram_readback_enable(
240 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_SRAM_READBACK_EN_OFFSET) >>
255 retention_sram_get()->
version = kRetentionSramVersion4;
268 reset_reason_check = launder32(reset_reason_check) ^ rstmgr_reason_get();
271 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_RESET_REASON_CHECK_VALUE_OFFSET) >>
275 if (launder32(check_val) == reset_reason_check) {
279 return kErrorRomResetReasonFault;
288 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_PRESERVE_RESET_REASON_EN_OFFSET) !=
290 rstmgr_reason_clear(reset_reasons);
296 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomInit, 2);
312 uint32_t *flash_exec) {
318 const uint32_t extra_word = UINT32_MAX;
319 const uint32_t *anti_rollback = NULL;
320 size_t anti_rollback_len = 0;
323 anti_rollback = &extra_word;
324 anti_rollback_len =
sizeof(extra_word);
332 HARDENED_RETURN_IF_ERROR(otbn_boot_app_load());
333 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomVerify, 1);
336 HARDENED_RETURN_IF_ERROR(sigverify_otp_keys_init(&sigverify_ctx));
339 HARDENED_RETURN_IF_ERROR(sigverify_ecdsa_p256_key_get(
341 sigverify_ecdsa_p256_key_id_get(&
manifest->ecdsa_public_key), lc_state,
345 sigverify_spx_config_id_t spx_config = 0;
347 uint32_t sigverify_spx_en = sigverify_spx_verify_enabled(lc_state);
348 if (launder32(sigverify_spx_en) != kSigverifySpxDisabledOtp) {
350 HARDENED_RETURN_IF_ERROR(manifest_ext_get_spx_key(
manifest, &ext_spx_key));
351 HARDENED_RETURN_IF_ERROR(sigverify_spx_key_get(
352 &sigverify_ctx, sigverify_spx_key_id_get(&ext_spx_key->
key), lc_state,
353 &spx_key, &spx_config));
355 HARDENED_RETURN_IF_ERROR(
356 manifest_ext_get_spx_signature(
manifest, &ext_spx_signature));
357 spx_signature = &ext_spx_signature->
signature;
368 hmac_sha256_update(anti_rollback, anti_rollback_len);
374 &usage_constraints_from_hw);
375 hmac_sha256_update(&usage_constraints_from_hw,
376 sizeof(usage_constraints_from_hw));
380 hmac_sha256_update(digest_region.
start, digest_region.
length);
381 hmac_sha256_process();
383 hmac_sha256_final(&act_digest);
386 "Unexpected ROM_EXT digest size.");
390 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomVerify, 2);
398 if (rnd_uint32() < 0x80000000) {
399 HARDENED_RETURN_IF_ERROR(sigverify_ecdsa_p256_verify(
400 &
manifest->ecdsa_signature, ecdsa_key, &act_digest, flash_exec));
402 return sigverify_spx_verify(
403 spx_signature, spx_key, spx_config, lc_state,
404 &usage_constraints_from_hw,
sizeof(usage_constraints_from_hw),
405 anti_rollback, anti_rollback_len, digest_region.
start,
406 digest_region.
length, &act_digest, flash_exec);
408 HARDENED_RETURN_IF_ERROR(sigverify_spx_verify(
409 spx_signature, spx_key, spx_config, lc_state,
410 &usage_constraints_from_hw,
sizeof(usage_constraints_from_hw),
411 anti_rollback, anti_rollback_len, digest_region.
start,
412 digest_region.
length, &act_digest, flash_exec));
414 return sigverify_ecdsa_p256_verify(&
manifest->ecdsa_signature, ecdsa_key,
415 &act_digest, flash_exec);
423 extern char _rom_ext_virtual_start_address[];
424 extern char _rom_ext_virtual_size[];
434 uintptr_t lma_addr) {
435 return (lma_addr - (uintptr_t)
manifest +
436 (uintptr_t)_rom_ext_virtual_start_address);
445 static void rom_pre_boot_check(
void) {
446 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 1);
449 SHUTDOWN_IF_ERROR(alert_config_check(lc_state));
450 SHUTDOWN_IF_ERROR(rnd_health_config_check(lc_state));
451 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 2);
454 lifecycle_state_t lc_state_check = lifecycle_state_get();
455 if (launder32(lc_state_check) != lc_state) {
459 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 3);
462 rom_error_t boot_data_ok = boot_data_check(&
boot_data);
463 if (launder32(boot_data_ok) != kErrorOk) {
467 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 4);
470 SHUTDOWN_IF_ERROR(epmp_state_check());
471 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 5);
474 uint32_t cpuctrl_csr;
475 uint32_t cpuctrl_otp =
476 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_CPUCTRL_OFFSET);
477 CSR_READ(CSR_REG_CPUCTRL, &cpuctrl_csr);
481 if (launder32(cpuctrl_csr) != cpuctrl_otp) {
487 rstmgr_info_en_check(retention_sram_get()->creator.reset_reasons));
488 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 6);
491 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomPreBootCheck, 7);
501 static rom_error_t rom_measure_otp_partitions(
509 (OTP_CTRL_CREATOR_SW_CFG_DIGEST_CREATOR_SW_CFG_DIGEST_FIELD_WIDTH *
510 OTP_CTRL_CREATOR_SW_CFG_DIGEST_MULTIREG_COUNT / 8) ==
sizeof(uint64_t),
511 "CreatorSwCfg OTP partition digest no longer 64 bits.");
513 (OTP_CTRL_OWNER_SW_CFG_DIGEST_OWNER_SW_CFG_DIGEST_FIELD_WIDTH *
514 OTP_CTRL_OWNER_SW_CFG_DIGEST_MULTIREG_COUNT / 8) ==
sizeof(uint64_t),
515 "OwnerSwCfg OTP partition digest no longer 64 bits.");
518 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
519 OTP_CTRL_CREATOR_SW_CFG_DIGEST_0_REG_OFFSET),
523 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
524 OTP_CTRL_OWNER_SW_CFG_DIGEST_0_REG_OFFSET),
527 kHmacDigestNumBytes);
528 hmac_sha256_process();
530 hmac_sha256_final(&otp_measurement);
531 memcpy(measurement->data, otp_measurement.digest, kHmacDigestNumBytes);
547 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomBoot, 1);
548 HARDENED_RETURN_IF_ERROR(sc_keymgr_state_check(kScKeymgrStateReset));
552 manifest == boot_policy_manifest_a_get() ? kBootSlotA : kBootSlotB;
558 uint32_t use_otp_measurement =
559 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_KEYMGR_OTP_MEAS_EN_OFFSET);
562 rom_measure_otp_partitions(&otp_measurement);
563 attestation_measurement = &otp_measurement;
570 kScKeymgrSecMmioCreatorMaxVerSet);
579 uintptr_t entry_point = manifest_entry_point_get(
manifest);
583 ibex_addr_remap_0_set((uintptr_t)_rom_ext_virtual_start_address,
584 (uintptr_t)
manifest, (
size_t)_rom_ext_virtual_size);
588 HARDENED_RETURN_IF_ERROR(epmp_state_check());
589 rom_epmp_unlock_rom_ext_r(
590 (
epmp_region_t){.start = (uintptr_t)_rom_ext_virtual_start_address,
591 .end = (uintptr_t)_rom_ext_virtual_start_address +
592 (uintptr_t)_rom_ext_virtual_size});
596 text_region.start = rom_ext_vma_get(
manifest, text_region.start);
597 text_region.end = rom_ext_vma_get(
manifest, text_region.end);
598 entry_point = rom_ext_vma_get(
manifest, entry_point);
608 HARDENED_RETURN_IF_ERROR(epmp_state_check());
609 rom_epmp_unlock_rom_ext_rx(text_region);
611 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomBoot, 2, kCfiRomPreBootCheck);
612 rom_pre_boot_check();
613 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomBoot, 4);
614 CFI_FUNC_COUNTER_CHECK(rom_counters, kCfiRomPreBootCheck, 8);
617 flash_ctrl_exec_set(flash_exec);
629 kCfiRomTryBootManifest0Val = 3 * kCfiIncrement + kCfiRomTryBootVal0,
634 kCfiRomTryBootManifest1Val = 10 * kCfiIncrement + kCfiRomTryBootVal0,
637 switch (launder32(rom_counters[kCfiRomTryBoot])) {
638 case kCfiRomTryBootManifest0Val:
640 kCfiRomTryBootManifest0Val);
641 manifest_check = boot_policy_manifests_get().
ordered[0];
643 case kCfiRomTryBootManifest1Val:
645 kCfiRomTryBootManifest1Val);
646 manifest_check = boot_policy_manifests_get().
ordered[1];
653 #if OT_BUILD_FOR_STATIC_ANALYZER
654 assert(manifest_check != NULL);
660 manifest_entry_point_get(manifest_check)),
666 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomBoot, 5);
669 stack_utilization_print();
672 uint32_t rom_ext_immutable_section_enabled =
673 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_EN_OFFSET);
677 uintptr_t immutable_rom_ext_start_offset = (uintptr_t)otp_read32(
678 OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_START_OFFSET_OFFSET);
679 size_t immutable_rom_ext_length = (size_t)otp_read32(
680 OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_LENGTH_OFFSET);
681 uintptr_t immutable_rom_ext_entry_point =
682 (uintptr_t)
manifest + immutable_rom_ext_start_offset;
686 immutable_rom_ext_entry_point =
687 rom_ext_vma_get(
manifest, immutable_rom_ext_entry_point);
695 hmac_sha256_update(&immutable_rom_ext_start_offset,
697 hmac_sha256_update(&immutable_rom_ext_length,
sizeof(
size_t));
698 hmac_sha256_update((
const void *)immutable_rom_ext_entry_point,
699 immutable_rom_ext_length);
700 hmac_sha256_process();
702 hmac_sha256_final(&actual_immutable_section_digest);
707 otp_read(OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_SHA256_HASH_OFFSET,
708 immutable_rom_ext_hash.digest, kHmacDigestNumWords);
709 for (
size_t i = 0; i < kHmacDigestNumWords; ++i) {
711 actual_immutable_section_digest.digest[i]);
713 ((rom_ext_entry_point *)immutable_rom_ext_entry_point)();
719 ((rom_ext_entry_point *)entry_point)();
720 return kErrorRomBootFailed;
729 static rom_error_t rom_try_boot(
void) {
730 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomTryBoot, 1);
733 HARDENED_RETURN_IF_ERROR(boot_data_read(lc_state, &
boot_data));
736 uint32_t flash_exec = 0;
738 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomTryBoot, 2, kCfiRomVerify);
739 rom_error_t error = rom_verify(manifests.
ordered[0], &flash_exec);
740 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomTryBoot, 4);
742 if (launder32(error) == kErrorOk) {
744 CFI_FUNC_COUNTER_CHECK(rom_counters, kCfiRomVerify, 3);
745 CFI_FUNC_COUNTER_INIT(rom_counters, kCfiRomTryBoot);
746 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomTryBoot, 1, kCfiRomBoot);
747 HARDENED_RETURN_IF_ERROR(rom_boot(manifests.
ordered[0], flash_exec));
748 return kErrorRomBootFailed;
751 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomTryBoot, 5, kCfiRomVerify);
752 HARDENED_RETURN_IF_ERROR(rom_verify(manifests.
ordered[1], &flash_exec));
753 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomTryBoot, 7);
754 CFI_FUNC_COUNTER_CHECK(rom_counters, kCfiRomVerify, 3);
756 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomTryBoot, 8, kCfiRomBoot);
757 HARDENED_RETURN_IF_ERROR(rom_boot(manifests.
ordered[1], flash_exec));
758 return kErrorRomBootFailed;
782 #define ROM_STATES(X) \
783 X(kRomStateInit, 0x5616, rom_state_init, NULL) \
784 X(kRomStateBootstrapCheck, 0x0a92, rom_state_bootstrap_check, &bootstrap_request) \
785 X(kRomStateBootstrap, 0xd0a0, rom_state_bootstrap, &bootstrap_request) \
786 X(kRomStateBootRomExt, 0xed14, rom_state_boot_rom_ext, NULL)
789 ROM_STATE_INIT_TABLE(rom_states, kRomStateCnt, ROM_STATES);
792 uint32_t *next_state) {
793 CFI_FUNC_COUNTER_INIT(rom_counters, kCfiRomMain);
795 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomMain, 1, kCfiRomInit);
796 HARDENED_RETURN_IF_ERROR(rom_init());
797 CFI_FUNC_COUNTER_INCREMENT(rom_counters, kCfiRomMain, 3);
799 *next_state = kRomStateBootstrapCheck;
805 rom_state_bootstrap_check(
void *arg, uint32_t *next_state) {
811 if (launder32(*bootstrap_req) == 0) {
815 *bootstrap_req = bootstrap_requested();
821 *next_state = kRomStateBootstrap;
827 *next_state = kRomStateBootRomExt;
832 rom_state_bootstrap(
void *arg, uint32_t *next_state) {
837 rom_bootstrap_message();
840 HARDENED_RETURN_IF_ERROR(bootstrap());
843 return kErrorRomBootFailed;
847 rom_state_boot_rom_ext(
void *arg, uint32_t *next_state) {
849 CFI_FUNC_COUNTER_PREPCALL(rom_counters, kCfiRomMain, 4, kCfiRomTryBoot);
850 return rom_try_boot();
853 void rom_main(
void) {
854 CFI_FUNC_COUNTER_INIT(rom_counters, kCfiRomMain);
855 shutdown_finalize(rom_state_fsm_walk(rom_states, kRomStateCnt, kRomStateInit,