| # 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. |
| |
| # NB: The SMC/CHERIoT has no (working) gdb support so debug builds |
| # are not useful. |
| |
| 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 |
| |
| 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 |
| |
| .PHONY:: sim_configs clean_sim_configs |
| |
| # 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)) |
| |
| SENCHA_REPL=sim/config/platforms/sencha.repl |
| SENCHA_RESC_RELEASE=sim/config/sencha.resc |
| |
| # Common logic for running a CHERIoT firmware ELF image on sencha. |
| # SEC boots first using multihart_boot_rom. It loads matcha-tock |
| # which loads the SMC firmware image (cheriot_elf) from the tarball |
| # located in flash and then resets the SMC with the pc set to the |
| # entry_point in cheriot_elf. |
| # |
| # The following targets do slightly different versions of the above; |
| # some of which are useless due to the missing gdb support. |
| |
| # Sencha-specific renode scripts. We construct them in make as much |
| # as possible to avoid shell quoting/escape issues. The only parts |
| # done in the shell use __SENCHA_* variables that are dynamically |
| # calculated. |
| SENCHA_SCRIPT:= $$repl_file = @${SENCHA_REPL}; |
| SENCHA_SCRIPT+= $$sc_bin =@$(TMP_RELEASE)/matcha-tock-bundle.bin; |
| SENCHA_SCRIPT+= i @${SENCHA_RESC_RELEASE}; |
| # Hack: copy before the prestart commands are appended |
| SENCHA_DEBUG_SCRIPT := ${SENCHA_SCRIPT} |
| SENCHA_SCRIPT+= $(RENODE_PRESTART_CMDS) |
| |
| SENCHA_CLI_SCRIPT:= $$repl_file = @${SENCHA_REPL}; |
| SENCHA_CLI_SCRIPT+= $$sc_bin =@$(TMP_RELEASE)/matcha-tock-bundle.bin; |
| SENCHA_CLI_SCRIPT+= $$cli_port = 4567; |
| SENCHA_CLI_SCRIPT+= $$wait_for_cli = true; |
| SENCHA_CLI_SCRIPT+= i @${SENCHA_RESC_RELEASE}; |
| SENCHA_CLI_SCRIPT+= $(RENODE_PRESTART_CMDS) |
| |
| __sencha-simulate: renode cheriot_sim kelvin_sim multihart_boot_rom |
| $(RENODE_CMD) -e '$$tar=${__SENCHA_TAR}; $$cheriot_elf=${__SENCHA_CHERIOT_ELF}; ${SENCHA_SCRIPT} start' |
| __sencha-simulate+cli: renode cheriot_sim kelvin_sim multihart_boot_rom |
| $(RENODE_CMD) -e '$$tar=${__SENCHA_TAR}; $$cheriot_elf=${__SENCHA_CHERIOT_ELF}; ${SENCHA_CLI_SCRIPT} start' |
| # NB: just run the release version for now |
| __sencha-simulate-debug: __sencha-simulate |
| # NB: can attach with gdb but runs the release build artifacts |
| __sencha-debug-simulation: renode cheriot_sim kelvin_sim multihart_boot_rom |
| $(RENODE_CMD) -e '$$tar=${__SENCHA_TAR}; $$cheriot_elf=${__SENCHA_CHERIOT_ELF}; ${SENCHA_DEBUG_SCRIPT} start' |
| |
| .PHONY:: __sencha-simulate __sencha-simulate+cli |
| .PHONY:: __sencha-simulate-debug __sencha-debug-simulation |
| |
| $(TMP_DEBUG): |
| mkdir -p $(TMP_DEBUG) |
| $(TMP_RELEASE): |
| mkdir -p $(TMP_RELEASE) |
| |
| # 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) |
| |
| # XXX symlink cheriot fw to "kernel" to satisfy elfloader |
| $(EXT_FLASH_RELEASE): $(MATCHA_BUNDLE_RELEASE) $(CHERIOT_FIRMWARE_RELEASE) | $(TMP_RELEASE) |
| cp -f $(MATCHA_BUNDLE_RELEASE) $(TMP_RELEASE)/matcha-tock-bundle |
| ${C_PREFIX}strip $(TMP_RELEASE)/matcha-tock-bundle |
| ${C_PREFIX}objcopy -O binary -g $(TMP_RELEASE)/matcha-tock-bundle $(TMP_RELEASE)/matcha-tock-bundle.bin |
| ln -sf $(CHERIOT_FIRMWARE_RELEASE) $(TMP_RELEASE)/kernel |
| tar -C $(TMP_RELEASE) -cvhf $@ matcha-tock-bundle.bin kernel |
| ext_flash_release: $(EXT_FLASH_RELEASE) |
| |
| ## Launches an end-to-end build of the system and starts Renode |
| # |
| # This top-level target triggers the `ext_flash_release`, `cheriot_sim`, `renode`, |
| # `multihart_boot_rom`, and `kelvin_sim` 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: ext_flash_release |
| ${MAKE} \ |
| __SENCHA_TAR="@${EXT_FLASH_RELEASE}" \ |
| __SENCHA_CHERIOT_ELF="@${TMP_RELEASE}/kernel" \ |
| __sencha-simulate |
| |
| ## Version of the `simulate` target that also enables the mpact-cheriot |
| ## simulator command line interface on port 4567. To access the simulator |
| ## use something like `telnet localhost 4567`. Note the simulation will |
| ## block until the cli is connected. |
| simulate+cli: ext_flash_release |
| ${MAKE} \ |
| __SENCHA_TAR="@${EXT_FLASH_RELEASE}" \ |
| __SENCHA_CHERIOT_ELF="@${TMP_RELEASE}/kernel" \ |
| __sencha-simulate+cli |
| |
| ## 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 `ext_flash_debug` target. |
| simulate-debug: ext_flash_debug |
| ${MAKE} \ |
| __SENCHA_TAR="@${EXT_FLASH_DEBUG}" \ |
| __SENCHA_CHERIOT_ELF="@${TMP_DEBUG}/kernel" \ |
| __sencha-simulate-debug |
| |
| ## 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 |
| # debugging. |
| debug-simulation: ext_flash_debug |
| ${MAKE} \ |
| __SENCHA_TAR="@${EXT_FLASH_DEBUG}" \ |
| __SENCHA_CHERIOT_ELF="@${TMP_DEBUG}/kernel" \ |
| __sencha-debug-simulation |
| |
| .PHONY:: simulate simulate+cli simulate-debug debug-simulation |
| |
| $(CHERIOT_SIM_OUT_DIR): |
| mkdir -p "$(CHERIOT_SIM_OUT_DIR)" |
| |
| # Support for building the standalone mpact-cheriot simulator and the |
| # library packaged for use within renode. |
| |
| ## 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:: cheriot_sim cheriot_sim_clean |
| |
| include $(ROOTDIR)/build/platforms/sencha/sim_ottf.mk |
| include $(ROOTDIR)/build/platforms/sencha/sim_testbench.mk |