blob: 5d0f3734ee1b7addfddb8751157f3e9965ab595c [file] [log] [blame]
Jamie Fox519cc4b2022-06-07 12:07:28 +01001Runtime Security Subsystem (RSS)
2================================
3
4Introduction
5------------
6
7Runtime Security Subsystem (RSS) is an Arm subsystem that provides a reference
8implementation of the HES Host in the
9`Arm Confidential Compute Architecture (CCA) <https://www.arm.com/architecture/security-features/arm-confidential-compute-architecture>`_.
10It is designed to be integrated into A-profile compute subsystems that implement
11Arm CCA, where it serves as the Root of Trust.
12
13RSS initially boots from immutable code (BL1_1) in its internal ROM, before
14jumping to BL1_2, which is provisioned and hash-locked in RSS OTP. The updatable
15MCUBoot BL2 boot stage is loaded from host system flash into RSS SRAM, where it
16is authenticated. BL2 loads and authenticates the TF-M runtime into RSS SRAM
17from host flash. BL2 is also responsible for loading initial boot code into
18other subsystems within the host.
19
David Vincze8c95d2a2022-01-19 10:11:58 +010020The RSS platform port supports the TF-M Crypto, TF-M Initial Attestation,
21Measured Boot and TF-M Platform services along with the corresponding
22regression tests. It supports the IPC model in multi-core topology with
23Isolation Level 1 and 2.
Jamie Fox519cc4b2022-06-07 12:07:28 +010024
25Building TF-M
26-------------
27
Anton Komlev0dbe8f12022-06-17 16:48:12 +010028Follow the instructions in :doc:`Build instructions </building/tfm_build_instruction>`.
Raef Coles5a6345e2022-09-29 12:39:58 +010029Build TF-M with platform name: `arm/rss/<rss platform name>`
Jamie Fox519cc4b2022-06-07 12:07:28 +010030
Raef Coles5a6345e2022-09-29 12:39:58 +010031For example for building RSS for Total Compute platforms:
32``-DTFM_PLATFORM=arm/rss/tc``
Jamie Fox519cc4b2022-06-07 12:07:28 +010033
34Signing host images
35-------------------
36
37RSS BL2 can load boot images into other subsystems within the host system. It
38expects images to be signed, with the signatures attached to the images in the
39MCUBoot metadata format.
40
41The `imgtool Python package <https://pypi.org/project/imgtool/>`_ can be used to
42sign images in the required format. To sign a host image using the development
43key distributed with TF-M, use the following command::
44
45 imgtool sign \
46 -k <TF-M base directory>/bl2/ext/mcuboot/root-RSA-3072.pem \
47 --public-key-format full \
48 --max-align 8 \
49 --align 1 \
50 -v "0.0.1" \
51 -s 1 \
Raef Coles00f1d202023-04-25 14:34:29 +010052 -H 0x2000 \
Jamie Fox519cc4b2022-06-07 12:07:28 +010053 --pad-header \
54 -S 0x80000 \
55 --pad \
Jamie Fox519cc4b2022-06-07 12:07:28 +010056 -L <load address> \
57 <binary infile> \
58 <signed binary outfile>
59
Jamie Foxa1e86022022-07-12 17:58:02 +010060The ``load address`` is the logical address in the RSS memory map to which BL2
61will load the image. RSS FW expects the first host image to be loaded to address
62``0x70000000`` (the beginning of the RSS ATU host access region), and each
Jamie Foxd6aec212023-08-01 16:30:54 +010063subsequent host image to be loaded at an offset of ``0x1000000`` from the
Jamie Foxa1e86022022-07-12 17:58:02 +010064previous image. The RSS ATU should be configured to map these logical addresses
65to the physical addresses in the host system that the images need to be loaded
66to.
Jamie Fox519cc4b2022-06-07 12:07:28 +010067
68For more information on the ``imgtool`` parameters, see the MCUBoot
69`imgtool documentation <https://docs.mcuboot.com/imgtool.html>`_.
70
71.. warning::
72
73 The TF-M development key must never be used in production. To generate a
74 production key, follow the imgtool documentation.
75
76Running the code
77----------------
78
Raef Coles078f6b02023-07-12 14:38:13 +010079To run the built images, first the ROM image must be created from the bl1_1
80binary and the ROM DMA Initial Command Sequence (ICS).::
81
82 srec_cat \
83 bl1_1.bin -Binary -offset 0x0 \
84 rom_dma_ics.bin -Binary -offset 0x1F000 \
85 -o rom.bin -Binary
86
87Then, the flash image must be created by concatenating the images that are
88output from the build. To create the flash image, the following ``fiptool``
89command should be run. ``fiptool`` documentation can be found `here
Raef Coles00f1d202023-04-25 14:34:29 +010090<https://trustedfirmware-a.readthedocs.io/en/latest/getting_started/tools-build.html?highlight=fiptool#building-and-using-the-fip-tool>`_.
Raef Colescb866c32022-11-30 10:57:18 +000091Note that an up-to-date fiptool that supports the RSS UUIDs must be used.::
92
93 fiptool create \
94 --align 8192 --rss-bl2 bl2_signed.bin \
95 --align 8192 --rss-ns tfm_ns_signed.bin \
96 --align 8192 --rss-s tfm_s_signed.bin \
97 --align 8192 --rss-scp-bl1 <signed Host SCP BL1 image> \
98 --align 8192 --rss-ap-bl1 <signed Host AP BL1 image> \
99 fip.bin
100
101If you already have a ``fip.bin`` containing host firmware images, RSS FIP
102images can be patched in::
103
104 fiptool update --align 8192 --rss-bl2 bl2_signed.bin fip.bin
105 fiptool update --align 8192 --rss-ns tfm_ns.bin fip.bin
106 fiptool update --align 8192 --rss-s tfm_s.bin fip.bin
107
108If XIP mode is enabled, the following ``fiptool`` command should be run to
Raef Coles7763a472022-11-10 17:11:40 +0000109create the flash image::
110
Raef Colescb866c32022-11-30 10:57:18 +0000111 fiptool create \
112 --align 8192 --rss-bl2 bl2_signed.bin \
Raef Coles8dbcd572023-09-11 16:31:49 +0100113 --align 8192 --rss-ns tfm_ns_encrypted.bin \
114 --align 8192 --rss-s tfm_s_encrypted.bin \
Raef Colescb866c32022-11-30 10:57:18 +0000115 --align 8192 --rss-sic-tables-ns tfm_ns_sic_tables_signed.bin \
116 --align 8192 --rss-sic-tables-s tfm_s_sic_tables_signed.bin \
117 --align 8192 --rss-scp-bl1 <signed Host SCP BL1 image> \
118 --align 8192 --rss-ap-bl1 <signed Host AP BL1 image> \
119 fip.bin
Raef Coles45b4f2a2022-11-10 16:43:39 +0000120
Raef Colescb866c32022-11-30 10:57:18 +0000121Once the FIP is prepared, a host flash image can be created using ``srec_cat``::
Raef Coles45b4f2a2022-11-10 16:43:39 +0000122
123 srec_cat \
Raef Colescb866c32022-11-30 10:57:18 +0000124 fip.bin -Binary -offset 0x0 \
Raef Coles45b4f2a2022-11-10 16:43:39 +0000125 -o host_flash.bin -Binary
126
Raef Colescb866c32022-11-30 10:57:18 +0000127If GPT support is enabled, and a host ``fip.bin`` and ``fip_gpt.bin`` has been
128obtained, RSS images can be inserted by first patching the host FIP and then
129inserting that patched FIP into the GPT image::
130
131 sector_size=$(gdisk -l fip_gpt.bin | grep -i "sector size (logical):" | \
132 sed 's/.*logical): \([0-9]*\) bytes/\1/')
133
134 fip_label=" FIP_A$"
135 fip_start_sector=$(gdisk -l fip_gpt.bin | grep "$fip_label" | awk '{print $2}')
136 fip_sector_am=$(gdisk -l fip_gpt.bin | grep "$fip_label" | awk '{print $3 - $2}')
137
138 dd if=fip.bin of=fip_gpt.bin bs=$sector_size seek=$fip_start_sector \
139 count=$fip_sector_am conv=notrunc
140
141 fip_label = " FIP_B$"
142 fip_start_sector = $(gdisk -l fip_gpt.bin | grep "$fip_label" | awk '{print $2}')
143 fip_sector_am = $(gdisk -l fip_gpt.bin | grep "$fip_label" | awk '{print $3 - $2}')
144
145 dd if=fip.bin of=fip_gpt.bin bs=$sector_size seek=$fip_start_sector \
146 count=$fip_sector_am conv=notrunc
147
148To patch a ``fip_gpt.bin`` without having an initial ``fip.bin``, the FIP can be
149extracted from the GPT image using the following commands (and can then be
150patched and reinserted using the above commands)::
151
152 sector_size=$(gdisk -l fip_gpt.bin | grep -i "sector size (logical):" | \
153 sed 's/.*logical): \([0-9]*\) bytes/\1/')
154
155 fip_label=" FIP_A$"
156 fip_start_sector=$(gdisk -l fip_gpt.bin | grep "$fip_label" | awk '{print $2}')
157 fip_sector_am=$(gdisk -l fip_gpt.bin | grep "$fip_label" | awk '{print $3 - $2}')
158
159 dd if=fip_gpt.bin of=fip.bin bs=$sector_size skip=$fip_start_sector \
160 count=$fip_sector_am conv=notrunc
161
162Once the ``fip_gpt.bin`` is prepared, it is placed at the base of the host flash
163image::
164
165 srec_cat \
166 fip_gpt.bin -Binary -offset 0x0 \
167 -o host_flash.bin -Binary
Jamie Fox519cc4b2022-06-07 12:07:28 +0100168
Raef Coles078f6b02023-07-12 14:38:13 +0100169The RSS ROM binary should be placed in RSS ROM at ``0x11000000`` and the host
Raef Coles00f1d202023-04-25 14:34:29 +0100170flash binary should be placed at the base of the host flash. For the TC
171platform, this is at ``0x80000000``.
Jamie Fox519cc4b2022-06-07 12:07:28 +0100172
Jamie Foxd6aec212023-08-01 16:30:54 +0100173The RSS OTP must be provisioned. On a development platform with
174``TFM_DUMMY_PROVISIONING`` enabled, BL1_1 expects provisioning bundles to be
175preloaded into SRAM. Preload ``encrypted_cm_provisioning_bundle_0.bin`` to the
176base of VM0, and ``encrypted_dm_provisioning_bundle.bin`` to the base of VM1.
177
178If ``TFM_DUMMY_PROVISIONING`` is disabled and provisioning is required, then
179BL1_1 will first wait for the TP mode to be set by a debugger (setting the
180``tp_mode`` variable in the current stack frame is easiest). BL1_1 will then
181wait for provisioning bundles to be loaded to VM0 and VM1 in the same way as
182when ``TFM_DUMMY_PROVISIONING`` is enabled, except that it will not
183automatically perform the reset once each provisioning state is complete. For
184more details about provisioning flows, see
185:doc:`RSS provisioning </platform/arm/rss/rss_provisioning>`.
186
Jamie Fox519cc4b2022-06-07 12:07:28 +0100187--------------
188
Raef Coles7763a472022-11-10 17:11:40 +0000189*Copyright (c) 2022-2023, Arm Limited. All rights reserved.*