blob: 2c4e0b8a7831824cb6d63e5e33978bedee756aa4 [file] [log] [blame]
Zelalem Aweke1fc09802021-08-26 15:29:47 -05001
2Realm Management Extension (RME)
3====================================
4
5FEAT_RME (or RME for short) is an Armv9-A extension and is one component of the
6`Arm Confidential Compute Architecture (Arm CCA)`_. TF-A supports RME starting
Zelalem Aweke023b1a42021-10-21 13:59:45 -05007from version 2.6. This chapter discusses the changes to TF-A to support RME and
8provides instructions on how to build and run TF-A with RME.
9
10RME support in TF-A
11---------------------
12
13The following diagram shows an Arm CCA software architecture with TF-A as the
14EL3 firmware. In the Arm CCA architecture there are two additional security
15states and address spaces: ``Root`` and ``Realm``. TF-A firmware runs in the
16Root world. In the realm world, a Realm Management Monitor firmware (RMM)
17manages the execution of Realm VMs and their interaction with the hypervisor.
18
19.. image:: ../resources/diagrams/arm-cca-software-arch.png
20
21RME is the hardware extension to support Arm CCA. To support RME, various
22changes have been introduced to TF-A. We discuss those changes below.
23
24Changes to translation tables library
25***************************************
26RME adds Root and Realm Physical address spaces. To support this, two new
27memory type macros, ``MT_ROOT`` and ``MT_REALM``, have been added to the
28:ref:`Translation (XLAT) Tables Library`. These macros are used to configure
29memory regions as Root or Realm respectively.
30
31.. note::
32
33 Only version 2 of the translation tables library supports the new memory
34 types.
35
36Changes to context management
37*******************************
38A new CPU context for the Realm world has been added. The existing
39:ref:`CPU context management API<PSCI Library Integration guide for Armv8-A
40AArch32 systems>` can be used to manage Realm context.
41
42Boot flow changes
43*******************
44In a typical TF-A boot flow, BL2 runs at Secure-EL1. However when RME is
45enabled, TF-A runs in the Root world at EL3. Therefore, the boot flow is
46modified to run BL2 at EL3 when RME is enabled. In addition to this, a
47Realm-world firmware (RMM) is loaded by BL2 in the Realm physical address
48space.
49
50The boot flow when RME is enabled looks like the following:
51
521. BL1 loads and executes BL2 at EL3
532. BL2 loads images including RMM
543. BL2 transfers control to BL31
554. BL31 initializes SPM (if SPM is enabled)
565. BL31 initializes RMM
576. BL31 transfers control to Normal-world software
58
59Granule Protection Tables (GPT) library
60*****************************************
61Isolation between the four physical address spaces is enforced by a process
62called Granule Protection Check (GPC) performed by the MMU downstream any
63address translation. GPC makes use of Granule Protection Table (GPT) in the
64Root world that describes the physical address space assignment of every
65page (granule). A GPT library that provides APIs to initialize GPTs and to
66transition granules between different physical address spaces has been added.
67More information about the GPT library can be found in the
68:ref:`Granule Protection Tables Library` chapter.
69
70RMM Dispatcher (RMMD)
71************************
72RMMD is a new standard runtime service that handles the switch to the Realm
73world. It initializes the RMM and handles Realm Management Interface (RMI)
74SMC calls from Non-secure and Realm worlds.
75
76Test Realm Payload (TRP)
77*************************
78TRP is a small test payload that runs at R-EL2 and implements a subset of
79the Realm Management Interface (RMI) commands to primarily test EL3 firmware
80and the interface between R-EL2 and EL3. When building TF-A with RME enabled,
81if a path to an RMM image is not provided, TF-A builds the TRP by default
82and uses it as RMM image.
Zelalem Aweke1fc09802021-08-26 15:29:47 -050083
84Building and running TF-A with RME
85------------------------------------
86
87This section describes how you can build and run TF-A with RME enabled.
88We assume you have all the :ref:`Prerequisites` to build TF-A.
89
90To enable RME, you need to set the ENABLE_RME build flag when building
91TF-A. Currently, this feature is only supported for the FVP platform.
92
93The following instructions show you how to build and run TF-A with RME
94for two scenarios: TF-A with TF-A Tests, and four-world execution with
95Hafnium and TF-A Tests. The instructions assume you have already obtained
96TF-A. You can use the following command to clone TF-A.
97
98.. code:: shell
99
100 git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
101
Zelalem Aweke023b1a42021-10-21 13:59:45 -0500102To run the tests, you need an FVP model. Please use the :ref:`latest version
103<Arm Fixed Virtual Platforms (FVP)>` of *FVP_Base_RevC-2xAEMvA* model.
Zelalem Aweke1fc09802021-08-26 15:29:47 -0500104
105.. note::
106
107 ENABLE_RME build option is currently experimental.
108
109Building TF-A with TF-A Tests
110********************************************
111Use the following instructions to build TF-A with `TF-A Tests`_ as the
112non-secure payload (BL33).
113
114**1. Obtain and build TF-A Tests**
115
116.. code:: shell
117
118 git clone https://git.trustedfirmware.org/TF-A/tf-a-tests.git
119 cd tf-a-tests
120 make CROSS_COMPILE=aarch64-none-elf- PLAT=fvp DEBUG=1
121
122This produces a TF-A Tests binary (*tftf.bin*) in the *build/fvp/debug* directory.
123
124**2. Build TF-A**
125
126.. code:: shell
127
128 cd trusted-firmware-a
129 make CROSS_COMPILE=aarch64-none-elf- \
130 PLAT=fvp \
131 ENABLE_RME=1 \
132 FVP_HW_CONFIG_DTS=fdts/fvp-base-gicv3-psci-1t.dts \
133 DEBUG=1 \
134 BL33=<path/to/tftf.bin> \
135 all fip
136
137This produces *bl1.bin* and *fip.bin* binaries in the *build/fvp/debug* directory.
Zelalem Aweke023b1a42021-10-21 13:59:45 -0500138The above command also builds TRP. The TRP binary is packaged in *fip.bin*.
Zelalem Aweke1fc09802021-08-26 15:29:47 -0500139
140Four-world execution with Hafnium and TF-A Tests
141****************************************************
142Four-world execution involves software components at each security state: root,
143secure, realm and non-secure. This section describes how to build TF-A
144with four-world support. We use TF-A as the root firmware, `Hafnium`_ as the
145secure component, TRP as the realm-world firmware and TF-A Tests as the
146non-secure payload.
147
148Before building TF-A, you first need to build the other software components.
149You can find instructions on how to get and build TF-A Tests above.
150
151**1. Obtain and build Hafnium**
152
153.. code:: shell
154
155 git clone --recurse-submodules https://git.trustedfirmware.org/hafnium/hafnium.git
156 cd hafnium
157 make PROJECT=reference
158
159The Hafnium binary should be located at
160*out/reference/secure_aem_v8a_fvp_clang/hafnium.bin*
161
162**2. Build TF-A**
163
164Build TF-A with RME as well as SPM enabled.
165
166.. code:: shell
167
168 make CROSS_COMPILE=aarch64-none-elf- \
169 PLAT=fvp \
170 ENABLE_RME=1 \
171 FVP_HW_CONFIG_DTS=fdts/fvp-base-gicv3-psci-1t.dts \
172 SPD=spmd \
173 SPMD_SPM_AT_SEL2=1 \
174 BRANCH_PROTECTION=1 \
175 CTX_INCLUDE_PAUTH_REGS=1 \
176 DEBUG=1 \
177 SP_LAYOUT_FILE=<path/to/tf-a-tests>/build/fvp/debug/sp_layout.json> \
178 BL32=<path/to/hafnium.bin> \
179 BL33=<path/to/tftf.bin> \
180 all fip
181
182Running the tests
183*********************
184Use the following command to run the tests on FVP. TF-A Tests should boot
185and run the default tests including RME tests.
186
187.. code:: shell
188
189 FVP_Base_RevC-2xAEMvA \
190 -C bp.flashloader0.fname=<path/to/fip.bin> \
191 -C bp.secureflashloader.fname=<path/to/bl1.bin> \
192 -C bp.refcounter.non_arch_start_at_default=1 \
193 -C bp.refcounter.use_real_time=0 \
194 -C bp.ve_sysregs.exit_on_shutdown=1 \
195 -C cache_state_modelled=1 \
196 -C cluster0.NUM_CORES=4 \
197 -C cluster0.PA_SIZE=48 \
198 -C cluster0.ecv_support_level=2 \
199 -C cluster0.gicv3.cpuintf-mmap-access-level=2 \
200 -C cluster0.gicv3.without-DS-support=1 \
201 -C cluster0.gicv4.mask-virtual-interrupt=1 \
202 -C cluster0.has_arm_v8-6=1 \
203 -C cluster0.has_branch_target_exception=1 \
204 -C cluster0.has_rme=1 \
205 -C cluster0.has_rndr=1 \
206 -C cluster0.has_amu=1 \
207 -C cluster0.has_v8_7_pmu_extension=2 \
208 -C cluster0.max_32bit_el=-1 \
209 -C cluster0.restriction_on_speculative_execution=2 \
210 -C cluster0.restriction_on_speculative_execution_aarch32=2 \
211 -C cluster1.NUM_CORES=4 \
212 -C cluster1.PA_SIZE=48 \
213 -C cluster1.ecv_support_level=2 \
214 -C cluster1.gicv3.cpuintf-mmap-access-level=2 \
215 -C cluster1.gicv3.without-DS-support=1 \
216 -C cluster1.gicv4.mask-virtual-interrupt=1 \
217 -C cluster1.has_arm_v8-6=1 \
218 -C cluster1.has_branch_target_exception=1 \
219 -C cluster1.has_rme=1 \
220 -C cluster1.has_rndr=1 \
221 -C cluster1.has_amu=1 \
222 -C cluster1.has_v8_7_pmu_extension=2 \
223 -C cluster1.max_32bit_el=-1 \
224 -C cluster1.restriction_on_speculative_execution=2 \
225 -C cluster1.restriction_on_speculative_execution_aarch32=2 \
226 -C pci.pci_smmuv3.mmu.SMMU_AIDR=2 \
227 -C pci.pci_smmuv3.mmu.SMMU_IDR0=0x0046123B \
228 -C pci.pci_smmuv3.mmu.SMMU_IDR1=0x00600002 \
229 -C pci.pci_smmuv3.mmu.SMMU_IDR3=0x1714 \
230 -C pci.pci_smmuv3.mmu.SMMU_IDR5=0xFFFF0475 \
231 -C pci.pci_smmuv3.mmu.SMMU_S_IDR1=0xA0000002 \
232 -C pci.pci_smmuv3.mmu.SMMU_S_IDR2=0 \
233 -C pci.pci_smmuv3.mmu.SMMU_S_IDR3=0 \
234 -C bp.pl011_uart0.out_file=uart0.log \
235 -C bp.pl011_uart1.out_file=uart1.log \
236 -C bp.pl011_uart2.out_file=uart2.log \
237 -C pctl.startup=0.0.0.0 \
238 -Q 1000 \
239 "$@"
240
241The bottom of the output from *uart0* should look something like the following.
242
243.. code-block:: shell
244
245 ...
246
247 > Test suite 'FF-A Interrupt'
248 Passed
249 > Test suite 'SMMUv3 tests'
250 Passed
251 > Test suite 'PMU Leakage'
252 Passed
253 > Test suite 'DebugFS'
254 Passed
255 > Test suite 'Realm payload tests'
256 Passed
257 ...
258
259
260.. _Arm Confidential Compute Architecture (Arm CCA): https://www.arm.com/why-arm/architecture/security-features/arm-confidential-compute-architecture
261.. _Arm Architecture Models website: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms/arm-ecosystem-models
262.. _TF-A Tests: https://trustedfirmware-a-tests.readthedocs.io/en/latest
263.. _Hafnium: https://www.trustedfirmware.org/projects/hafnium