blob: c3bfba2ff28071f72870f8aa8ad4479885956171 [file] [log] [blame]
Galanakis, Minos41f85972019-09-30 15:56:40 +01001###########
2Secure boot
3###########
Gyorgy Szingdb9783c2019-04-17 21:08:48 +02004For secure devices it is security critical to enforce firmware authenticity to
5protect against execution of malicious software. This is implemented by building
6a trust chain where each step in the execution chain authenticates the next
7step before execution. The chain of trust in based on a "Root of Trust" which
8is implemented using asymmetric cryptography. The Root of Trust is a combination
9of an immutable bootloader and a public key (ROTPK).
10
Tamas Ban07a11a22019-09-23 13:54:15 +010011.. Warning::
12 In order to implement a proper chain of trust functionality, it is
13 mandatory that the first stage bootloader and ROTPK is stored in an
14 **immutable** way. To achieve this the bootloader code must be stored and
15 executed from ROM or such part of flash memory which supports write
16 protection. ROTPK can be stored in a one-time-programmable (OTP) memory. If
17 the SoC has a built-in BL1 (immutable) bootloader and the immutability of
18 TF-M secure boot code is not guaranteed then TF-M secure boot code must be
19 authenticated by BL1 bootloader before execution. If immutability of root
20 of trust (first stage bootloader + ROTPK) is not ensured then there is a
21 risk that the secure boot process could be bypassed, which could lead to
22 arbitrary code execution on the device. Current TF-M secure boot code is
23 intended to be a second stage bootloader, therefore it requires
24 authentication before execution. If TF-M secure boot code is used as a first
25 stage bootloader then it must be stored according to the above requirements.
26
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020027*******************************
28Second stage bootloader in TF-M
29*******************************
30To implement secure boot functionality an external project MCUBoot has been
31integrated to TF-M. For further information please refer to the
David Vincze8a2a4e22019-05-24 10:14:23 +020032`MCUBoot homepage <https://www.mcuboot.com/>`__. Original source-code is
33available at `GitHub <https://github.com/JuulLabs-OSS/mcuboot>`__. This document
34contains information about MCUBoot modifications and how MCUBoot has been
35integrated to TF-M.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020036
37Bootloader is started when CPU is released from reset. It runs in secure mode.
38It authenticates the firmware image by hash (SHA-256) and digital signature
David Vincze9c609012019-08-22 13:37:21 +020039(RSA-3072) validation. Public key, that the checks happens against, can be built
40into the bootloader image or can be provisioned to the SoC during manufacturing.
41Metadata of the image is delivered together with the image itself in a header
42and trailer section. In case of successful authentication, bootloader passes
43execution to the secure image. Execution never returns to bootloader until
44next reset.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020045
46A default RSA key pair is stored in the repository, public key is in ``keys.c``
Anton Komlevb8e3af02020-08-28 10:23:57 +010047and private key is in ``root-RSA-3072.pem``.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020048
David Vincze8a2a4e22019-05-24 10:14:23 +020049.. Warning::
50 DO NOT use them in production code, they are exclusively for testing!
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020051
52Private key must be stored in a safe place outside of the repository.
53``Imgtool.py`` can be used to generate new key pairs.
54
David Vincze9c609012019-08-22 13:37:21 +020055The bootloader can handle the secure and non-secure images independently
56(multiple image boot) or together (single image boot). In case of multiple image
57boot they are signed independently with different keys and they can be updated
58separately. In case of single image boot the secure and non-secure image is
59handled as a single blob, therefore they must be contiguous in the device
60memory. In this case they are signed together and also they can be updated only
61together. In order to have the same artefacts at the end of the build regardless
62of how the images are handled (independently or together) the images are always
63concatenated. In case of single image boot they are concatenated first and then
64signed. In case of multiple image boot they are separately signed first and then
65concatenated. Preparation of payload is done by Python scripts:
66``bl2/ext/mcuboot/scripts/``. At the end of a successful build the signed TF-M
Anton Komlevb8e3af02020-08-28 10:23:57 +010067payload can be found in: ``<build_dir>/bin/tfm_s_ns_signed.bin``
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020068
69*********************
70Integration with TF-M
71*********************
72MCUBoot assumes a predefined memory layout which is described below (applicable
David Vincze8bdfc2d2019-03-18 15:49:23 +010073for AN521). It is mandatory to define the primary slot and the secondary slot
David Vincze9c609012019-08-22 13:37:21 +020074partitions, but their size and location can be changed::
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020075
76 - 0x0000_0000 - 0x0007_FFFF: BL2 bootloader - MCUBoot
David Vincze8bdfc2d2019-03-18 15:49:23 +010077 - 0x0008_0000 - 0x000F_FFFF: Primary slot : Single binary blob:
78 Secure + Non-Secure image;
79 Primary memory partition
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020080 - 0x0008_0000 - 0x0008_03FF: Common image header
81 - 0x0008_0400 - 0x0008_xxxx: Secure image
82 - 0x0008_xxxx - 0x0010_03FF: Padding (with 0xFF)
83 - 0x0010_0400 - 0x0010_xxxx: Non-secure image
David Vincze9c609012019-08-22 13:37:21 +020084 - 0x0010_xxxx - 0x0010_xxxx: Hash value(SHA256), RSA signature and other
85 metadata of combined image
David Vincze8a2a4e22019-05-24 10:14:23 +020086
David Vincze8bdfc2d2019-03-18 15:49:23 +010087 - 0x0018_0000 - 0x0027_FFFF: Secondary slot : Secure + Non-Secure image;
88 Secondary memory partition, structured
89 identically to the primary slot
David Vincze9c609012019-08-22 13:37:21 +020090 - 0x0028_0000 - 0x0037_FFFF: Scratch area, only used during image
91 swapping
92
93Multiple image boot requires a slightly different layout::
94
95 - 0x0000_0000 - 0x0007_FFFF: BL2 bootloader - MCUBoot
96 - 0x0008_0000 - 0x000F_FFFF: Primary slot : Secure image
97 - 0x0008_0000 - 0x0008_03FF: Secure image header
98 - 0x0008_0400 - 0x000x_xxxx: Secure image
99 - 0x000x_xxxx - 0x000x_xxxx: Hash value(SHA256), RSA signature and other
100 metadata of secure image
101
102 - 0x0010_0000 - 0x0017_FFFF: Primary slot : Non-secure image
103 - 0x0010_0000 - 0x0010_03FF: Non-secure image header
104 - 0x0010_0400 - 0x001x_xxxx: Non-secure image
105 - 0x001x_xxxx - 0x001x_xxxx: Hash value(SHA256), RSA signature and other
106 metadata of non-secure image
107
108 - 0x0018_0000 - 0x001F_FFFF: Secondary slot : Secure image
109 - 0x0020_0000 - 0x0027_FFFF: Secondary slot : Non-secure image
110
111 - 0x0028_0000 - 0x002F_FFFF: Scratch area, only used during image
112 swapping, used for secure and non-secure
113 image as well
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200114
115**************************
116Firmware upgrade operation
117**************************
118MCUBoot handles only the firmware authenticity check after start-up and the
119firmware switch part of the firmware update process. Downloading the new version
David Vincze8a2a4e22019-05-24 10:14:23 +0200120of the firmware is out-of-scope for MCUBoot. MCUBoot supports three different
121ways to switch to the new firmware and it is assumed that firmware images are
122executed-in-place (XIP). The default behaviour is the overwrite-based image
David Vincze8bdfc2d2019-03-18 15:49:23 +0100123upgrade. In this case the active firmware is always executed from the primary
124slot and the secondary slot is a staging area for new images. Before executing
125the new firmware image, the content of the primary slot must be overwritten with
126the content of the secondary slot (the new firmware image). The second option is
127the image swapping strategy when the content of the two memory slots must be
128physically swapped. This needs the scratch area to be defined in the memory
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100129layout. The third option is the direct execute-in-place version, which
130eliminates the complexity of image swapping and its administration. Active image
131can be executed from either memory slot, but new firmware must be linked to the
132address space of the proper (currently inactive) memory slot.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200133
David Vincze8a2a4e22019-05-24 10:14:23 +0200134Overwrite operation
Tamas Bane7efdc62019-06-05 13:14:52 +0100135===================
David Vincze8bdfc2d2019-03-18 15:49:23 +0100136Active image is stored in the primary slot, and this image is started always by
137the bootloader. Therefore images must be linked to the primary slot. If the
138bootloader finds a valid image in the secondary slot, which is marked for
139upgrade, then the content of the primary slot will be simply overwritten with
140the content of the secondary slot, before starting the new image from the
141primary slot. After the content of the primary slot has been successfully
142overwritten, the header and trailer of the new image in the secondary slot is
David Vincze9c609012019-08-22 13:37:21 +0200143erased to prevent the triggering of another unnecessary image upgrade after a
David Vincze8bdfc2d2019-03-18 15:49:23 +0100144restart. The overwrite operation is fail-safe and resistant to power-cut
145failures. For more details please refer to the MCUBoot
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200146`documentation <https://www.mcuboot.com/mcuboot/design.html>`__.
147
David Vincze8a2a4e22019-05-24 10:14:23 +0200148Swapping operation
149==================
150This operation can be set with the ``MCUBOOT_UPGRADE_STRATEGY`` compile time
151switch (see `Build time configuration`_). With swapping image upgrade strategy
David Vincze8bdfc2d2019-03-18 15:49:23 +0100152the active image is also stored in the primary slot and it will always be
153started by the bootloader. If the bootloader finds a valid image in the
154secondary slot, which is marked for upgrade, then contents of the primary slot
155and the secondary slot will be swapped, before starting the new image from the
156primary slot. Scratch area is used as a temporary storage place during image
157swapping. Update mark from the secondary slot is removed when the swapping is
David Vincze8a2a4e22019-05-24 10:14:23 +0200158successful. The boot loader can revert the swapping as a fall-back mechanism to
159recover the previous working firmware version after a faulty update. The swap
160operation is fail-safe and resistant to power-cut failures. For more details
161please refer to the MCUBoot
162`documentation <https://www.mcuboot.com/mcuboot/design.html>`__.
163
164.. Note::
165
166 After a successful image upgrade the firmware can mark itself as "OK" at
167 runtime by setting the image_ok flag in the flash. When this happens, the
168 swap is made "permanent" and MCUBoot will then still choose to run it
169 during the next boot. Currently TF-M does not set the image_ok flag,
170 therefore the bootloader will always perform a "revert" (swap the images
171 back) during the next boot.
172
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100173Direct execute-in-place operation
174=================================
David Vincze8a2a4e22019-05-24 10:14:23 +0200175This operation can be set with the ``MCUBOOT_UPGRADE_STRATEGY`` compile time
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100176switch (see `Build time configuration`_). When enabling direct-xip operation
David Vincze8a2a4e22019-05-24 10:14:23 +0200177then the active image flag is moved between slots during firmware upgrade. If
178firmware is executed-in-place (XIP), then two firmware images must be generated.
David Vincze8bdfc2d2019-03-18 15:49:23 +0100179One of them is linked to be executed from the primary slot memory region and the
180other from the secondary slot. The firmware upgrade client, which downloads the
181new image, must be aware, which slot hosts the active firmware and which acts as
182a staging area and it is responsible for downloading the proper firmware image.
183At boot time MCUBoot inspects the version number in the image header and passes
184execution to the newer firmware version. New image must be marked for upgrade
185which is automatically done by Python scripts at compile time. Image
186verification is done the same way in all operational modes. If new image fails
187during authentication then MCUBoot erases the memory slot and starts the other
188image, after successful authentication.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200189
Anton Komlevb8e3af02020-08-28 10:23:57 +0100190To select which slot the image is to be executed from, set
191``MCUBOOT_EXECUTION_SLOT`` to the desired index. It is suggested that you create
192two build directories when building images using this mode, as intermediate
193dependencies cannot be reused due to changes in the flash layout.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200194
David Vincze9c609012019-08-22 13:37:21 +0200195.. Note::
196
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100197 Only single image boot is supported with direct-xip upgrade mode.
David Vincze9c609012019-08-22 13:37:21 +0200198
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200199RAM Loading firmware upgrade
200============================
David Vincze8a2a4e22019-05-24 10:14:23 +0200201Musca-A supports an image upgrade mode that is separate to the other (overwrite,
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100202swapping and dirext-xip) modes. This is the ``RAM loading`` mode (please refer
203to the table below). Like the direct-xip mode, this selects the newest image
David Vincze8a2a4e22019-05-24 10:14:23 +0200204by reading the image version numbers in the image headers, but instead of
205executing it in place, the newest image is copied to RAM for execution. The load
206address, the location in RAM where the image is copied to, is stored in the
207image header.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200208
David Vincze9c609012019-08-22 13:37:21 +0200209.. Note::
210
211 Only single image boot is supported with RAM loading upgrade mode.
212
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200213Summary of different modes for image upgrade
214============================================
215Different implementations of the image upgrade operation (whether through
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100216overwriting, swapping, direct-xip or loading into RAM and executing from
David Vincze8a2a4e22019-05-24 10:14:23 +0200217there) are supported by the platforms. The table below shows which of these
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200218modes are supported by which platforms:
219
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100220+---------------------+-----------------+-------------------------------------------------------------+
221| | Without BL2 [1]_| With BL2 [2]_ |
222+=====================+=================+===============+==========+================+=================+
223| | XIP | XIP | XIP | XIP | Not XIP |
224+---------------------+-----------------+---------------+----------+----------------+-----------------+
225| | | Overwrite [3]_| Swap [4]_| direct-xip [5]_| RAM loading [6]_|
226+---------------------+-----------------+---------------+----------+----------------+-----------------+
227| AN521 | Yes | Yes | Yes | Yes | No |
228+---------------------+-----------------+---------------+----------+----------------+-----------------+
229| AN519 | Yes | Yes | Yes | Yes | No |
230+---------------------+-----------------+---------------+----------+----------------+-----------------+
231| AN539 | Yes | Yes | Yes | Yes | No |
232+---------------------+-----------------+---------------+----------+----------------+-----------------+
233| FVP_SSE300_MPS2 | NO | Yes | Yes | Yes | No |
234+---------------------+-----------------+---------------+----------+----------------+-----------------+
235| LPC55S69 | No | No | No | No | No |
236+---------------------+-----------------+---------------+----------+----------------+-----------------+
237| Musca-A | No | No | No | No | Yes |
238+---------------------+-----------------+---------------+----------+----------------+-----------------+
239| Musca-B1 | Yes | Yes | Yes | Yes | No |
240+---------------------+-----------------+---------------+----------+----------------+-----------------+
241| Musca-S1 | Yes | Yes | Yes | Yes | No |
242+---------------------+-----------------+---------------+----------+----------------+-----------------+
243| AN524 | Yes | No | No | Yes | No |
244+---------------------+-----------------+---------------+----------+----------------+-----------------+
245| PSoC64 | Yes | No | No | No | No |
246+---------------------+-----------------+---------------+----------+----------------+-----------------+
247| SSE-200_AWS | Yes | Yes | Yes | Yes | No |
248+---------------------+-----------------+---------------+----------+----------------+-----------------+
249| STM_DISCO_L562QE | No | Yes | No | No | No |
250+---------------------+-----------------+---------------+----------+----------------+-----------------+
251| STM_NUCLEO_L552ZE_Q | No | Yes | No | No | No |
252+---------------------+-----------------+---------------+----------+----------------+-----------------+
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200253
Anton Komlevb8e3af02020-08-28 10:23:57 +0100254.. [1] To disable BL2, please set the ``BL2`` cmake option to ``OFF``
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200255
256.. [2] BL2 is enabled by default
257
David Vincze8a2a4e22019-05-24 10:14:23 +0200258.. [3] The image executes in-place (XIP) and is in Overwrite mode for image
259 update by default
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200260
David Vincze8a2a4e22019-05-24 10:14:23 +0200261.. [4] To enable XIP Swap mode, assign the "SWAP" string to the
David Vincze9c609012019-08-22 13:37:21 +0200262 ``MCUBOOT_UPGRADE_STRATEGY`` configuration variable in the build
David Vincze8a2a4e22019-05-24 10:14:23 +0200263 configuration file, or include this macro definition in the command line
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200264
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100265.. [5] To enable direct-xip, assign the "DIRECT_XIP" string to the
David Vincze9c609012019-08-22 13:37:21 +0200266 ``MCUBOOT_UPGRADE_STRATEGY`` configuration variable in the build
David Vincze8a2a4e22019-05-24 10:14:23 +0200267 configuration file, or include this macro definition in the command line
268
269.. [6] To enable RAM loading, assign the "RAM_LOADING" string to the
David Vincze9c609012019-08-22 13:37:21 +0200270 ``MCUBOOT_UPGRADE_STRATEGY`` configuration variable in the build
David Vincze8a2a4e22019-05-24 10:14:23 +0200271 configuration file, or include this macro definition in the command line
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200272
Balint Matyif0873cd2020-06-09 14:03:47 +0100273*******
274MCUBoot
275*******
276By default, the original MCUBoot from
277`GitHub <https://github.com/JuulLabs-OSS/mcuboot>`__ is used as the bootloader
Anton Komlevb8e3af02020-08-28 10:23:57 +0100278in TF-M. The repository will be automatically downloaded by cmake. The version
279downloaded can be controlled by the ``MCUBOOT_VERSION`` cmake variable. If you
280wish to use a locally downloaded copy, the cmake variable ``MCUBOOT_PATH`` can
281be set to its location.
David Vinczec3e313a2020-01-06 17:31:11 +0100282
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100283Upstream MCUboot does not support the ``direct-xip`` and ``RAM loading`` upgrade
Anton Komlevb8e3af02020-08-28 10:23:57 +0100284strategies, therefore the platforms that don't support other upgrade strategies
285(e.g. ``Overwrite``) cannot be used with the original MCUBoot at the moment. To
286use the TF-M project's fork, set the ``TFM_INTERNAL_MCUBOOT`` cmake variable to
287``ON``.
Balint Matyif0873cd2020-06-09 14:03:47 +0100288
David Vincze9c609012019-08-22 13:37:21 +0200289*******************
290Multiple image boot
291*******************
292It is possible to update the firmware images independently to support the
293scenario when secure and non-secure images are provided by different vendors.
294Multiple image boot is supported only together with the overwrite and swap
295firmware upgrade modes.
296
297It is possible to describe the dependencies of the images on each other in
298order to avoid a faulty upgrade when incompatible versions would be installed.
299These dependencies are part of the image manifest area.
300The dependencies are composed from two parts:
301
302 - **Image identifier:** The number of the image which the current image (whose
303 manifest area contains the dependency entry) depends on. The image identifier
304 starts from 0.
305
306 - **Minimum version:** The minimum version of other image must be present on
307 the device by the end of the upgrade (both images might be updated at the
308 same time).
309
310Dependencies can be added to the images at compile time with the following
311compile time switches:
312
Anton Komlevb8e3af02020-08-28 10:23:57 +0100313 - ``MCUBOOT_S_IMAGE_MIN_VER`` It is added to the non-secure image and specifies the
David Vincze9c609012019-08-22 13:37:21 +0200314 minimum required version of the secure image.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100315 - ``MCUBOOT_NS_IMAGE_MIN_VER`` It is added to the secure image and specifies the
David Vincze9c609012019-08-22 13:37:21 +0200316 minimum required version of the non-secure image.
317
318Example of how to provide the secure image minimum version::
319
Anton Komlevb8e3af02020-08-28 10:23:57 +0100320 cmake -DTFM_PLATFORM=musca_b1 -DCMAKE_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DMCUBOOT_S_IMAGE_MIN_VER=1.2.3+4 ..
David Vincze9c609012019-08-22 13:37:21 +0200321
Tamas Ban7801ed42019-05-20 13:21:53 +0100322********************
323Signature algorithms
324********************
325MbedTLS library is used to sign the images. The list of supported signing
326algorithms:
Tamas Bane7efdc62019-06-05 13:14:52 +0100327
328 - `RSA-2048`
329 - `RSA-3072`: default
330
David Vincze9c609012019-08-22 13:37:21 +0200331Example keys stored in:
332
Anton Komlevb8e3af02020-08-28 10:23:57 +0100333 - ``root-RSA-2048.pem`` : Used to sign single image (S+NS) or secure image
David Vincze9c609012019-08-22 13:37:21 +0200334 in case of multiple image boot
Anton Komlevb8e3af02020-08-28 10:23:57 +0100335 - ``root-RSA-2048_1.pem`` : Used to sign non-secure image in case of multiple
David Vincze9c609012019-08-22 13:37:21 +0200336 image boot
Anton Komlevb8e3af02020-08-28 10:23:57 +0100337 - ``root-RSA-3072.pem`` : Used to sign single image (S+NS) or secure image
David Vincze9c609012019-08-22 13:37:21 +0200338 in case of multiple image boot
Anton Komlevb8e3af02020-08-28 10:23:57 +0100339 - ``root-RSA-3072_1.pem`` : Used to sign non-secure image in case of multiple
David Vincze9c609012019-08-22 13:37:21 +0200340 image boot
Tamas Ban7801ed42019-05-20 13:21:53 +0100341
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200342************************
343Build time configuration
344************************
Anton Komlevb8e3af02020-08-28 10:23:57 +0100345MCUBoot related compile time switches can be set by cmake variables.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200346
347- BL2 (default: True):
348 - **True:** TF-M built together with bootloader. MCUBoot is executed after
349 reset and it authenticates TF-M and starts secure code.
350 - **False:** TF-M built without bootloader. Secure image linked to the
351 beginning of the device memory and executed after reset. If it is false
David Vincze9c609012019-08-22 13:37:21 +0200352 then using any of the further compile time switches is invalid.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100353- TFM_INTERNAL_MCUBOOT (default: False):
354 - **"True":** Use TF-M's MCUBoot fork as bootloader which is located in the
David Vinczec3e313a2020-01-06 17:31:11 +0100355 bl2/ext/mcuboot folder.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100356 - **"False":** Use the original (upstream) MCUBoot as bootloader. Before
Balint Matyif0873cd2020-06-09 14:03:47 +0100357 selecting this option please read the `MCUBoot`_ section for more
358 information and the limitations of using this option.
David Vincze8a2a4e22019-05-24 10:14:23 +0200359- MCUBOOT_UPGRADE_STRATEGY (default: "OVERWRITE_ONLY"):
360 - **"OVERWRITE_ONLY":** Default firmware upgrade operation with overwrite.
361 - **"SWAP":** Activate swapping firmware upgrade operation.
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100362 - **"DIRECT_XIP":** Activate direct execute-in-place firmware upgrade
363 operation.
David Vincze8a2a4e22019-05-24 10:14:23 +0200364 - **"RAM_LOADING":** Activate RAM loading firmware upgrade operation, where
David Vincze9c609012019-08-22 13:37:21 +0200365 the latest image is copied to RAM and runs from there instead of being
David Vincze8a2a4e22019-05-24 10:14:23 +0200366 executed in-place.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100367- MCUBOOT_SIGNATURE_TYPE (default: RSA):
368 - **RSA:** Image is signed with RSA algorithm
369- MCUBOOT_SIGNATURE_KEY_LEN (default: 3072):
370 - **2048:** Image is signed with 2048 bit key.
371 - **3072:** Image is signed with 3072 bit key.
David Vincze9c609012019-08-22 13:37:21 +0200372- MCUBOOT_IMAGE_NUMBER (default: 2):
373 - **1:** Single image boot, secure and non-secure images are signed and
374 updated together.
375 - **2:** Multiple image boot, secure and non-secure images are signed and
376 updatable independently.
377- MCUBOOT_HW_KEY (default: True):
378 - **True:** The hash of public key is provisioned to the SoC and the image
Anton Komlevb8e3af02020-08-28 10:23:57 +0100379 manifest contains the whole public key (imgtool uses
380 ``--public_key_format=full``). MCUBoot validates the key before using it
381 for firmware authentication, it calculates the hash of public key from the
382 manifest and compare against the retrieved key-hash from the hardware.
383 This way MCUBoot is independent from the public key(s). Key(s) can be
384 provisioned any time and by different parties.
David Vincze9c609012019-08-22 13:37:21 +0200385 - **False:** The whole public key is embedded to the bootloader code and the
Anton Komlevb8e3af02020-08-28 10:23:57 +0100386 image manifest contains only the hash of the public key (imgtool uses
387 ``--public_key_format=hash``). MCUBoot validates the key before using it
388 for firmware authentication, it calculates the hash of built-in public key
389 and compare against the retrieved key-hash from the image manifest. After
390 this the bootloader can verify that the image was signed with a private
391 key that corresponds to the retrieved key-hash (it can have more public
392 keys embedded in and it may have to look for the matching one). All the
393 public key(s) must be known at MCUBoot build time.
David Vincze73dfbc52019-10-11 13:54:58 +0200394- MCUBOOT_LOG_LEVEL:
395 Can be used to configure the level of logging in MCUBoot. The possible
396 values are the following:
397
398 - **LOG_LEVEL_OFF**
399 - **LOG_LEVEL_ERROR**
400 - **LOG_LEVEL_WARNING**
401 - **LOG_LEVEL_INFO**
402 - **LOG_LEVEL_DEBUG**
403
404 The logging in MCUBoot can be disabled and thus the code size can be reduced
405 by setting it to ``LOG_LEVEL_OFF``. Its value depends on the build type. If
406 the build type is ``Debug`` and a value has been provided (e.g. through the
407 command line or the CMake GUI) then that value will be used, otherwise it is
408 ``LOG_LEVEL_INFO`` by default. In case of different kinds of ``Release``
409 builds its value is set to ``LOG_LEVEL_OFF`` (any other value will be
410 overridden).
Anton Komlevb8e3af02020-08-28 10:23:57 +0100411- MCUBOOT_ENC_IMAGES (default: False):
Balint Matyi5c476312020-03-31 13:15:39 +0100412 - **True:** Adds encrypted image support in the source and encrypts the
413 resulting image using the ``enc-rsa2048-pub.pem`` key found in the MCUBoot
414 repository.
415 - **False:** Doesn't add encrypted image support and doesn't encrypt the
416 image.
417
Balint Matyifb7e60f2020-07-27 10:06:44 +0100418 .. Note::
419 The decryption takes place during the upgrade process, when the images
420 are being moved between the slots. This means that boards that don't
421 already have an image on them with MCUBoot that has been compiled with
422 ``MCUBOOT_ENCRYPT_RSA`` enabled need special treatment. In order to load
423 an encrypted image to such boards, an upgrade needs to be executed. This
424 can be done by using MCUBoot, putting an image in the secondary image
425 area, and setting ``MCUBOOT_ENCRYPT_RSA`` to ``ON``. When using the
426 ``OVERWRITE_ONLY`` upgrade strategy, this is enough. When using
427 ``SWAP``, an image is needed in the primary image area as well, to
428 trigger the update.
429
Balint Matyi5c476312020-03-31 13:15:39 +0100430 .. Warning::
Balint Matyifb7e60f2020-07-27 10:06:44 +0100431 DO NOT use the ``enc-rsa2048-pub.pem`` key in production code, it is
432 exclusively for testing!
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200433
434Image versioning
435================
David Vincze9c609012019-08-22 13:37:21 +0200436An image version number is written to its header by one of the Python scripts,
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100437and this number is used by the bootloader when the direct execute-in-place or
438the RAM loading mode is enabled. It is also used in case of multiple image boot
439when the bootloader checks the image dependencies if any have been added to the
440images.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200441
David Vincze9c609012019-08-22 13:37:21 +0200442The version number of the image (single image boot) can manually be passed in
443through the command line in the cmake configuration step::
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200444
Anton Komlevb8e3af02020-08-28 10:23:57 +0100445 cmake -DTFM_PLATFORM=musca_b1 -DCMAKE_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DIMAGE_VERSION_S=1.2.3+4 ..
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200446
447Alternatively, the version number can be less specific (e.g 1, 1.2, or 1.2.3),
448where the missing numbers are automatically set to zero. The image version
449number argument is optional, and if it is left out, then the version numbers of
450the image(s) being built in the same directory will automatically change. In
451this case, the last component (the build number) automatically increments from
452the previous one: 0.0.0+1 -> 0.0.0+2, for as many times as the build is re-ran,
453**until a number is explicitly provided**. If automatic versioning is in place
454and then an image version number is provided for the first time, the new number
455will take precedence and be used instead. All subsequent image versions are
456then set to the last number that has been specified, and the build number would
457stop incrementing. Any new version numbers that are provided will overwrite
458the previous one: 0.0.0+1 -> 0.0.0+2. Note: To re-apply automatic image
459versioning, please start a clean build without specifying the image version
David Vincze9c609012019-08-22 13:37:21 +0200460number at all. In case of multiple image boot there are separate compile time
461switches for both images to provide their version: ``IMAGE_VERSION_S`` and
Anton Komlevb8e3af02020-08-28 10:23:57 +0100462``IMAGE_VERSION_NS``. These must be used instead of ``IMAGE_VERSION_S``.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200463
David Vincze060968d2019-05-23 01:13:14 +0200464Security counter
465================
466Each signed image contains a security counter in its manifest. It is used by the
467bootloader and its aim is to have an independent (from the image version)
468counter to ensure rollback protection by comparing the new image's security
469counter against the original (currently active) image's security counter during
470the image upgrade process. It is added to the manifest (to the TLV area that is
David Vincze9c609012019-08-22 13:37:21 +0200471appended to the end of the image) by one of the Python scripts when signing the
David Vincze060968d2019-05-23 01:13:14 +0200472image. The value of the security counter is security critical data and it is in
David Vincze9c609012019-08-22 13:37:21 +0200473the integrity protected part of the image. The last valid security counter
474should always be stored in a non-volatile and trusted component of the device
475and its value should always be increased if a security flaw was fixed in the
476current image version. The value of the security counter (single image boot) can
477be specified at build time in the cmake configuration step::
David Vincze060968d2019-05-23 01:13:14 +0200478
Anton Komlevb8e3af02020-08-28 10:23:57 +0100479 cmake -DTFM_PLATFORM=musca_b1 -DCMAKE_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DSECURITY_COUNTER_S=42 ../
David Vincze060968d2019-05-23 01:13:14 +0200480
481The security counter can be independent from the image version, but not
482necessarily. Alternatively, if it is not specified at build time with the
David Vincze9c609012019-08-22 13:37:21 +0200483``SECURITY_COUNTER`` option the Python script will automatically generate it
David Vincze060968d2019-05-23 01:13:14 +0200484from the image version number (not including the build number) and this value
David Vincze9c609012019-08-22 13:37:21 +0200485will be added to the signed image. In case of multiple image boot there are
486separate compile time switches for both images to provide their security counter
487value: ``SECURITY_COUNTER_S`` and ``SECURITY_COUNTER_NS``. These must be used
Anton Komlevb8e3af02020-08-28 10:23:57 +0100488instead of ``SECURITY_COUNTER_S``. If these are not defined then the security
David Vincze9c609012019-08-22 13:37:21 +0200489counter values will be derived from the corresponding image version similar to
490the single image boot.
491
492***************************
493Signing the images manually
494***************************
495Normally the build system handles the signing (computing hash over the image
496and security critical manifest data and then signing the hash) of the firmware
497images. However, the images also can be signed manually by using the ``imgtool``
498Python program which is located in the ``bl2/ext/mcuboot/scripts`` directory.
499Issue the ``python3 imgtool.py sign --help`` command in the directory for more
500information about the mandatory and optional arguments. The tool takes an image
501in binary or Intel Hex format and adds a header and trailer that MCUBoot is
502expecting. In case of single image boot after a successful build the
Anton Komlevb8e3af02020-08-28 10:23:57 +0100503``tfm_s_ns.bin`` build artifact (contains the concatenated secure and non-secure
David Vincze9c609012019-08-22 13:37:21 +0200504images) must be passed to the script and in case of multiple image boot the
505``tfm_s.bin`` and ``tfm_ns.bin`` binaries can be passed to prepare the signed
506images.
507
508Signing the secure image manually in case of multiple image boot
509================================================================
510
511::
512
513 python3 bl2/ext/mcuboot/scripts/imgtool.py sign \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100514 --layout <build_dir>/bl2/ext/mcuboot/CMakeFiles/signing_layout_s.dir/signing_layout_s.c.obj \
515 -k <tfm_dir>/bl2/ext/mcuboot/root-RSA-3072.pem \
David Vincze9c609012019-08-22 13:37:21 +0200516 --public-key-format full \
517 --align 1 \
518 -v 1.2.3+4 \
519 -d "(1,1.2.3+0)" \
520 -s 42 \
521 -H 0x400 \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100522 <build_dir>/bin/tfm_s.bin \
523 <build_dir>/bin/tfm_s_signed.bin
David Vincze060968d2019-05-23 01:13:14 +0200524
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200525************************
526Testing firmware upgrade
527************************
528As downloading the new firmware image is out of scope for MCUBoot, the update
529process is started from a state where the original and the new image are already
530programmed to the appropriate memory slots. To generate the original and a new
531firmware package, TF-M is built twice with different build configurations.
532
David Vincze8a2a4e22019-05-24 10:14:23 +0200533Overwriting firmware upgrade
Tamas Bane7efdc62019-06-05 13:14:52 +0100534============================
David Vincze9c609012019-08-22 13:37:21 +0200535Run TF-M build twice with ``MCUBOOT_IMAGE_NUMBER`` set to "1" in both cases
536(single image boot), but with two different build configurations: default and
David Vincze8a2a4e22019-05-24 10:14:23 +0200537regression. Save the artifacts between builds, because second run can overwrite
David Vincze8bdfc2d2019-03-18 15:49:23 +0100538original binaries. Download default build to the primary slot and regression
539build to the secondary slot.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200540
541Executing firmware upgrade on FVP_MPS2_AEMv8M
542---------------------------------------------
543.. code-block:: bash
544
545 <DS5_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \
546 --parameter fvp_mps2.platform_type=2 \
547 --parameter cpu0.baseline=0 \
548 --parameter cpu0.INITVTOR_S=0x10000000 \
549 --parameter cpu0.semihosting-enable=0 \
550 --parameter fvp_mps2.DISABLE_GATING=0 \
551 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
552 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
553 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
554 --parameter fvp_mps2.telnetterminal0.quiet=0 \
555 --parameter fvp_mps2.telnetterminal1.quiet=1 \
556 --parameter fvp_mps2.telnetterminal2.quiet=1 \
557 --application cpu0=<build_dir>/bl2/ext/mcuboot/mcuboot.axf \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100558 --data cpu0=<default_build_dir>/bin/tfm_s_ns_signed.bin@0x10080000 \
559 --data cpu0=<regresssion_build_dir>/bin/tfm_s_ns_signed.bin@0x10180000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200560
561Executing firmware upgrade on SSE 200 FPGA on MPS2 board
562--------------------------------------------------------
563
564::
565
566 TITLE: Versatile Express Images Configuration File
567 [IMAGES]
568 TOTALIMAGES: 3 ;Number of Images (Max: 32)
569 IMAGE0ADDRESS: 0x00000000
570 IMAGE0FILE: \Software\mcuboot.axf ; BL2 bootloader
571 IMAGE1ADDRESS: 0x10080000
David Vincze8a2a4e22019-05-24 10:14:23 +0200572 IMAGE1FILE: \Software\tfm_sig1.bin ; TF-M default test binary blob
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200573 IMAGE2ADDRESS: 0x10180000
574 IMAGE2FILE: \Software\tfm_sig2.bin ; TF-M regression test binary blob
575
David Vincze8a2a4e22019-05-24 10:14:23 +0200576The following message will be shown in case of successful firmware upgrade:
577
578::
579
580 [INF] Starting bootloader
581 [INF] Swap type: test
David Vincze8bdfc2d2019-03-18 15:49:23 +0100582 [INF] Image upgrade secondary slot -> primary slot
583 [INF] Erasing the primary slot
584 [INF] Copying the secondary slot to the primary slot: 0x100000 bytes
David Vincze8a2a4e22019-05-24 10:14:23 +0200585 [INF] Bootloader chainload address offset: 0x80000
586 [INF] Jumping to the first image slot
587 [Sec Thread] Secure image initializing!
588
589 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800590 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze8a2a4e22019-05-24 10:14:23 +0200591 ...
592
David Vincze9c609012019-08-22 13:37:21 +0200593To update the secure and non-secure images separately (multiple image boot),
594set the ``MCUBOOT_IMAGE_NUMBER`` switch to "2" (this is the default
595configuration value) and follow the same instructions as in case of single image
596boot.
597
598Executing multiple firmware upgrades on SSE 200 FPGA on MPS2 board
599------------------------------------------------------------------
600
601::
602
603 TITLE: Versatile Express Images Configuration File
604 [IMAGES]
605 TOTALIMAGES: 4 ;Number of Images (Max: 32)
606 IMAGE0ADDRESS: 0x00000000
607 IMAGE0FILE: \Software\mcuboot.axf ; BL2 bootloader
608 IMAGE1ADDRESS: 0x10080000
609 IMAGE1FILE: \Software\tfm_sign.bin ; TF-M default test binary blob
610 IMAGE2ADDRESS: 0x10180000
611 IMAGE2FILE: \Software\tfm_ss1.bin ; TF-M regression test secure (signed) image
612 IMAGE3ADDRESS: 0x10200000
613 IMAGE3FILE: \Software\tfm_nss1.bin ; TF-M regression test non-secure (signed) image
614
615Note that both the concatenated binary blob (the images are signed separately
616and then concatenated) and the separate signed images can be downloaded to the
617device because on this platform (AN521) both the primary slots and the secondary
618slots are contiguous areas in the Flash (see `Integration with TF-M`_). The
619following message will be shown in case of successful firmware upgrades:
620
621::
622
623 [INF] Starting bootloader
624 [INF] Swap type: test
625 [INF] Swap type: test
626 [INF] Image upgrade secondary slot -> primary slot
627 [INF] Erasing the primary slot
628 [INF] Copying the secondary slot to the primary slot: 0x80000 bytes
629 [INF] Image upgrade secondary slot -> primary slot
630 [INF] Erasing the primary slot
631 [INF] Copying the secondary slot to the primary slot: 0x80000 bytes
632 [INF] Bootloader chainload address offset: 0x80000
633 [INF] Jumping to the first image slot
634 [Sec Thread] Secure image initializing!
635 TFM level is: 1
636 [Sec Thread] Jumping to non-secure code...
637
638 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800639 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze9c609012019-08-22 13:37:21 +0200640 ...
641
David Vincze8a2a4e22019-05-24 10:14:23 +0200642Swapping firmware upgrade
643=============================
644Follow the same instructions and platform related configurations as in case of
645overwriting build including these changes:
646
David Vincze9c609012019-08-22 13:37:21 +0200647- Set the ``MCUBOOT_UPGRADE_STRATEGY`` compile time switch to "SWAP"
648 before build.
649- Set the ``MCUBOOT_IMAGE_NUMBER`` compile time switch to "1" (single image
650 boot) or "2" (multiple image boot) before build.
David Vincze8a2a4e22019-05-24 10:14:23 +0200651
David Vincze9c609012019-08-22 13:37:21 +0200652During single image boot the following message will be shown in case of
653successful firmware upgrade, ``Swap type: test`` indicates that images were
654swapped:
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200655
656::
657
David Vincze8a2a4e22019-05-24 10:14:23 +0200658 [INF] Starting bootloader
659 [INF] Image 0: magic= good, copy_done=0x3, image_ok=0x3
660 [INF] Scratch: magic= bad, copy_done=0x0, image_ok=0x2
David Vincze8bdfc2d2019-03-18 15:49:23 +0100661 [INF] Boot source: primary slot
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200662 [INF] Swap type: test
663 [INF] Bootloader chainload address offset: 0x80000
664 [INF] Jumping to the first image slot
665 [Sec Thread] Secure image initializing!
666
David Vincze8a2a4e22019-05-24 10:14:23 +0200667 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800668 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze8a2a4e22019-05-24 10:14:23 +0200669 ...
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200670
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100671Direct execute-in-place firmware upgrade
672========================================
David Vincze9c609012019-08-22 13:37:21 +0200673Follow the same instructions and platform related configurations as in case of
674overwriting build including these changes:
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200675
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100676- Set the ``MCUBOOT_UPGRADE_STRATEGY`` compile time switch to "DIRECT_XIP"
David Vincze8a2a4e22019-05-24 10:14:23 +0200677 before build.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100678- set ``MCUBOOT_EXECUTION_SLOT`` to ``1`` in the regression build dir.
David Vincze9c609012019-08-22 13:37:21 +0200679- Make sure the image version number was increased between the two build runs
680 either by specifying it manually or by checking in the build log that it was
681 incremented automatically.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200682
683Executing firmware upgrade on FVP_MPS2_AEMv8M
684---------------------------------------------
685
686.. code-block:: bash
687
688 <DS5_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \
689 --parameter fvp_mps2.platform_type=2 \
690 --parameter cpu0.baseline=0 \
691 --parameter cpu0.INITVTOR_S=0x10000000 \
692 --parameter cpu0.semihosting-enable=0 \
693 --parameter fvp_mps2.DISABLE_GATING=0 \
694 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
695 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
696 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
697 --parameter fvp_mps2.telnetterminal0.quiet=0 \
698 --parameter fvp_mps2.telnetterminal1.quiet=1 \
699 --parameter fvp_mps2.telnetterminal2.quiet=1 \
700 --application cpu0=<build_dir>/bl2/ext/mcuboot/mcuboot.axf \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100701 --data cpu0=<default_build_dir>/bin/tfm_s_ns_signed.bin@0x10080000 \
702 --data cpu0=<regresssion_build_dir>/bin/tfm_s_ns_signed.bin@0x10180000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200703
704Executing firmware upgrade on SSE 200 FPGA on MPS2 board
705--------------------------------------------------------
706
707::
708
709 TITLE: Versatile Express Images Configuration File
710 [IMAGES]
711 TOTALIMAGES: 3 ;Number of Images (Max: 32)
712 IMAGE0ADDRESS: 0x00000000
713 IMAGE0FILE: \Software\mcuboot.axf ; BL2 bootloader
714 IMAGE1ADDRESS: 0x10080000
Tamas Banbba85642019-06-06 09:31:59 +0100715 IMAGE1FILE: \Software\tfm_sign.bin ; TF-M default test binary blob
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200716 IMAGE2ADDRESS: 0x10180000
717 IMAGE2FILE: \Software\tfm_sig1.bin ; TF-M regression test binary blob
718
Balint Matyi6844e442020-04-22 07:24:40 +0100719Executing firmware upgrade on Musca-B1 and Musca-S1 boards
720----------------------------------------------------------
David Vincze9c609012019-08-22 13:37:21 +0200721After the two images have been built, they can be concatenated to create the
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200722combined image using ``srec_cat``:
723
724- Linux::
David Vincze8a2a4e22019-05-24 10:14:23 +0200725
Tamas Bane1570bd2019-10-25 15:20:35 +0100726 srec_cat bl2/ext/mcuboot/mcuboot.bin -Binary -offset 0xA000000 tfm_sign.bin -Binary -offset 0xA020000 tfm_sign_1.bin -Binary -offset 0xA100000 -o tfm.hex -Intel
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200727
728- Windows::
David Vincze8a2a4e22019-05-24 10:14:23 +0200729
Tamas Bane1570bd2019-10-25 15:20:35 +0100730 srec_cat.exe bl2\ext\mcuboot\mcuboot.bin -Binary -offset 0xA000000 tfm_sign.bin -Binary -offset 0xA020000 tfm_sign_1.bin -Binary -offset 0xA100000 -o tfm.hex -Intel
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200731
732The following message will be shown in case of successful firmware upgrade,
733notice that image with higher version number (``version=1.2.3.5``) is executed:
734
735::
736
737 [INF] Starting bootloader
David Vincze8a2a4e22019-05-24 10:14:23 +0200738 [INF] Image 0: version=1.2.3.4, magic= good, image_ok=0x3
739 [INF] Image 1: version=1.2.3.5, magic= good, image_ok=0x3
David Vincze8bdfc2d2019-03-18 15:49:23 +0100740 [INF] Booting image from the secondary slot
David Vincze8a2a4e22019-05-24 10:14:23 +0200741 [INF] Bootloader chainload address offset: 0xa0000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200742 [INF] Jumping to the first image slot
743 [Sec Thread] Secure image initializing!
744
David Vincze8a2a4e22019-05-24 10:14:23 +0200745 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800746 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze8a2a4e22019-05-24 10:14:23 +0200747 ...
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200748
Kevin Peng0a142112018-09-21 10:42:22 +0800749Executing firmware upgrade on CoreLink SSE-200 Subsystem for MPS3 (AN524)
750-------------------------------------------------------------------------
751
752::
753
754 TITLE: Arm MPS3 FPGA prototyping board Images Configuration File
755
756 [IMAGES]
757 TOTALIMAGES: 3 ;Number of Images (Max: 32)
758
759 IMAGE0UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE
760 IMAGE0ADDRESS: 0x00000000
761 IMAGE0FILE: \SOFTWARE\mcuboot.bin ;BL2 bootloader
762 IMAGE1UPDATE: AUTO
763 IMAGE1ADDRESS: 0x00040000
764 IMAGE1FILE: \SOFTWARE\tfm_sig0.bin ;TF-M example application binary blob
765 IMAGE2UPDATE: AUTO
766 IMAGE2ADDRESS: 0x000C0000
767 IMAGE2FILE: \SOFTWARE\tfm_sig1.bin ;TF-M regression test binary blob
768
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200769RAM loading firmware upgrade
770============================
David Vincze8a2a4e22019-05-24 10:14:23 +0200771To enable RAM loading, please set ``MCUBOOT_UPGRADE_STRATEGY`` to "RAM_LOADING"
772(either in the configuration file or through the command line), and then specify
773a destination load address in RAM where the image can be copied to and executed
774from. The ``IMAGE_LOAD_ADDRESS`` macro must be specified in the target dependent
775files, for example with Musca-A, its ``flash_layout.h`` file in the ``platform``
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200776folder should include ``#define IMAGE_LOAD_ADDRESS #0x10020000``
777
David Vincze8a2a4e22019-05-24 10:14:23 +0200778Executing firmware upgrade on Musca-A board
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200779--------------------------------------------
780After two images have been built, they can be concatenated to create the
781combined image using ``srec_cat``:
782
David Vincze8a2a4e22019-05-24 10:14:23 +0200783- Linux::
784
785 srec_cat bl2/ext/mcuboot/mcuboot.bin -Binary -offset 0x200000 tfm_sign_old.bin -Binary -offset 0x220000 tfm_sign_new.bin -Binary -offset 0x320000 -o tfm.hex -Intel
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200786
787- Windows::
David Vincze8a2a4e22019-05-24 10:14:23 +0200788
David Vincze9c609012019-08-22 13:37:21 +0200789 srec_cat.exe bl2\ext\mcuboot\mcuboot.bin -Binary -offset 0x200000 tfm_sign_old.bin -Binary -offset 0x220000 tfm_sign_new.bin -Binary -offset 0x320000 -o tfm.hex -Intel
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200790
791The following message will be shown in case of successful firmware upgrade when,
792RAM loading is enabled, notice that image with higher version number
793(``version=0.0.0.2``) is executed:
794
795::
796
David Vincze8a2a4e22019-05-24 10:14:23 +0200797 [INF] Starting bootloader
798 [INF] Image 0: version=0.0.0.1, magic= good, image_ok=0x3
799 [INF] Image 1: version=0.0.0.2, magic= good, image_ok=0x3
David Vincze8bdfc2d2019-03-18 15:49:23 +0100800 [INF] Image has been copied from the secondary slot in flash to SRAM address 0x10020000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200801 [INF] Booting image from SRAM at address 0x10020000
802 [INF] Bootloader chainload address offset: 0x20000
803 [INF] Jumping to the first image slot
804 [Sec Thread] Secure image initializing!
805
806--------------
807
David Vinczec3e313a2020-01-06 17:31:11 +0100808*Copyright (c) 2018-2020, Arm Limited. All rights reserved.*