blob: 0ab2785eb93f5f605ffec15ddff736400425c51f [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
load("//rules:cross_platform.bzl", "dual_cc_library", "dual_inputs")
load("//rules:opentitan.bzl", "OPENTITAN_CPU")
load(
"//rules:opentitan_test.bzl",
"cw310_params",
"opentitan_functest",
"verilator_params",
)
load("//rules:linker.bzl", "ld_library")
package(default_visibility = ["//visibility:public"])
cc_library(
name = "coverage_none",
srcs = ["coverage_none.c"],
hdrs = ["coverage.h"],
)
cc_library(
name = "coverage_llvm",
srcs = [
"coverage_llvm.c",
],
hdrs = ["coverage.h"],
linkopts = ["-lgcc"],
deps = [
"//sw/device/lib/base:memory",
"//sw/device/lib/runtime:log",
"//sw/device/lib/runtime:print",
"//sw/device/silicon_creator/lib:crc32",
"//third_party/llvm_compiler_rt",
],
)
alias(
name = "coverage",
actual = select({
"//sw/device:measure_coverage_on_target": ":coverage_llvm",
"//conditions:default": ":coverage_none",
}),
visibility = ["//visibility:private"],
)
cc_library(
name = "status",
srcs = ["status.c"],
hdrs = ["status.h"],
target_compatible_with = [OPENTITAN_CPU],
deps = [
"//sw/device/lib/arch:device",
"//sw/device/lib/base:mmio",
"//sw/device/lib/runtime:hart",
"//sw/device/lib/runtime:log",
],
)
cc_library(
name = "check",
hdrs = ["check.h"],
target_compatible_with = [OPENTITAN_CPU],
deps = [
":status",
"//sw/device/lib/base:macros",
"//sw/device/lib/base:mmio",
"//sw/device/lib/base:status",
"//sw/device/lib/dif:base",
"//sw/device/lib/runtime:hart",
"//sw/device/lib/runtime:log",
],
)
ld_library(
name = "ottf_ld_common",
includes = ["ottf_common.ld"],
deps = [
"//sw/device:info_sections",
"//sw/device/silicon_creator/lib/base:static_critical_sections",
],
)
ld_library(
name = "ottf_ld_silicon_creator_slot_a",
script = "ottf_silicon_creator_a.ld",
deps = [
":ottf_ld_common",
"//hw/top_earlgrey/sw/autogen:top_earlgrey_memory",
],
)
ld_library(
name = "ottf_ld_silicon_creator_slot_b",
script = "ottf_silicon_creator_b.ld",
deps = [
":ottf_ld_common",
"//hw/top_earlgrey/sw/autogen:top_earlgrey_memory",
],
)
ld_library(
name = "ottf_ld_silicon_creator_slot_virtual",
script = "ottf_silicon_creator_virtual.ld",
deps = [
":ottf_ld_common",
"//hw/top_earlgrey/sw/autogen:top_earlgrey_memory",
],
)
ld_library(
name = "ottf_ld_silicon_owner_slot_a",
script = "ottf_silicon_owner_a.ld",
deps = [
":ottf_ld_common",
"//hw/top_earlgrey/sw/autogen:top_earlgrey_memory",
],
)
ld_library(
name = "ottf_ld_silicon_owner_slot_b",
script = "ottf_silicon_owner_b.ld",
deps = [
":ottf_ld_common",
"//hw/top_earlgrey/sw/autogen:top_earlgrey_memory",
],
)
ld_library(
name = "ottf_ld_silicon_owner_slot_virtual",
script = "ottf_silicon_owner_virtual.ld",
deps = [
":ottf_ld_common",
"//hw/top_earlgrey/sw/autogen:top_earlgrey_memory",
],
)
# TODO(#12905): Use a slightly hollowed out version of the silicon_creator
# manifest_def implementation when building the test_framework for the english
# breakfast top level.
cc_library(
name = "english_breakfast_test_framework_manifest_def",
srcs = [
"//sw/device/silicon_creator/lib:english_breakfast_test_framework_manifest_def_srcs",
],
# This should be built only for english breakfast and skipped if using wildcards.
tags = ["manual"],
deps = [
"//sw/device/lib/testing/test_rom:english_breakfast_test_rom_manifest",
],
# The manifest section should be populated anytime this is added as a
# dependency, even if the manifest is not referenced by software.
alwayslink = True,
)
alias(
name = "test_framework_manifest_def",
actual = select({
"//sw/device:is_english_breakfast": ":english_breakfast_test_framework_manifest_def",
"//conditions:default": "//sw/device/silicon_creator/lib:manifest_def",
}),
)
# This target provides start files without providing the full OTTF, and can be
# used to bootstrap post-ROM execution without pulling in the full OTTF. This is
# useful for programs in `sw/device/examples/` and `sw/device/sca/` that do not
# make use of the full OTTF. This target is also suitable for preparing ROM_EXT
# and BLO images since it reserves space at the start of main SRAM for the
# `.static_critical` section that holds boot measurements and sec_mmio context.
#
# The binary target must provide a `noreturn void _ottf_main(void)` function
# that this library will call.
cc_library(
name = "ottf_start",
srcs = [
"ottf_isrs.S",
"ottf_isrs.c",
"ottf_start.S",
],
hdrs = [
"ottf_isrs.h",
"ottf_macros.h",
],
target_compatible_with = [OPENTITAN_CPU],
deps = [
":check",
":test_framework_manifest_def",
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//sw/device/lib/base:csr",
"//sw/device/lib/base:macros",
"//sw/device/lib/crt",
"//sw/device/lib/dif:rv_plic",
"//sw/device/lib/runtime:hart",
"//sw/device/lib/runtime:ibex",
"//sw/device/lib/runtime:log",
"//sw/device/silicon_creator/lib/base:static_critical_boot_measurements",
"//sw/device/silicon_creator/lib/base:static_critical_epmp_state",
"//sw/device/silicon_creator/lib/base:static_critical_sec_mmio",
],
)
cc_library(
name = "ottf_test_config",
hdrs = [
"ottf_test_config.h",
],
)
cc_library(
name = "ottf_main",
srcs = ["ottf_main.c"],
hdrs = ["ottf_main.h"],
target_compatible_with = [OPENTITAN_CPU],
deps = [
":check",
":coverage",
":freertos_port",
":ottf_flow_control",
":ottf_start",
":ottf_test_config",
":status",
"//sw/device/lib/arch:device",
"//sw/device/lib/base:macros",
"//sw/device/lib/dif:rv_core_ibex",
"//sw/device/lib/dif:uart",
"//sw/device/lib/runtime:hart",
"//sw/device/lib/runtime:log",
"//sw/device/lib/runtime:print",
"//sw/device/lib/testing:rand_testutils",
"//third_party/freertos",
"@manufacturer_test_hooks//:test_hooks",
],
# `:ottf` depends on `:ottf_start`, but `:ottf_start` gets its main function
# from `:ottf`. Thus we need to include all of the objects in `:ottf`
# unconditionally so that the linker can find the symbol later.
alwayslink = True,
)
cc_library(
name = "ujson_ottf",
srcs = ["ujson_ottf.c"],
hdrs = ["ujson_ottf.h"],
deps = [
":ottf_flow_control",
"//sw/device/lib/base:status",
"//sw/device/lib/dif:uart",
"//sw/device/lib/runtime:print",
"//sw/device/lib/ujson",
],
)
dual_cc_library(
name = "ottf_flow_control",
srcs = dual_inputs(
device = ["ottf_flow_control.c"],
),
hdrs = ["ottf_flow_control.h"],
deps = dual_inputs(
device = [
":check",
":ottf_start",
"//sw/device/lib/base:mmio",
"//sw/device/lib/dif:rv_plic",
"//sw/device/lib/runtime:ibex",
"//sw/device/lib/runtime:irq",
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
],
shared = [
"//sw/device/lib/base:status",
"//sw/device/lib/dif:uart",
],
),
)
_FLOW_CONTROL_MESSAGE = (
"Mary had a little lamb, its fleece was white as snow. " +
"Everywhere that Mary went the lamb was sure to go." +
"\n"
)
opentitan_functest(
name = "ottf_flow_control_functest",
srcs = ["ottf_flow_control_functest.c"],
cw310 = cw310_params(
test_cmds = [
"--exec=\"fpga load-bitstream --rom-kind={rom_kind} $(location {bitstream})\"",
"--exec=\"bootstrap --clear-uart=true $(location {flash})\"",
"--exec=\"console --quiet --exit-success=WAIT --exit-failure=PASS|FAIL --flow-control\"",
"console",
"--flow-control",
"--send=\"{}\"".format(_FLOW_CONTROL_MESSAGE),
"--exit-success=\"RESULT:{}\"".format(_FLOW_CONTROL_MESSAGE),
"--exit-failure=\"PASS|FAIL\"",
],
),
targets = [
"verilator",
"cw310_test_rom",
],
verilator = verilator_params(
test_cmds = [
"--exec \"console --quiet --exit-success=WAIT --exit-failure=PASS|FAIL --flow-control\"",
"console",
"--flow-control",
"--send=\"{}\"".format(_FLOW_CONTROL_MESSAGE),
"--exit-success=\"{}\"".format(_FLOW_CONTROL_MESSAGE),
"--exit-failure=\"PASS|FAIL\"",
],
),
deps = [
":check",
":ottf_flow_control",
":ottf_main",
":ujson_ottf",
"//sw/device/lib/base:status",
"//sw/device/lib/runtime:print",
"//sw/device/lib/ujson",
],
)
cc_library(
name = "freertos_config",
hdrs = ["FreeRTOSConfig.h"],
# FreeRTOS sources don't follow our project's include-path standard,
# and just include via the bare filename.
includes = ["."],
)
cc_library(
name = "freertos_port",
srcs = [
"freertos_hooks.c",
"freertos_port.S",
"freertos_port.c",
],
deps = [
":check",
":freertos_config",
":ottf_start",
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//sw/device/lib/dif:rv_timer",
"//sw/device/lib/dif:uart",
"//sw/device/lib/runtime:hart",
"//sw/device/lib/runtime:irq",
"//sw/device/lib/runtime:log",
"//third_party/freertos",
],
# This library provides FreeRTOS hooks that are required for FreeRTOS to link,
# but FreeRTOS (currently) does not depend on this target. Therefore, we need
# to include all of the symbols from this object in the link so that they are
# found during linking.
alwayslink = True,
)