|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | load("//rules:opentitan.bzl", "OPENTITAN_CPU", "opentitan_rom_binary") | 
|  | load("//rules:exclude_files.bzl", "exclude_files") | 
|  | load("//rules:linker.bzl", "ld_library") | 
|  | load( | 
|  | "//rules:opentitan_test.bzl", | 
|  | "opentitan_functest", | 
|  | ) | 
|  | load("//rules:cross_platform.bzl", "dual_cc_library", "dual_inputs") | 
|  | load("@rules_pkg//pkg:mappings.bzl", "pkg_files") | 
|  |  | 
|  | package(default_visibility = ["//visibility:public"]) | 
|  |  | 
|  | dual_cc_library( | 
|  | name = "boot_policy_ptrs", | 
|  | srcs = dual_inputs( | 
|  | host = ["mock_boot_policy_ptrs.cc"], | 
|  | shared = ["boot_policy_ptrs.c"], | 
|  | ), | 
|  | hdrs = dual_inputs( | 
|  | host = ["mock_boot_policy_ptrs.h"], | 
|  | shared = ["boot_policy_ptrs.h"], | 
|  | ), | 
|  | deps = dual_inputs( | 
|  | host = [ | 
|  | "//sw/device/lib/base:global_mock", | 
|  | "//sw/device/silicon_creator/testing:rom_test", | 
|  | "@googletest//:gtest", | 
|  | ], | 
|  | shared = [ | 
|  | "//sw/device/silicon_creator/lib:manifest", | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | ], | 
|  | ), | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "boot_policy", | 
|  | srcs = ["boot_policy.c"], | 
|  | hdrs = ["boot_policy.h"], | 
|  | deps = [ | 
|  | ":boot_policy_ptrs", | 
|  | "//sw/device/lib/base:hardened", | 
|  | "//sw/device/silicon_creator/lib:boot_data", | 
|  | "//sw/device/silicon_creator/lib:error", | 
|  | "//sw/device/silicon_creator/lib:manifest", | 
|  | "//sw/device/silicon_creator/lib:shutdown", | 
|  | "//sw/device/silicon_creator/lib/base:chip", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "boot_policy_unittest", | 
|  | srcs = ["boot_policy_unittest.cc"], | 
|  | deps = [ | 
|  | ":boot_policy", | 
|  | "//sw/device/silicon_creator/testing:rom_test", | 
|  | "@googletest//:gtest_main", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | ld_library( | 
|  | name = "linker_script", | 
|  | script = "rom.ld", | 
|  | deps = [ | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey_memory", | 
|  | "//sw/device:info_sections", | 
|  | "//sw/device/silicon_creator/lib/base:static_critical_sections", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | opentitan_rom_binary( | 
|  | name = "rom", | 
|  | srcs = [ | 
|  | "rom.c", | 
|  | "rom.h", | 
|  | "rom_start.S", | 
|  | ], | 
|  | deps = [ | 
|  | ":boot_policy", | 
|  | ":bootstrap", | 
|  | ":linker_script", | 
|  | ":rom_epmp", | 
|  | ":sigverify_keys", | 
|  | "//hw/ip/aon_timer/data:aon_timer_regs", | 
|  | "//hw/ip/csrng/data:csrng_regs", | 
|  | "//hw/ip/edn/data:edn_regs", | 
|  | "//hw/ip/entropy_src/data:entropy_src_regs", | 
|  | "//hw/ip/otp_ctrl/data:otp_ctrl_regs", | 
|  | "//hw/ip/sram_ctrl/data:sram_ctrl_regs", | 
|  | "//hw/top_earlgrey/ip/ast/data:ast_regs", | 
|  | "//hw/top_earlgrey/ip/clkmgr/data/autogen:clkmgr_regs", | 
|  | "//hw/top_earlgrey/ip/pwrmgr/data/autogen:pwrmgr_regs", | 
|  | "//hw/top_earlgrey/ip/sensor_ctrl/data:sensor_ctrl_regs", | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | "//sw/device/lib/arch:device", | 
|  | "//sw/device/lib/base:bitfield", | 
|  | "//sw/device/lib/base:csr", | 
|  | "//sw/device/lib/base:hardened", | 
|  | "//sw/device/lib/base:macros", | 
|  | "//sw/device/lib/base:mmio", | 
|  | "//sw/device/lib/base:stdasm", | 
|  | "//sw/device/lib/crt", | 
|  | "//sw/device/lib/runtime:hart", | 
|  | "//sw/device/silicon_creator/lib:cfi", | 
|  | "//sw/device/silicon_creator/lib:epmp", | 
|  | "//sw/device/silicon_creator/lib:error", | 
|  | "//sw/device/silicon_creator/lib:irq_asm", | 
|  | "//sw/device/silicon_creator/lib:manifest", | 
|  | "//sw/device/silicon_creator/lib:shutdown", | 
|  | "//sw/device/silicon_creator/lib/base:sec_mmio", | 
|  | "//sw/device/silicon_creator/lib/base:static_critical_boot_measurements", | 
|  | "//sw/device/silicon_creator/lib/base:static_critical_sec_mmio", | 
|  | "//sw/device/silicon_creator/lib/drivers:alert", | 
|  | "//sw/device/silicon_creator/lib/drivers:ast", | 
|  | "//sw/device/silicon_creator/lib/drivers:flash_ctrl", | 
|  | "//sw/device/silicon_creator/lib/drivers:ibex", | 
|  | "//sw/device/silicon_creator/lib/drivers:keymgr", | 
|  | "//sw/device/silicon_creator/lib/drivers:lifecycle", | 
|  | "//sw/device/silicon_creator/lib/drivers:otp", | 
|  | "//sw/device/silicon_creator/lib/drivers:pinmux", | 
|  | "//sw/device/silicon_creator/lib/drivers:retention_sram", | 
|  | "//sw/device/silicon_creator/lib/drivers:rnd", | 
|  | "//sw/device/silicon_creator/lib/drivers:rstmgr", | 
|  | "//sw/device/silicon_creator/lib/drivers:uart", | 
|  | "//sw/device/silicon_creator/lib/drivers:watchdog", | 
|  | "//sw/device/silicon_creator/lib/sigverify", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "rom_epmp", | 
|  | srcs = [ | 
|  | "rom_epmp.c", | 
|  | "rom_epmp_init.S", | 
|  | ], | 
|  | hdrs = ["rom_epmp.h"], | 
|  | target_compatible_with = [OPENTITAN_CPU], | 
|  | deps = [ | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | "//sw/device/lib/base:bitfield", | 
|  | "//sw/device/lib/base:csr", | 
|  | "//sw/device/silicon_creator/lib:epmp", | 
|  | "//sw/device/silicon_creator/lib/drivers:lifecycle", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | opentitan_functest( | 
|  | name = "rom_epmp_test", | 
|  | srcs = [ | 
|  | "rom_epmp_test.c", | 
|  | "rom_start.S", | 
|  | ], | 
|  | linkopts = [ | 
|  | "-Wl,--defsym=rom_test=1", | 
|  | ], | 
|  | # This test doesn't use the OTTF. | 
|  | targets = ["verilator"],  # Can only run in verilator right now. | 
|  | # This test is designed to run and complete entirely in the ROM boot stage. | 
|  | # Setting the `test_in_rom` flag makes the `opentitan_functest` rule aware | 
|  | # of this, and instructs it to load the test image into ROM (rather than | 
|  | # loading the default test ROM, or any other ROM that may be specified via | 
|  | # Verilator or CW310 params). | 
|  | test_in_rom = True, | 
|  | deps = [ | 
|  | ":linker_script", | 
|  | ":rom_epmp", | 
|  | "//hw/ip/aon_timer/data:aon_timer_regs", | 
|  | "//hw/ip/csrng/data:csrng_regs", | 
|  | "//hw/ip/edn/data:edn_regs", | 
|  | "//hw/ip/entropy_src/data:entropy_src_regs", | 
|  | "//hw/ip/otp_ctrl/data:otp_ctrl_regs", | 
|  | "//hw/ip/sram_ctrl/data:sram_ctrl_regs", | 
|  | "//hw/top_earlgrey/ip/ast/data:ast_regs", | 
|  | "//hw/top_earlgrey/ip/clkmgr/data/autogen:clkmgr_regs", | 
|  | "//hw/top_earlgrey/ip/flash_ctrl/data/autogen:flash_ctrl_regs", | 
|  | "//hw/top_earlgrey/ip/pwrmgr/data/autogen:pwrmgr_regs", | 
|  | "//hw/top_earlgrey/ip/sensor_ctrl/data:sensor_ctrl_regs", | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | "//sw/device/lib/arch:device", | 
|  | "//sw/device/lib/base:abs_mmio", | 
|  | "//sw/device/lib/base:bitfield", | 
|  | "//sw/device/lib/base:csr", | 
|  | "//sw/device/lib/base:macros", | 
|  | "//sw/device/lib/base:mmio", | 
|  | "//sw/device/lib/crt", | 
|  | "//sw/device/lib/dif:pinmux", | 
|  | "//sw/device/lib/dif:sram_ctrl", | 
|  | "//sw/device/lib/runtime:hart", | 
|  | "//sw/device/lib/runtime:ibex", | 
|  | "//sw/device/lib/runtime:log", | 
|  | "//sw/device/lib/runtime:print", | 
|  | "//sw/device/lib/testing:pinmux_testutils", | 
|  | "//sw/device/lib/testing/test_framework:check", | 
|  | "//sw/device/lib/testing/test_framework:status", | 
|  | "//sw/device/silicon_creator/lib:epmp", | 
|  | "//sw/device/silicon_creator/lib:epmp_test_unlock", | 
|  | "//sw/device/silicon_creator/lib:irq_asm", | 
|  | "//sw/device/silicon_creator/lib/base:sec_mmio", | 
|  | "//sw/device/silicon_creator/lib/base:static_critical_boot_measurements", | 
|  | "//sw/device/silicon_creator/lib/base:static_critical_sec_mmio", | 
|  | "//sw/device/silicon_creator/lib/drivers:flash_ctrl", | 
|  | "//sw/device/silicon_creator/lib/drivers:uart", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | filegroup( | 
|  | name = "english_breakfast_test_rom_bootstrap_srcs", | 
|  | srcs = [ | 
|  | "bootstrap.c", | 
|  | "bootstrap.h", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "bootstrap", | 
|  | srcs = ["bootstrap.c"], | 
|  | hdrs = ["bootstrap.h"], | 
|  | deps = [ | 
|  | "//hw/ip/gpio/data:gpio_regs", | 
|  | "//hw/ip/otp_ctrl/data:otp_ctrl_regs", | 
|  | "//hw/top_earlgrey/ip/flash_ctrl/data/autogen:flash_ctrl_regs", | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | "//sw/device/lib/base:abs_mmio", | 
|  | "//sw/device/lib/base:bitfield", | 
|  | "//sw/device/lib/base:hardened", | 
|  | "//sw/device/silicon_creator/lib:error", | 
|  | "//sw/device/silicon_creator/lib/drivers:flash_ctrl", | 
|  | "//sw/device/silicon_creator/lib/drivers:otp", | 
|  | "//sw/device/silicon_creator/lib/drivers:rstmgr", | 
|  | "//sw/device/silicon_creator/lib/drivers:spi_device", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "bootstrap_unittest", | 
|  | srcs = ["bootstrap_unittest.cc"], | 
|  | deps = [ | 
|  | ":bootstrap", | 
|  | "//hw/ip/gpio/data:gpio_regs", | 
|  | "//hw/ip/otp_ctrl/data:otp_ctrl_regs", | 
|  | "//hw/top_earlgrey/ip/flash_ctrl/data/autogen:flash_ctrl_regs", | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | "@googletest//:gtest_main", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | dual_cc_library( | 
|  | name = "sigverify_keys_ptrs", | 
|  | srcs = dual_inputs( | 
|  | host = ["mock_sigverify_keys_ptrs.cc"], | 
|  | shared = ["sigverify_keys_ptrs.c"], | 
|  | ), | 
|  | hdrs = dual_inputs( | 
|  | host = ["mock_sigverify_keys_ptrs.h"], | 
|  | shared = ["sigverify_keys_ptrs.h"], | 
|  | ), | 
|  | deps = dual_inputs( | 
|  | host = [ | 
|  | "//sw/device/lib/base:global_mock", | 
|  | "//sw/device/silicon_creator/testing:rom_test", | 
|  | "@googletest//:gtest", | 
|  | ], | 
|  | shared = [ | 
|  | "//sw/device/lib/base:macros", | 
|  | "//sw/device/silicon_creator/lib/sigverify:rsa_key", | 
|  | ], | 
|  | ), | 
|  | ) | 
|  |  | 
|  | cc_library( | 
|  | name = "sigverify_keys", | 
|  | srcs = ["sigverify_keys.c"], | 
|  | hdrs = ["sigverify_keys.h"], | 
|  | deps = [ | 
|  | ":sigverify_keys_ptrs", | 
|  | "//hw/ip/otp_ctrl/data:otp_ctrl_regs", | 
|  | "//sw/device/lib/base:bitfield", | 
|  | "//sw/device/lib/base:hardened", | 
|  | "//sw/device/lib/base:macros", | 
|  | "//sw/device/silicon_creator/lib:error", | 
|  | "//sw/device/silicon_creator/lib/drivers:lifecycle", | 
|  | "//sw/device/silicon_creator/lib/drivers:otp", | 
|  | "//sw/device/silicon_creator/lib/drivers:rnd", | 
|  | "//sw/device/silicon_creator/lib/sigverify:rsa_key", | 
|  | "//sw/device/silicon_creator/lib/sigverify:sigverify_without_mod_exp_ibex_mock", | 
|  | "//sw/device/silicon_creator/rom/keys:test_public_keys", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | cc_test( | 
|  | name = "sigverify_keys_unittest", | 
|  | srcs = ["sigverify_keys_unittest.cc"], | 
|  | deps = [ | 
|  | ":sigverify_keys", | 
|  | "//hw/top_earlgrey/sw/autogen:top_earlgrey", | 
|  | "//sw/device/silicon_creator/rom/keys:test_public_keys", | 
|  | "//sw/device/silicon_creator/testing:rom_test", | 
|  | "@googletest//:gtest_main", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | exclude_files( | 
|  | name = "pre_package", | 
|  | srcs = [":rom"], | 
|  | exclude_suffix = [ | 
|  | ".ll", | 
|  | ".i", | 
|  | ".s", | 
|  | ], | 
|  | ) | 
|  |  | 
|  | pkg_files( | 
|  | name = "package", | 
|  | srcs = [":pre_package"], | 
|  | prefix = "earlgrey/rom", | 
|  | ) |