blob: 268b435ba3be244bc7d867d647791ddf74292498 [file] [log] [blame] [edit]
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
EXT_FLASH_DEBUG=$(CHERIOT_OUT_DEBUG)/ext_flash.tar
EXT_FLASH_RELEASE=$(CHERIOT_OUT_RELEASE)/ext_flash.tar
CHERIOT_SIM_SRC_DIR := $(ROOTDIR)/sim/mpact-cheriot
CHERIOT_SIM_OUT_DIR := $(OUT)/cheriot/sim
CHERIOT_BOOT_SRC_DIR := $(MATCHA_SRC_DIR)/sw/device/cheriot/boot
TMP_DEBUG=$(CHERIOT_OUT_DEBUG)/tmp
TMP_RELEASE=$(CHERIOT_OUT_RELEASE)/tmp
sim_configs:
$(RENODE_SIM_GENERATOR_SCRIPT)
clean_sim_configs:
@rm -rf $(OUT)/renode_configs
$(TMP_DEBUG):
mkdir $(TMP_DEBUG)
$(TMP_RELEASE):
mkdir $(TMP_RELEASE)
## Build the CHERIoT boot ROM image
#
# This builds the HW boot rom executable for simulation.
# Source is in hw/matcha, while output is placed in
# out/cheriot/hw/
cheriot_boot_rom: cheriot_boot_rom_otp
cheriot_boot_rom_clean: cheriot_boot_rom_otp_clean
cheriot_boot_rom_otp: | $(CHERIOT_OUT_DIR)
cd $(MATCHA_SRC_DIR) && \
bazel build --config=cheriot-baremetal --copt=-D_CHERIOT_BAREMETAL_ \
//sw/device/lib/testing/test_rom:test_rom_no_otp_cheri_fpga_nexus.elf
cd $(MATCHA_SRC_DIR) && \
find "bazel-out/" -wholename "*test_rom/test_rom_no_otp_cheri_fpga_nexus.elf" \
-exec cp -f '{}' "$(CHERIOT_OUT_DIR)/$(BOOT_ROM_ELF)" \;
cd ${MATCHA_SRC_DIR}/bazel-matcha && \
$(CACHE)/cheriot-tools/bin/llvm-objdump -glxsdrS --demangle \
$(CHERIOT_OUT_DIR)/$(BOOT_ROM_ELF) > $(CHERIOT_OUT_DIR)/$(BOOT_ROM_ELF).dump
cheriot_boot_rom_otp_clean:
cd $(MATCHA_SRC_DIR) && bazel clean --expunge
# XXX symlink cheriot fw to "kernel" to satisfy elfloader
$(EXT_FLASH_DEBUG): $(MATCHA_BUNDLE_DEBUG) $(CHERIOT_FIRMWARE_DEBUG) | $(TMP_DEBUG)
cp -f $(MATCHA_BUNDLE_DEBUG) $(TMP_DEBUG)/matcha-tock-bundle
${C_PREFIX}strip $(TMP_DEBUG)/matcha-tock-bundle
${C_PREFIX}objcopy -O binary -g $(TMP_DEBUG)/matcha-tock-bundle $(TMP_DEBUG)/matcha-tock-bundle.bin
ln -sf $(CHERIOT_FIRMWARE_DEBUG) $(TMP_DEBUG)/kernel
tar -C $(TMP_DEBUG) -cvhf $@ matcha-tock-bundle.bin kernel
ext_flash_debug: $(EXT_FLASH_DEBUG)
# TODO(sleffler): maybe move to opentitan_sw.mk?
TEST_PRIVATE_KEY_0 := ${OPENTITAN_SOURCE}/sw/device/silicon_creator/rom/keys/fake/test_key_0_rsa_3072_exp_f4.der
$(OUT)/host:
mkdir $(OUT)/host
opentitantool_: opentitantool_pkg | ${OUT}/host
tar -C ${OUT}/host -xf $(MATCHA_OUT_DIR)/opentitantool_pkg.tar.gz
## Construct a 2nd-level OpenTitan firmware image from a cheriot-rtos
## firmware image.
#
# This assumes the cheriot-rtos image was built with the instruction
# memory in the board config offset by 0x380 bytes (0x380 = 896 bytes
# is the size of the OT manifest data structure). To build the image:
# - strip symbol & linearize the ELF segments; data will start at offset 0 in the file
# - copy the data up by the size of an OT manifest data structure
# - use openttitantool to construct the manifest & sign the image
# There are many ways we could do this. It might be better to have the
# cheriot-rtos build glue help us leave room for the manifest instead
# of adjusting the instruction memory but this works for now.
cheriot_firmware_release: ${CHERIOT_FIRMWARE_RELEASE} opentitantool_ | ${TMP_RELEASE}
cp -f $(CHERIOT_FIRMWARE_RELEASE) $(TMP_RELEASE)/cheriot-firmware
${C_PREFIX}objcopy --strip-all -O binary -g $(TMP_RELEASE)/cheriot-firmware $(TMP_RELEASE)/cheriot-firmware.raw
dd if=$(TMP_RELEASE)/cheriot-firmware.raw of=${TMP_RELEASE}/cheriot-firmware.bin bs=896 seek=1
${OT_TOOL} image manifest update \
--manifest=${ROOTDIR}/build/platforms/bancha/bl0-manifest.hjson \
--sign --key-file=${TEST_PRIVATE_KEY_0} \
$(TMP_RELEASE)/cheriot-firmware.bin
$(EXT_FLASH_RELEASE): ${CANTRIP_MODEL_RELEASE} cheriot_firmware_release | $(TMP_RELEASE)
tar -C $(TMP_RELEASE) -cvhf $@ cheriot-firmware.bin
if [[ -f "${CANTRIP_MODEL_RELEASE}" ]]; then \
${C_PREFIX}objcopy -O binary -g ${CANTRIP_MODEL_RELEASE} $(TMP_RELEASE)/kelvin.bin; \
tar -C $(TMP_RELEASE) -uvf $@ kelvin.bin; \
fi
ext_flash_release: $(EXT_FLASH_RELEASE)
# Renode commands to issue before the initial start of a simulation.
# This pauses all cores and then sets cpu0 (SC).
RENODE_PRESTART_CMDS=pause; cpu0 IsHalted false;
PORT_PRESTART_CMDS:=$(shell $(ROOTDIR)/scripts/generate-renode-port-cmd.sh $(RENODE_PORT))
# XXX the same for now
BANCHA_RESC_DEBUG=sim/config/bancha.resc
BANCHA_RESC_RELEASE=sim/config/bancha.resc
CHERIOT_RESC_RELEASE=sim/config/cheriot.resc
BANCHA_REPL=sim/config/platforms/bancha.repl
## Launches an end-to-end build of the system and starts Renode
#
# This top-level target triggers the `cheriot_sim`, `kelvin_sim', `renode`,
# `cheriot_boot_rom`, and `ext_flash_release' targets to build the entire
# system and then finally starts the Renode simulator.
#
# This is the default target for the build system, and is generally what you
# need for day-to-day work on the software side of Shodan.
simulate: renode cheriot_sim kelvin_sim cheriot_boot_rom ext_flash_release
$(RENODE_CMD) -e "\
\$$repl_file = @${BANCHA_REPL}; \
\$$sc_bin =@$(TMP_RELEASE)/cheriot-firmware.bin; \
\$$cheriot_elf = @$(TMP_RELEASE)/cheriot-firmware; \
$(PORT_PRESTART_CMDS) i @${BANCHA_RESC_RELEASE}; \
$(RENODE_PRESTART_CMDS) start"
## Version of the `simulate` target that also enables the simulator command
## line interface on port 4567. To access the simulator use something like
## telnet localhost 4567. Note renode will block until the cli is connected.
simulate+cli: renode cheriot_sim kelvin_sim cheriot_boot_rom ext_flash_release
$(RENODE_CMD) -e "\
\$$repl_file = @${BANCHA_REPL}; \
\$$sc_bin =@$(TMP_RELEASE)/cheriot-firmware.bin; \
\$$cheriot_elf = @$(TMP_RELEASE)/cheriot-firmware; \
\$$cli_port = 4567; \
\$$wait_for_cli = true; \
$(PORT_PRESTART_CMDS) i @${BANCHA_RESC_RELEASE}; \
$(RENODE_PRESTART_CMDS) start"
## Debug version of the `simulate` target
#
# This top-level target does the same job as `simulate`, but instead of
# unhalting the CPUs and starting the system, this alternate target only unhalts
# cpu0, and uses the debug build of TockOS from the `matcha_tock_debug` target.
simulate-debug: renode cheriot_sim kelvin_sim cheriot_boot_rom ext_flash_debug
$(RENODE_CMD) -e "\
\$$repl_file = @${BANCHA_REPL}; \
\$$tar = @$(EXT_FLASH_DEBUG); \
\$$sc_bin =@$(TMP_RELEASE)/cheriot-firmware.bin; \
\$$cheriot_elf = @$(TMP_RELEASE)/cheriot-firmware; \
$(PORT_PRESTART_CMDS) i @${BANCHA_RESC_DEBUG}; \
$(RENODE_PRESTART_CMDS); start"
## Debug version of the `simulate` target
#
# This top-level target does the same job as `simulate-debug`, but instead of
# unhalting the CPUs and starting the system, this alternate target starts
# renode with no CPUs unhalted, allowing for GDB to be used for early system
# start.
debug-simulation: renode cheriot_sim kelvin_sim cheriot_boot_rom ext_flash_debug
$(RENODE_CMD) -e "\
\$$repl_file = @${BANCHA_REPL}; \
\$$tar = @$(EXT_FLASH_DEBUG); \
\$$sc_bin =@$(TMP_RELEASE)/cheriot-firmware.bin; \
\$$cheriot_elf = @$(TMP_RELEASE)/cheriot-firmware; \
$(PORT_PRESTART_CMDS) i @${BANCHA_RESC_DEBUG}; start"
$(CHERIOT_SIM_OUT_DIR):
mkdir -p "$(CHERIOT_SIM_OUT_DIR)"
## Build CHERIoT ISS
#
# Build mpact-sim-based CHERIoT ISS with bazel, and copy it to out/
# Use /tmp as the bazel tmpfs to unblock CI
cheriot_sim: | $(CHERIOT_SIM_OUT_DIR)
cd "$(CHERIOT_SIM_SRC_DIR)" && \
bazel build --sandbox_tmpfs_path=/tmp \
//cheriot:mpact_cheriot \
//cheriot:renode_mpact_cheriot
cd "$(CHERIOT_SIM_SRC_DIR)/bazel-bin" && \
cp -f cheriot/mpact_cheriot "$(CHERIOT_SIM_OUT_DIR)" && \
cp -f cheriot/librenode_mpact_cheriot.so "$(CHERIOT_SIM_OUT_DIR)"
## Clean CHERIoT ISS
#
# Clean the CHERIoT ISS
cheriot_sim_clean:
cd "$(CHERIOT_SIM_SRC_DIR)" && \
bazel clean --expunge
rm -rf $(CHERIOT_SIM_OUT_DIR)
.PHONY:: sim_configs clean_sim_configs simulate simulate-debug debug-simulation
.PHONY:: opentitantool_
.PHONY:: cheriot_firmware_release
.PHONY:: cheriot_sim cheriot_sim_clean
.PHONY:: cheriot_boot_rom cheriot_boot_rom_clean