[bazel] add slot management to `opentitan_functest` macro

This adds support to the `opentitan_functest` macro to specify which
stage and slot an `opentitan_flash_binary` gets built for, defaulting to
the `silicon_creator` stage, slot A.

This partially addresses #10712.

This functionality will soon be expanded address building more complex
test cases with multiple stages / slots filled, to address #13511.

Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/rules/opentitan_test.bzl b/rules/opentitan_test.bzl
index ebb5ae4..caf6c4e 100644
--- a/rules/opentitan_test.bzl
+++ b/rules/opentitan_test.bzl
@@ -17,6 +17,14 @@
     ROM_BOOT_FAILURE_MSG,
 )
 
+# This constant holds a dictionary of slot-specific linker script dependencies
+# that determine how an `opentitan_flash_binary` is built.
+_FLASH_SLOTS = {
+    "silicon_creator_a": ["@//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a"],
+    "silicon_creator_b": ["@//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_b"],
+    "silicon_creator_virtual": ["@//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_virtual"],
+}
+
 _BASE_PARAMS = {
     "args": [],  # Passed to test runner as arguments.
     "data": [],
@@ -239,6 +247,7 @@
         test_in_rom = False,
         ot_flash_binary = None,
         signed = False,
+        slot = "silicon_creator_a",
         test_harness = "@//sw/host/opentitantool",
         key = "test_key_0",
         dv = None,
@@ -266,6 +275,7 @@
                               flash image for the test rather than building one
                               from srcs/deps.
       @param signed: Whether to sign the test image. Unsigned by default.
+      @param slot: What slot to build the image for.
       @param test_harness: The binary on the host side that runs the test.
       @param key: Which signed test image (by key) to use.
       @param dv: DV test parameters.
@@ -301,6 +311,10 @@
 
     # Generate SW artifacts for the tests.
     if not ot_flash_binary:
+        # Set the linker script for the specified slot.
+        if slot not in _FLASH_SLOTS:
+            fail("Invalid slot: {}. Valid slots are: silicon_creator_{a,b,virtual}".format(slot))
+        deps += _FLASH_SLOTS[slot]
         ot_flash_binary = name + "_prog"
         opentitan_flash_binary(
             name = ot_flash_binary,
diff --git a/sw/device/examples/hello_usbdev/BUILD b/sw/device/examples/hello_usbdev/BUILD
index 558f636..6b4cf35 100644
--- a/sw/device/examples/hello_usbdev/BUILD
+++ b/sw/device/examples/hello_usbdev/BUILD
@@ -18,7 +18,6 @@
     deps = [
         ":hello_usbdev_lib",
         "//sw/device/lib/base:mmio",
-        "//sw/device/lib/testing/test_framework:test_framework_manifest_def",
     ],
 )
 
@@ -41,7 +40,8 @@
         "//sw/device/lib/testing:usb_testutils",
         "//sw/device/lib/testing:usb_testutils_simpleserial",
         "//sw/device/lib/testing/test_framework:check",
-        "//sw/device/lib/testing/test_framework:ottf_start_silicon_creator_slot_a",
+        "//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a",
+        "//sw/device/lib/testing/test_framework:ottf_start",
         "//sw/device/lib/testing/test_framework:ottf_test_config",
     ],
 )
diff --git a/sw/device/examples/hello_world/BUILD b/sw/device/examples/hello_world/BUILD
index c1c81ec..ea9cec6 100644
--- a/sw/device/examples/hello_world/BUILD
+++ b/sw/device/examples/hello_world/BUILD
@@ -20,7 +20,6 @@
     deps = [
         ":hello_world_lib",
         "//sw/device/lib/base:mmio",
-        "//sw/device/lib/testing/test_framework:test_framework_manifest_def",
     ],
 )
 
@@ -41,7 +40,8 @@
         "//sw/device/lib/runtime:print",
         "//sw/device/lib/testing:pinmux_testutils",
         "//sw/device/lib/testing/test_framework:check",
-        "//sw/device/lib/testing/test_framework:ottf_start_silicon_creator_slot_a",
+        "//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a",
+        "//sw/device/lib/testing/test_framework:ottf_start",
         "//sw/device/lib/testing/test_framework:ottf_test_config",
     ],
 )
diff --git a/sw/device/lib/testing/test_framework/BUILD b/sw/device/lib/testing/test_framework/BUILD
index eb0eb63..597a5f5 100644
--- a/sw/device/lib/testing/test_framework/BUILD
+++ b/sw/device/lib/testing/test_framework/BUILD
@@ -139,6 +139,7 @@
     ],
     target_compatible_with = [OPENTITAN_CPU],
     deps = [
+        ":test_framework_manifest_def",
         "//sw/device/lib/base:csr",
         "//sw/device/lib/base:macros",
         "//sw/device/lib/crt",
@@ -151,36 +152,6 @@
 )
 
 cc_library(
-    name = "ottf_start_silicon_creator_slot_a",
-    target_compatible_with = [OPENTITAN_CPU],
-    deps = [
-        ":ottf_ld_silicon_creator_slot_a",
-        ":ottf_start",
-        ":test_framework_manifest_def",
-    ],
-)
-
-cc_library(
-    name = "ottf_start_silicon_creator_slot_b",
-    target_compatible_with = [OPENTITAN_CPU],
-    deps = [
-        ":ottf_ld_silicon_creator_slot_b",
-        ":ottf_start",
-        ":test_framework_manifest_def",
-    ],
-)
-
-cc_library(
-    name = "ottf_start_silicon_creator_slot_virtual",
-    target_compatible_with = [OPENTITAN_CPU],
-    deps = [
-        ":ottf_ld_silicon_creator_slot_virtual",
-        ":ottf_start",
-        ":test_framework_manifest_def",
-    ],
-)
-
-cc_library(
     name = "ottf_test_config",
     hdrs = [
         "ottf_test_config.h",
@@ -196,7 +167,7 @@
         ":check",
         ":coverage",
         ":freertos_port",
-        ":ottf_start_silicon_creator_slot_a",
+        ":ottf_start",
         ":ottf_test_config",
         ":status",
         "//sw/device/lib/arch:device",
diff --git a/sw/device/lib/testing/test_framework/ottf_common.ld b/sw/device/lib/testing/test_framework/ottf_common.ld
index 34c6e14..25cb647 100644
--- a/sw/device/lib/testing/test_framework/ottf_common.ld
+++ b/sw/device/lib/testing/test_framework/ottf_common.ld
@@ -152,6 +152,10 @@
     KEEP(*(__llvm_covfun))
     KEEP(*(__llvm_covmap))
     KEEP(*(__llvm_prf_names))
+
+    /* TODO(#14636): extract_sw_logs_db requires .rodata section. */
+    . = ALIGN(4);
+    _rodata_end = .;
   } > ottf_flash
 
   /**
diff --git a/sw/device/sca/BUILD b/sw/device/sca/BUILD
index 0a9f81e..ec2b4fd 100644
--- a/sw/device/sca/BUILD
+++ b/sw/device/sca/BUILD
@@ -14,10 +14,8 @@
         "//sw/device/lib/base:memory",
         "//sw/device/lib/dif:aes",
         "//sw/device/lib/runtime:log",
+        "//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a",
         "//sw/device/lib/testing/test_framework:ottf_main",
-        "//sw/device/lib/testing/test_framework:ottf_start",
-        "//sw/device/lib/testing/test_framework:ottf_start_silicon_creator_slot_a",
-        "//sw/device/lib/testing/test_framework:ottf_test_config",
         "//sw/device/sca/lib:prng",
         "//sw/device/sca/lib:sca",
         "//sw/device/sca/lib:simple_serial",
@@ -32,10 +30,8 @@
         "//sw/device/lib/base:memory",
         "//sw/device/lib/dif:kmac",
         "//sw/device/lib/runtime:log",
+        "//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a",
         "//sw/device/lib/testing/test_framework:ottf_main",
-        "//sw/device/lib/testing/test_framework:ottf_start",
-        "//sw/device/lib/testing/test_framework:ottf_start_silicon_creator_slot_a",
-        "//sw/device/lib/testing/test_framework:ottf_test_config",
         "//sw/device/sca/lib:prng",
         "//sw/device/sca/lib:sca",
         "//sw/device/sca/lib:simple_serial",
@@ -54,9 +50,8 @@
         "//sw/device/lib/runtime:log",
         "//sw/device/lib/runtime:otbn",
         "//sw/device/lib/testing:entropy_testutils",
+        "//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a",
         "//sw/device/lib/testing/test_framework:ottf_main",
-        "//sw/device/lib/testing/test_framework:ottf_start",
-        "//sw/device/lib/testing/test_framework:ottf_test_config",
         "//sw/device/sca/lib:prng",
         "//sw/device/sca/lib:sca",
         "//sw/device/sca/lib:simple_serial",
@@ -76,9 +71,8 @@
         "//sw/device/lib/runtime:log",
         "//sw/device/lib/runtime:otbn",
         "//sw/device/lib/testing:entropy_testutils",
+        "//sw/device/lib/testing/test_framework:ottf_ld_silicon_creator_slot_a",
         "//sw/device/lib/testing/test_framework:ottf_main",
-        "//sw/device/lib/testing/test_framework:ottf_start",
-        "//sw/device/lib/testing/test_framework:ottf_test_config",
         "//sw/device/sca/lib:prng",
         "//sw/device/sca/lib:sca",
         "//sw/device/sca/lib:simple_serial",
diff --git a/sw/device/sca/lib/BUILD b/sw/device/sca/lib/BUILD
index f5e193c..67cd0c2 100644
--- a/sw/device/sca/lib/BUILD
+++ b/sw/device/sca/lib/BUILD
@@ -56,6 +56,6 @@
         "//sw/device/lib/runtime:irq",
         "//sw/device/lib/runtime:print",
         "//sw/device/lib/testing:pinmux_testutils",
-        "//sw/device/lib/testing/test_framework:ottf_start_silicon_creator_slot_a",
+        "//sw/device/lib/testing/test_framework:ottf_start",
     ],
 )
diff --git a/sw/device/silicon_creator/rom/e2e/BUILD b/sw/device/silicon_creator/rom/e2e/BUILD
index f5607d6..12d47f0 100644
--- a/sw/device/silicon_creator/rom/e2e/BUILD
+++ b/sw/device/silicon_creator/rom/e2e/BUILD
@@ -41,7 +41,6 @@
         "//sw/device/silicon_creator/lib:manifest_def",
         "//sw/device/silicon_creator/lib/base:static_critical_boot_measurements",
         "//sw/device/silicon_creator/lib/base:static_critical_sec_mmio",
-        "//sw/device/silicon_creator/rom_ext:ld_slot_a",
     ],
 )
 
diff --git a/sw/device/silicon_creator/rom/e2e/rom_e2e_shutdown_exception_c_test.c b/sw/device/silicon_creator/rom/e2e/rom_e2e_shutdown_exception_c_test.c
index 8847926..7ad6637 100644
--- a/sw/device/silicon_creator/rom/e2e/rom_e2e_shutdown_exception_c_test.c
+++ b/sw/device/silicon_creator/rom/e2e/rom_e2e_shutdown_exception_c_test.c
@@ -16,6 +16,6 @@
 //   - `.text`, only 2 instructions to trigger an instruction access fault, and
 //   - `.static_critical`, required by the linker script.
 
-void _rom_ext_start_boot(void) {
+void _ottf_start(void) {
   ((void (*)(void))TOP_EARLGREY_SRAM_CTRL_MAIN_RAM_BASE_ADDR)();
 }
diff --git a/sw/device/silicon_creator/rom_ext/rom_ext_common.ld b/sw/device/silicon_creator/rom_ext/rom_ext_common.ld
index 54aa312..d83d0a9 100644
--- a/sw/device/silicon_creator/rom_ext/rom_ext_common.ld
+++ b/sw/device/silicon_creator/rom_ext/rom_ext_common.ld
@@ -118,9 +118,6 @@
     *(.srodata.*)
     *(.rodata)
     *(.rodata.*)
-    /* TODO(#14636): extract_sw_logs_db requires .rodata section. */
-    . = ALIGN(4);
-    _rodata_end = .;
   } > rom_ext_flash
 
   /**
diff --git a/sw/device/tests/BUILD b/sw/device/tests/BUILD
index f8e7f3a..9d62379 100644
--- a/sw/device/tests/BUILD
+++ b/sw/device/tests/BUILD
@@ -480,10 +480,9 @@
         "//sw/device/lib/runtime:log",
         "//sw/device/lib/runtime:print",
         "//sw/device/lib/testing/test_framework:check",
-        "//sw/device/lib/testing/test_framework:ottf_start_silicon_creator_slot_a",
+        "//sw/device/lib/testing/test_framework:ottf_start",
         "//sw/device/lib/testing/test_framework:ottf_test_config",
         "//sw/device/lib/testing/test_framework:status",
-        "//sw/device/silicon_creator/lib:manifest_def",
     ],
 )