18. Building with Shrinkwrap
This document explains how to build and run RMM in FVP, including all necessary firmware images, by using Shrinkwrap.
18.1. Introduction
Shrinkwrap is a tool that helps to simplify the process of building and running firmware on Arm FVP by providing an intuitive command line interface frontend and (by default) a container-based backend.
Shrinkwrap works by using configs, which are defined in YAML and can be easily extended using a built-in layering system.
For instructions on how to setup Shrinkwrap on your local machine as well as for further information, you can refer to the Quick Start Guide. In particular, for development with RME enabled Linux in Normal World, please refer to the 3 world configuration. In case that the Secure World also needs to be included, please refer to the 4 world configuration
18.2. Setup local RMM with Shrinkwrap
This section assumes that you have your local RMM repository cloned and that it is used for your development. In order to help using Shrinkwrap with your development workflow, the project provides some configs and overlays.
Also, from now on, it is assumed that your current directory (pointed by
${PWD}
) is the root of your RMM development repository.
In order to use the configs defined in RMM, it is essential to configure
the ${SHRINKWRAP_CONFIG}
environment variable to point to
${PWD}/tools/shrinkwrap/configs
directory so the tool can locate the
config yaml files.
export SHRINKWRAP_CONFIG=${PWD}/tools/shrinkwrap/configs
It is also recommended to override the default ${SHRINKWRAP_BUILD}
and
${SHRINKWRAP_PACKAGE}
environment variables to a known workspace directory,
as shown below:
export WORKSPACE=${HOME}/workspace export SHRINKWRAP_BUILD=${WORKSPACE} export SHRINKWRAP_PACKAGE=${SHRINKWRAP_BUILD}/package
When building, Shrinkwrap will store the sources inside
${SHRINKWRAP_BUILD}/source/<CONFIG_NAME>
and the build artifacts and
packages will be stored inside ${SHRINKWRAP_BUILD}/build/<CONFIG_NAME>
and
${SHRINKWRAP_PACKAGE}/<CONFIG_NAME>
directories respectively.
Note
By default, if ${SHRINKWRAP_BUILD} and ${SHRINKWRAP_PACKAGE} are not
specified, Shrinkwrap will use the ${HOME}/.shrinkwrap
as default
value for ${SHRINKWRAP_BUILD}. It is only necessary to overwrite the
environment variables in the case it is needed to build in a different
location.
18.3. 3-World testing
RMM provides a number of overlays that can be used in conjunction with some
of the configs provided by Shrinkwrap. One of the overlays, specifically
rmm.yaml
, can be used along with the cca-3world.yaml
to
build a 3 World demonstrator using the master
branch of TF-A and the
local RMM repository.
As an example, the following command line would build the 3-World demonstrator.
It assumes that Shrinkwrap is called from within the <RMM_ROOT>
directory:
shrinkwrap build cca-3world.yaml --overlay=buildroot.yaml --overlay=rmm.yaml --btvar=GUEST_ROOTFS='${artifact:BUILDROOT}' --btvar=RMM_SRC=${PWD} --no-sync=rmm
You can find further instructions on how to build and package the filesystem and required binaries in the 3 world configuration documentation.
To run the demonstrator, use the following command:
shrinkwrap run cca-3world.yaml --rtvar=ROOTFS=${SHRINKWRAP_PACKAGE}/cca-3world/rootfs.ext2
18.4. Testing RMM with TFTF
RMM provides a config that brings together a software stack to test RMM and Arm RME extension utilizing TF-A-Tests. The main Test payload in TF-A-Tests is the TFTF binary. In this config, TF-A is in Root World, RMM is in Realm EL2 and TFTF is in Normal World.
In order to build the config, you need to run the following command:
shrinkwrap build --btvar=RMM_SRC=${PWD} rmm-tftf.yaml --no-sync=rmm
and you can run it through
shrinkwrap run rmm-tftf.yaml
For further documentation about this configuration, you can check the docs through
shrinkwrap inspect rmm-tftf.yaml
The build and run commands can also be found in the documentation of the config
yaml file. When invoking the build
command, Shrinkwrap will store the
external repositories inside the ${SHRINKWRAP_BUILD}/sources/<CONFIG_NAME>
directory.
18.5. Overlays
Overlays can be used to extend the functionality of a config by overwriting both build and runtime settings. They can be used on any configuration and they can be combined in any way needed.
In order to use an overlay, they need to be specified on the command line, through
the --overlay
keyword, as follows:
shrinkwrap build rmm-tftf.yaml --btvar=RMM_SRC=${PWD} --overlay=<OVERLAY_FILE_NAME> --no-sync=rmm
The path to the overlay can be relative to where Shrinkwrap is called from and you
can use as many --overlay
statements as needed.
Overlays are stored in the <RMM_ROOT_DIR>/tools/shrinkwrap/configs/
directory,
alongside with the configuration files.
The available Overlays are sumarized in the next table
Overlay |
Description |
---|---|
model-enable-lpa2.yaml |
Overlay used to enable |
model-wait-debugger.yaml |
Overlay to configure the FVP model to listen for Iris connections on port 7100 and make it wait until a debugger is connected before starting execution |
rmm-debug.yaml |
|
clean.yaml |
Overlay used to avoid an exception with |
18.5.1. Example of use
Below is an example on how to use one of the available overlays with the
existing configuration. The example specifies --runtime=null
to use the
native toolchain (without the Docker container) to build the artifacts and
--no-sync-all
to prevent Shrinkwrap from updating/cleaning any of the
repositories:
shrinkwrap --runtime=null build rmm-tftf.yaml --overlay=model-enable-lpa2.yaml --btvar=RMM_SRC=${PWD} --no-sync-all
Then you run your tests with
shrinkwrap --runtime=null run rmm-tftf.yaml
Note
Note that runtime=null
is specified for the run, as it must match
the same setting as used on the build stage. Also, with this setting,
the appropriate FVP (FVP_Base_RevC-2xAEMvA) needs to be present in the
system ${PATH}.