blob: e29630e84f25bfe5dc40c1218ef23471e06acfb2 [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*******************************
Balint Matyi69e2d2e2020-07-08 10:53:54 +010030By default, the MCUboot project from
31`GitHub <https://github.com/JuulLabs-OSS/mcuboot>`__ is used as the secure
32bootloader in TF-M. The repository is going to be automatically downloaded by
33CMake. The version downloaded can be controlled by the ``MCUBOOT_VERSION``
34CMake variable. If you wish to use a locally downloaded copy, the CMake variable
35``MCUBOOT_PATH`` can be set to its location. This document contains information
36about how MCUboot has been integrated to TF-M. For further information about
37MCUboot design please refer to the `MCUBoot homepage <https://www.mcuboot.com/>`__.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020038
39Bootloader is started when CPU is released from reset. It runs in secure mode.
40It authenticates the firmware image by hash (SHA-256) and digital signature
David Vincze9c609012019-08-22 13:37:21 +020041(RSA-3072) validation. Public key, that the checks happens against, can be built
42into the bootloader image or can be provisioned to the SoC during manufacturing.
43Metadata of the image is delivered together with the image itself in a header
44and trailer section. In case of successful authentication, bootloader passes
45execution to the secure image. Execution never returns to bootloader until
46next reset.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020047
48A default RSA key pair is stored in the repository, public key is in ``keys.c``
Anton Komlevb8e3af02020-08-28 10:23:57 +010049and private key is in ``root-RSA-3072.pem``.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020050
David Vincze8a2a4e22019-05-24 10:14:23 +020051.. Warning::
52 DO NOT use them in production code, they are exclusively for testing!
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020053
Balint Matyi69e2d2e2020-07-08 10:53:54 +010054The private key must be stored in a safe place outside of the repository.
55``imgtool.py`` (found in the ``scripts`` directory in the MCUBoot repository,
56or installed through the pip package manager) can be used to generate new key
57pairs.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020058
David Vincze9c609012019-08-22 13:37:21 +020059The bootloader can handle the secure and non-secure images independently
60(multiple image boot) or together (single image boot). In case of multiple image
61boot they are signed independently with different keys and they can be updated
62separately. In case of single image boot the secure and non-secure image is
63handled as a single blob, therefore they must be contiguous in the device
64memory. In this case they are signed together and also they can be updated only
65together. In order to have the same artefacts at the end of the build regardless
66of how the images are handled (independently or together) the images are always
67concatenated. In case of single image boot they are concatenated first and then
68signed. In case of multiple image boot they are separately signed first and then
69concatenated. Preparation of payload is done by Python scripts:
70``bl2/ext/mcuboot/scripts/``. At the end of a successful build the signed TF-M
Anton Komlevb8e3af02020-08-28 10:23:57 +010071payload can be found in: ``<build_dir>/bin/tfm_s_ns_signed.bin``
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020072
73*********************
74Integration with TF-M
75*********************
76MCUBoot assumes a predefined memory layout which is described below (applicable
David Vincze8bdfc2d2019-03-18 15:49:23 +010077for AN521). It is mandatory to define the primary slot and the secondary slot
David Vincze9c609012019-08-22 13:37:21 +020078partitions, but their size and location can be changed::
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020079
80 - 0x0000_0000 - 0x0007_FFFF: BL2 bootloader - MCUBoot
David Vincze8bdfc2d2019-03-18 15:49:23 +010081 - 0x0008_0000 - 0x000F_FFFF: Primary slot : Single binary blob:
82 Secure + Non-Secure image;
83 Primary memory partition
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020084 - 0x0008_0000 - 0x0008_03FF: Common image header
85 - 0x0008_0400 - 0x0008_xxxx: Secure image
86 - 0x0008_xxxx - 0x0010_03FF: Padding (with 0xFF)
87 - 0x0010_0400 - 0x0010_xxxx: Non-secure image
David Vincze9c609012019-08-22 13:37:21 +020088 - 0x0010_xxxx - 0x0010_xxxx: Hash value(SHA256), RSA signature and other
89 metadata of combined image
David Vincze8a2a4e22019-05-24 10:14:23 +020090
David Vincze8bdfc2d2019-03-18 15:49:23 +010091 - 0x0018_0000 - 0x0027_FFFF: Secondary slot : Secure + Non-Secure image;
92 Secondary memory partition, structured
93 identically to the primary slot
David Vincze9c609012019-08-22 13:37:21 +020094 - 0x0028_0000 - 0x0037_FFFF: Scratch area, only used during image
95 swapping
96
97Multiple image boot requires a slightly different layout::
98
99 - 0x0000_0000 - 0x0007_FFFF: BL2 bootloader - MCUBoot
100 - 0x0008_0000 - 0x000F_FFFF: Primary slot : Secure image
101 - 0x0008_0000 - 0x0008_03FF: Secure image header
102 - 0x0008_0400 - 0x000x_xxxx: Secure image
103 - 0x000x_xxxx - 0x000x_xxxx: Hash value(SHA256), RSA signature and other
104 metadata of secure image
105
106 - 0x0010_0000 - 0x0017_FFFF: Primary slot : Non-secure image
107 - 0x0010_0000 - 0x0010_03FF: Non-secure image header
108 - 0x0010_0400 - 0x001x_xxxx: Non-secure image
109 - 0x001x_xxxx - 0x001x_xxxx: Hash value(SHA256), RSA signature and other
110 metadata of non-secure image
111
112 - 0x0018_0000 - 0x001F_FFFF: Secondary slot : Secure image
113 - 0x0020_0000 - 0x0027_FFFF: Secondary slot : Non-secure image
114
115 - 0x0028_0000 - 0x002F_FFFF: Scratch area, only used during image
116 swapping, used for secure and non-secure
117 image as well
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200118
119**************************
120Firmware upgrade operation
121**************************
122MCUBoot handles only the firmware authenticity check after start-up and the
123firmware switch part of the firmware update process. Downloading the new version
David Vincze8a2a4e22019-05-24 10:14:23 +0200124of the firmware is out-of-scope for MCUBoot. MCUBoot supports three different
125ways to switch to the new firmware and it is assumed that firmware images are
126executed-in-place (XIP). The default behaviour is the overwrite-based image
David Vincze8bdfc2d2019-03-18 15:49:23 +0100127upgrade. In this case the active firmware is always executed from the primary
128slot and the secondary slot is a staging area for new images. Before executing
129the new firmware image, the content of the primary slot must be overwritten with
130the content of the secondary slot (the new firmware image). The second option is
131the image swapping strategy when the content of the two memory slots must be
132physically swapped. This needs the scratch area to be defined in the memory
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100133layout. The third option is the direct execute-in-place version, which
134eliminates the complexity of image swapping and its administration. Active image
135can be executed from either memory slot, but new firmware must be linked to the
136address space of the proper (currently inactive) memory slot.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200137
David Vincze8a2a4e22019-05-24 10:14:23 +0200138Overwrite operation
Tamas Bane7efdc62019-06-05 13:14:52 +0100139===================
David Vincze8bdfc2d2019-03-18 15:49:23 +0100140Active image is stored in the primary slot, and this image is started always by
141the bootloader. Therefore images must be linked to the primary slot. If the
142bootloader finds a valid image in the secondary slot, which is marked for
143upgrade, then the content of the primary slot will be simply overwritten with
144the content of the secondary slot, before starting the new image from the
145primary slot. After the content of the primary slot has been successfully
146overwritten, the header and trailer of the new image in the secondary slot is
David Vincze9c609012019-08-22 13:37:21 +0200147erased to prevent the triggering of another unnecessary image upgrade after a
David Vincze8bdfc2d2019-03-18 15:49:23 +0100148restart. The overwrite operation is fail-safe and resistant to power-cut
149failures. For more details please refer to the MCUBoot
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200150`documentation <https://www.mcuboot.com/mcuboot/design.html>`__.
151
David Vincze8a2a4e22019-05-24 10:14:23 +0200152Swapping operation
153==================
154This operation can be set with the ``MCUBOOT_UPGRADE_STRATEGY`` compile time
155switch (see `Build time configuration`_). With swapping image upgrade strategy
David Vincze8bdfc2d2019-03-18 15:49:23 +0100156the active image is also stored in the primary slot and it will always be
157started by the bootloader. If the bootloader finds a valid image in the
158secondary slot, which is marked for upgrade, then contents of the primary slot
159and the secondary slot will be swapped, before starting the new image from the
160primary slot. Scratch area is used as a temporary storage place during image
161swapping. Update mark from the secondary slot is removed when the swapping is
David Vincze8a2a4e22019-05-24 10:14:23 +0200162successful. The boot loader can revert the swapping as a fall-back mechanism to
163recover the previous working firmware version after a faulty update. The swap
164operation is fail-safe and resistant to power-cut failures. For more details
165please refer to the MCUBoot
166`documentation <https://www.mcuboot.com/mcuboot/design.html>`__.
167
168.. Note::
169
170 After a successful image upgrade the firmware can mark itself as "OK" at
171 runtime by setting the image_ok flag in the flash. When this happens, the
172 swap is made "permanent" and MCUBoot will then still choose to run it
173 during the next boot. Currently TF-M does not set the image_ok flag,
174 therefore the bootloader will always perform a "revert" (swap the images
175 back) during the next boot.
176
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100177Direct execute-in-place operation
178=================================
David Vincze8a2a4e22019-05-24 10:14:23 +0200179This operation can be set with the ``MCUBOOT_UPGRADE_STRATEGY`` compile time
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100180switch (see `Build time configuration`_). When enabling direct-xip operation
David Vincze8a2a4e22019-05-24 10:14:23 +0200181then the active image flag is moved between slots during firmware upgrade. If
182firmware is executed-in-place (XIP), then two firmware images must be generated.
David Vincze8bdfc2d2019-03-18 15:49:23 +0100183One of them is linked to be executed from the primary slot memory region and the
184other from the secondary slot. The firmware upgrade client, which downloads the
185new image, must be aware, which slot hosts the active firmware and which acts as
186a staging area and it is responsible for downloading the proper firmware image.
187At boot time MCUBoot inspects the version number in the image header and passes
188execution to the newer firmware version. New image must be marked for upgrade
189which is automatically done by Python scripts at compile time. Image
190verification is done the same way in all operational modes. If new image fails
191during authentication then MCUBoot erases the memory slot and starts the other
192image, after successful authentication.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200193
Anton Komlevb8e3af02020-08-28 10:23:57 +0100194To select which slot the image is to be executed from, set
195``MCUBOOT_EXECUTION_SLOT`` to the desired index. It is suggested that you create
196two build directories when building images using this mode, as intermediate
197dependencies cannot be reused due to changes in the flash layout.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200198
David Vincze9c609012019-08-22 13:37:21 +0200199.. Note::
200
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100201 Only single image boot is supported with direct-xip upgrade mode.
David Vincze9c609012019-08-22 13:37:21 +0200202
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200203RAM Loading firmware upgrade
204============================
David Vincze8a2a4e22019-05-24 10:14:23 +0200205Musca-A supports an image upgrade mode that is separate to the other (overwrite,
Tamas Banf4023f32020-09-16 11:02:52 +0100206swapping and dirext-xip) modes. This is the ``RAM load`` mode (please refer
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100207to the table below). Like the direct-xip mode, this selects the newest image
David Vincze8a2a4e22019-05-24 10:14:23 +0200208by reading the image version numbers in the image headers, but instead of
209executing it in place, the newest image is copied to RAM for execution. The load
210address, the location in RAM where the image is copied to, is stored in the
211image header.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200212
David Vincze9c609012019-08-22 13:37:21 +0200213.. Note::
214
Tamas Banf4023f32020-09-16 11:02:52 +0100215 Only single image boot is supported with ``RAM load`` upgrade mode.
David Vincze9c609012019-08-22 13:37:21 +0200216
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200217Summary of different modes for image upgrade
218============================================
219Different implementations of the image upgrade operation (whether through
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100220overwriting, swapping, direct-xip or loading into RAM and executing from
David Vincze8a2a4e22019-05-24 10:14:23 +0200221there) are supported by the platforms. The table below shows which of these
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200222modes are supported by which platforms:
223
Tamas Banf4023f32020-09-16 11:02:52 +0100224+---------------------+-----------------+----------------------------------------------------------+
225| | Without BL2 [1]_| With BL2 [2]_ |
226+=====================+=================+===============+==========+================+==============+
227| | XIP | XIP | XIP | XIP | Not XIP |
228+---------------------+-----------------+---------------+----------+----------------+--------------+
229| | | Overwrite [3]_| Swap [4]_| direct-xip [5]_| RAM load [6]_|
230+---------------------+-----------------+---------------+----------+----------------+--------------+
231| AN521 | Yes | Yes | Yes | Yes | No |
232+---------------------+-----------------+---------------+----------+----------------+--------------+
233| AN519 | Yes | Yes | Yes | Yes | No |
234+---------------------+-----------------+---------------+----------+----------------+--------------+
235| AN539 | Yes | Yes | Yes | Yes | No |
236+---------------------+-----------------+---------------+----------+----------------+--------------+
237| FVP_SSE300_MPS2 | NO | Yes | Yes | Yes | No |
238+---------------------+-----------------+---------------+----------+----------------+--------------+
239| LPC55S69 | No | No | No | No | No |
240+---------------------+-----------------+---------------+----------+----------------+--------------+
241| Musca-A | No | No | No | No | Yes |
242+---------------------+-----------------+---------------+----------+----------------+--------------+
243| Musca-B1 | Yes | Yes | Yes | Yes | No |
244+---------------------+-----------------+---------------+----------+----------------+--------------+
245| Musca-S1 | Yes | Yes | Yes | Yes | No |
246+---------------------+-----------------+---------------+----------+----------------+--------------+
247| AN524 | Yes | No | No | Yes | No |
248+---------------------+-----------------+---------------+----------+----------------+--------------+
249| PSoC64 | Yes | No | No | No | No |
250+---------------------+-----------------+---------------+----------+----------------+--------------+
251| SSE-200_AWS | Yes | Yes | Yes | Yes | No |
252+---------------------+-----------------+---------------+----------+----------------+--------------+
253| STM_DISCO_L562QE | No | Yes | No | No | No |
254+---------------------+-----------------+---------------+----------+----------------+--------------+
255| STM_NUCLEO_L552ZE_Q | No | Yes | No | No | No |
256+---------------------+-----------------+---------------+----------+----------------+--------------+
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200257
Anton Komlevb8e3af02020-08-28 10:23:57 +0100258.. [1] To disable BL2, please set the ``BL2`` cmake option to ``OFF``
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200259
260.. [2] BL2 is enabled by default
261
David Vincze8a2a4e22019-05-24 10:14:23 +0200262.. [3] The image executes in-place (XIP) and is in Overwrite mode for image
263 update by default
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200264
David Vincze8a2a4e22019-05-24 10:14:23 +0200265.. [4] To enable XIP Swap mode, assign the "SWAP" 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
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200268
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100269.. [5] To enable direct-xip, assign the "DIRECT_XIP" 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
272
Tamas Banf4023f32020-09-16 11:02:52 +0100273.. [6] To enable RAM load, assign the "RAM_LOAD" string to the
David Vincze9c609012019-08-22 13:37:21 +0200274 ``MCUBOOT_UPGRADE_STRATEGY`` configuration variable in the build
David Vincze8a2a4e22019-05-24 10:14:23 +0200275 configuration file, or include this macro definition in the command line
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200276
David Vincze9c609012019-08-22 13:37:21 +0200277*******************
278Multiple image boot
279*******************
280It is possible to update the firmware images independently to support the
281scenario when secure and non-secure images are provided by different vendors.
282Multiple image boot is supported only together with the overwrite and swap
283firmware upgrade modes.
284
285It is possible to describe the dependencies of the images on each other in
286order to avoid a faulty upgrade when incompatible versions would be installed.
287These dependencies are part of the image manifest area.
288The dependencies are composed from two parts:
289
290 - **Image identifier:** The number of the image which the current image (whose
291 manifest area contains the dependency entry) depends on. The image identifier
292 starts from 0.
293
294 - **Minimum version:** The minimum version of other image must be present on
295 the device by the end of the upgrade (both images might be updated at the
296 same time).
297
298Dependencies can be added to the images at compile time with the following
299compile time switches:
300
Anton Komlevb8e3af02020-08-28 10:23:57 +0100301 - ``MCUBOOT_S_IMAGE_MIN_VER`` It is added to the non-secure image and specifies the
David Vincze9c609012019-08-22 13:37:21 +0200302 minimum required version of the secure image.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100303 - ``MCUBOOT_NS_IMAGE_MIN_VER`` It is added to the secure image and specifies the
David Vincze9c609012019-08-22 13:37:21 +0200304 minimum required version of the non-secure image.
305
306Example of how to provide the secure image minimum version::
307
Anton Komlevb8e3af02020-08-28 10:23:57 +0100308 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 +0200309
Tamas Ban7801ed42019-05-20 13:21:53 +0100310********************
311Signature algorithms
312********************
313MbedTLS library is used to sign the images. The list of supported signing
314algorithms:
Tamas Bane7efdc62019-06-05 13:14:52 +0100315
316 - `RSA-2048`
317 - `RSA-3072`: default
318
David Vincze9c609012019-08-22 13:37:21 +0200319Example keys stored in:
320
Anton Komlevb8e3af02020-08-28 10:23:57 +0100321 - ``root-RSA-2048.pem`` : Used to sign single image (S+NS) or secure image
David Vincze9c609012019-08-22 13:37:21 +0200322 in case of multiple image boot
Anton Komlevb8e3af02020-08-28 10:23:57 +0100323 - ``root-RSA-2048_1.pem`` : Used to sign non-secure image in case of multiple
David Vincze9c609012019-08-22 13:37:21 +0200324 image boot
Anton Komlevb8e3af02020-08-28 10:23:57 +0100325 - ``root-RSA-3072.pem`` : Used to sign single image (S+NS) or secure image
David Vincze9c609012019-08-22 13:37:21 +0200326 in case of multiple image boot
Anton Komlevb8e3af02020-08-28 10:23:57 +0100327 - ``root-RSA-3072_1.pem`` : Used to sign non-secure image in case of multiple
David Vincze9c609012019-08-22 13:37:21 +0200328 image boot
Tamas Ban7801ed42019-05-20 13:21:53 +0100329
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200330************************
331Build time configuration
332************************
Anton Komlevb8e3af02020-08-28 10:23:57 +0100333MCUBoot related compile time switches can be set by cmake variables.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200334
335- BL2 (default: True):
336 - **True:** TF-M built together with bootloader. MCUBoot is executed after
337 reset and it authenticates TF-M and starts secure code.
338 - **False:** TF-M built without bootloader. Secure image linked to the
339 beginning of the device memory and executed after reset. If it is false
David Vincze9c609012019-08-22 13:37:21 +0200340 then using any of the further compile time switches is invalid.
David Vincze8a2a4e22019-05-24 10:14:23 +0200341- MCUBOOT_UPGRADE_STRATEGY (default: "OVERWRITE_ONLY"):
342 - **"OVERWRITE_ONLY":** Default firmware upgrade operation with overwrite.
343 - **"SWAP":** Activate swapping firmware upgrade operation.
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100344 - **"DIRECT_XIP":** Activate direct execute-in-place firmware upgrade
345 operation.
Tamas Banf4023f32020-09-16 11:02:52 +0100346 - **"RAM_LOAD":** Activate RAM loading firmware upgrade operation, where
David Vincze9c609012019-08-22 13:37:21 +0200347 the latest image is copied to RAM and runs from there instead of being
David Vincze8a2a4e22019-05-24 10:14:23 +0200348 executed in-place.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100349- MCUBOOT_SIGNATURE_TYPE (default: RSA):
350 - **RSA:** Image is signed with RSA algorithm
351- MCUBOOT_SIGNATURE_KEY_LEN (default: 3072):
352 - **2048:** Image is signed with 2048 bit key.
353 - **3072:** Image is signed with 3072 bit key.
David Vincze9c609012019-08-22 13:37:21 +0200354- MCUBOOT_IMAGE_NUMBER (default: 2):
355 - **1:** Single image boot, secure and non-secure images are signed and
356 updated together.
357 - **2:** Multiple image boot, secure and non-secure images are signed and
358 updatable independently.
359- MCUBOOT_HW_KEY (default: True):
360 - **True:** The hash of public key is provisioned to the SoC and the image
Anton Komlevb8e3af02020-08-28 10:23:57 +0100361 manifest contains the whole public key (imgtool uses
362 ``--public_key_format=full``). MCUBoot validates the key before using it
363 for firmware authentication, it calculates the hash of public key from the
364 manifest and compare against the retrieved key-hash from the hardware.
365 This way MCUBoot is independent from the public key(s). Key(s) can be
366 provisioned any time and by different parties.
David Vincze9c609012019-08-22 13:37:21 +0200367 - **False:** The whole public key is embedded to the bootloader code and the
Anton Komlevb8e3af02020-08-28 10:23:57 +0100368 image manifest contains only the hash of the public key (imgtool uses
369 ``--public_key_format=hash``). MCUBoot validates the key before using it
370 for firmware authentication, it calculates the hash of built-in public key
371 and compare against the retrieved key-hash from the image manifest. After
372 this the bootloader can verify that the image was signed with a private
373 key that corresponds to the retrieved key-hash (it can have more public
374 keys embedded in and it may have to look for the matching one). All the
375 public key(s) must be known at MCUBoot build time.
David Vincze73dfbc52019-10-11 13:54:58 +0200376- MCUBOOT_LOG_LEVEL:
377 Can be used to configure the level of logging in MCUBoot. The possible
378 values are the following:
379
380 - **LOG_LEVEL_OFF**
381 - **LOG_LEVEL_ERROR**
382 - **LOG_LEVEL_WARNING**
383 - **LOG_LEVEL_INFO**
384 - **LOG_LEVEL_DEBUG**
385
386 The logging in MCUBoot can be disabled and thus the code size can be reduced
387 by setting it to ``LOG_LEVEL_OFF``. Its value depends on the build type. If
388 the build type is ``Debug`` and a value has been provided (e.g. through the
389 command line or the CMake GUI) then that value will be used, otherwise it is
390 ``LOG_LEVEL_INFO`` by default. In case of different kinds of ``Release``
391 builds its value is set to ``LOG_LEVEL_OFF`` (any other value will be
392 overridden).
Anton Komlevb8e3af02020-08-28 10:23:57 +0100393- MCUBOOT_ENC_IMAGES (default: False):
Balint Matyi5c476312020-03-31 13:15:39 +0100394 - **True:** Adds encrypted image support in the source and encrypts the
395 resulting image using the ``enc-rsa2048-pub.pem`` key found in the MCUBoot
396 repository.
397 - **False:** Doesn't add encrypted image support and doesn't encrypt the
398 image.
399
Balint Matyifb7e60f2020-07-27 10:06:44 +0100400 .. Note::
401 The decryption takes place during the upgrade process, when the images
402 are being moved between the slots. This means that boards that don't
403 already have an image on them with MCUBoot that has been compiled with
404 ``MCUBOOT_ENCRYPT_RSA`` enabled need special treatment. In order to load
405 an encrypted image to such boards, an upgrade needs to be executed. This
406 can be done by using MCUBoot, putting an image in the secondary image
407 area, and setting ``MCUBOOT_ENCRYPT_RSA`` to ``ON``. When using the
408 ``OVERWRITE_ONLY`` upgrade strategy, this is enough. When using
409 ``SWAP``, an image is needed in the primary image area as well, to
410 trigger the update.
411
Balint Matyi5c476312020-03-31 13:15:39 +0100412 .. Warning::
Balint Matyifb7e60f2020-07-27 10:06:44 +0100413 DO NOT use the ``enc-rsa2048-pub.pem`` key in production code, it is
414 exclusively for testing!
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200415
416Image versioning
417================
David Vincze9c609012019-08-22 13:37:21 +0200418An image version number is written to its header by one of the Python scripts,
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100419and this number is used by the bootloader when the direct execute-in-place or
420the RAM loading mode is enabled. It is also used in case of multiple image boot
421when the bootloader checks the image dependencies if any have been added to the
422images.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200423
David Vincze9c609012019-08-22 13:37:21 +0200424The version number of the image (single image boot) can manually be passed in
425through the command line in the cmake configuration step::
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200426
Anton Komlevb8e3af02020-08-28 10:23:57 +0100427 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 +0200428
429Alternatively, the version number can be less specific (e.g 1, 1.2, or 1.2.3),
430where the missing numbers are automatically set to zero. The image version
431number argument is optional, and if it is left out, then the version numbers of
432the image(s) being built in the same directory will automatically change. In
433this case, the last component (the build number) automatically increments from
434the previous one: 0.0.0+1 -> 0.0.0+2, for as many times as the build is re-ran,
435**until a number is explicitly provided**. If automatic versioning is in place
436and then an image version number is provided for the first time, the new number
437will take precedence and be used instead. All subsequent image versions are
438then set to the last number that has been specified, and the build number would
439stop incrementing. Any new version numbers that are provided will overwrite
440the previous one: 0.0.0+1 -> 0.0.0+2. Note: To re-apply automatic image
441versioning, please start a clean build without specifying the image version
David Vincze9c609012019-08-22 13:37:21 +0200442number at all. In case of multiple image boot there are separate compile time
443switches for both images to provide their version: ``IMAGE_VERSION_S`` and
Anton Komlevb8e3af02020-08-28 10:23:57 +0100444``IMAGE_VERSION_NS``. These must be used instead of ``IMAGE_VERSION_S``.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200445
David Vincze060968d2019-05-23 01:13:14 +0200446Security counter
447================
448Each signed image contains a security counter in its manifest. It is used by the
449bootloader and its aim is to have an independent (from the image version)
450counter to ensure rollback protection by comparing the new image's security
451counter against the original (currently active) image's security counter during
452the image upgrade process. It is added to the manifest (to the TLV area that is
David Vincze9c609012019-08-22 13:37:21 +0200453appended to the end of the image) by one of the Python scripts when signing the
David Vincze060968d2019-05-23 01:13:14 +0200454image. The value of the security counter is security critical data and it is in
David Vincze9c609012019-08-22 13:37:21 +0200455the integrity protected part of the image. The last valid security counter
456should always be stored in a non-volatile and trusted component of the device
457and its value should always be increased if a security flaw was fixed in the
458current image version. The value of the security counter (single image boot) can
459be specified at build time in the cmake configuration step::
David Vincze060968d2019-05-23 01:13:14 +0200460
Anton Komlevb8e3af02020-08-28 10:23:57 +0100461 cmake -DTFM_PLATFORM=musca_b1 -DCMAKE_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DSECURITY_COUNTER_S=42 ../
David Vincze060968d2019-05-23 01:13:14 +0200462
463The security counter can be independent from the image version, but not
464necessarily. Alternatively, if it is not specified at build time with the
David Vincze9c609012019-08-22 13:37:21 +0200465``SECURITY_COUNTER`` option the Python script will automatically generate it
David Vincze060968d2019-05-23 01:13:14 +0200466from the image version number (not including the build number) and this value
David Vincze9c609012019-08-22 13:37:21 +0200467will be added to the signed image. In case of multiple image boot there are
468separate compile time switches for both images to provide their security counter
469value: ``SECURITY_COUNTER_S`` and ``SECURITY_COUNTER_NS``. These must be used
Anton Komlevb8e3af02020-08-28 10:23:57 +0100470instead of ``SECURITY_COUNTER_S``. If these are not defined then the security
David Vincze9c609012019-08-22 13:37:21 +0200471counter values will be derived from the corresponding image version similar to
472the single image boot.
473
474***************************
475Signing the images manually
476***************************
477Normally the build system handles the signing (computing hash over the image
478and security critical manifest data and then signing the hash) of the firmware
479images. However, the images also can be signed manually by using the ``imgtool``
Balint Matyi69e2d2e2020-07-08 10:53:54 +0100480Python program which is located in the MCUboot repository in the ``scripts``
481folder or can be installed with the pip package manager.
David Vincze9c609012019-08-22 13:37:21 +0200482Issue the ``python3 imgtool.py sign --help`` command in the directory for more
483information about the mandatory and optional arguments. The tool takes an image
484in binary or Intel Hex format and adds a header and trailer that MCUBoot is
485expecting. In case of single image boot after a successful build the
Anton Komlevb8e3af02020-08-28 10:23:57 +0100486``tfm_s_ns.bin`` build artifact (contains the concatenated secure and non-secure
David Vincze9c609012019-08-22 13:37:21 +0200487images) must be passed to the script and in case of multiple image boot the
488``tfm_s.bin`` and ``tfm_ns.bin`` binaries can be passed to prepare the signed
489images.
490
491Signing the secure image manually in case of multiple image boot
492================================================================
493
494::
495
496 python3 bl2/ext/mcuboot/scripts/imgtool.py sign \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100497 --layout <build_dir>/bl2/ext/mcuboot/CMakeFiles/signing_layout_s.dir/signing_layout_s.c.obj \
498 -k <tfm_dir>/bl2/ext/mcuboot/root-RSA-3072.pem \
David Vincze9c609012019-08-22 13:37:21 +0200499 --public-key-format full \
500 --align 1 \
501 -v 1.2.3+4 \
502 -d "(1,1.2.3+0)" \
503 -s 42 \
504 -H 0x400 \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100505 <build_dir>/bin/tfm_s.bin \
506 <build_dir>/bin/tfm_s_signed.bin
David Vincze060968d2019-05-23 01:13:14 +0200507
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200508************************
509Testing firmware upgrade
510************************
511As downloading the new firmware image is out of scope for MCUBoot, the update
512process is started from a state where the original and the new image are already
513programmed to the appropriate memory slots. To generate the original and a new
514firmware package, TF-M is built twice with different build configurations.
515
David Vincze8a2a4e22019-05-24 10:14:23 +0200516Overwriting firmware upgrade
Tamas Bane7efdc62019-06-05 13:14:52 +0100517============================
David Vincze9c609012019-08-22 13:37:21 +0200518Run TF-M build twice with ``MCUBOOT_IMAGE_NUMBER`` set to "1" in both cases
519(single image boot), but with two different build configurations: default and
David Vincze8a2a4e22019-05-24 10:14:23 +0200520regression. Save the artifacts between builds, because second run can overwrite
David Vincze8bdfc2d2019-03-18 15:49:23 +0100521original binaries. Download default build to the primary slot and regression
522build to the secondary slot.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200523
524Executing firmware upgrade on FVP_MPS2_AEMv8M
525---------------------------------------------
526.. code-block:: bash
527
528 <DS5_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \
529 --parameter fvp_mps2.platform_type=2 \
530 --parameter cpu0.baseline=0 \
531 --parameter cpu0.INITVTOR_S=0x10000000 \
532 --parameter cpu0.semihosting-enable=0 \
533 --parameter fvp_mps2.DISABLE_GATING=0 \
534 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
535 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
536 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
537 --parameter fvp_mps2.telnetterminal0.quiet=0 \
538 --parameter fvp_mps2.telnetterminal1.quiet=1 \
539 --parameter fvp_mps2.telnetterminal2.quiet=1 \
540 --application cpu0=<build_dir>/bl2/ext/mcuboot/mcuboot.axf \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100541 --data cpu0=<default_build_dir>/bin/tfm_s_ns_signed.bin@0x10080000 \
542 --data cpu0=<regresssion_build_dir>/bin/tfm_s_ns_signed.bin@0x10180000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200543
544Executing firmware upgrade on SSE 200 FPGA on MPS2 board
545--------------------------------------------------------
546
547::
548
549 TITLE: Versatile Express Images Configuration File
550 [IMAGES]
551 TOTALIMAGES: 3 ;Number of Images (Max: 32)
552 IMAGE0ADDRESS: 0x00000000
553 IMAGE0FILE: \Software\mcuboot.axf ; BL2 bootloader
554 IMAGE1ADDRESS: 0x10080000
David Vincze8a2a4e22019-05-24 10:14:23 +0200555 IMAGE1FILE: \Software\tfm_sig1.bin ; TF-M default test binary blob
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200556 IMAGE2ADDRESS: 0x10180000
557 IMAGE2FILE: \Software\tfm_sig2.bin ; TF-M regression test binary blob
558
David Vincze8a2a4e22019-05-24 10:14:23 +0200559The following message will be shown in case of successful firmware upgrade:
560
561::
562
563 [INF] Starting bootloader
564 [INF] Swap type: test
David Vincze8bdfc2d2019-03-18 15:49:23 +0100565 [INF] Image upgrade secondary slot -> primary slot
566 [INF] Erasing the primary slot
567 [INF] Copying the secondary slot to the primary slot: 0x100000 bytes
David Vincze8a2a4e22019-05-24 10:14:23 +0200568 [INF] Bootloader chainload address offset: 0x80000
569 [INF] Jumping to the first image slot
570 [Sec Thread] Secure image initializing!
571
572 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800573 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze8a2a4e22019-05-24 10:14:23 +0200574 ...
575
David Vincze9c609012019-08-22 13:37:21 +0200576To update the secure and non-secure images separately (multiple image boot),
577set the ``MCUBOOT_IMAGE_NUMBER`` switch to "2" (this is the default
578configuration value) and follow the same instructions as in case of single image
579boot.
580
581Executing multiple firmware upgrades on SSE 200 FPGA on MPS2 board
582------------------------------------------------------------------
583
584::
585
586 TITLE: Versatile Express Images Configuration File
587 [IMAGES]
588 TOTALIMAGES: 4 ;Number of Images (Max: 32)
589 IMAGE0ADDRESS: 0x00000000
590 IMAGE0FILE: \Software\mcuboot.axf ; BL2 bootloader
591 IMAGE1ADDRESS: 0x10080000
592 IMAGE1FILE: \Software\tfm_sign.bin ; TF-M default test binary blob
593 IMAGE2ADDRESS: 0x10180000
594 IMAGE2FILE: \Software\tfm_ss1.bin ; TF-M regression test secure (signed) image
595 IMAGE3ADDRESS: 0x10200000
596 IMAGE3FILE: \Software\tfm_nss1.bin ; TF-M regression test non-secure (signed) image
597
598Note that both the concatenated binary blob (the images are signed separately
599and then concatenated) and the separate signed images can be downloaded to the
600device because on this platform (AN521) both the primary slots and the secondary
601slots are contiguous areas in the Flash (see `Integration with TF-M`_). The
602following message will be shown in case of successful firmware upgrades:
603
604::
605
606 [INF] Starting bootloader
607 [INF] Swap type: test
608 [INF] Swap type: test
609 [INF] Image upgrade secondary slot -> primary slot
610 [INF] Erasing the primary slot
611 [INF] Copying the secondary slot to the primary slot: 0x80000 bytes
612 [INF] Image upgrade secondary slot -> primary slot
613 [INF] Erasing the primary slot
614 [INF] Copying the secondary slot to the primary slot: 0x80000 bytes
615 [INF] Bootloader chainload address offset: 0x80000
616 [INF] Jumping to the first image slot
617 [Sec Thread] Secure image initializing!
618 TFM level is: 1
619 [Sec Thread] Jumping to non-secure code...
620
621 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800622 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze9c609012019-08-22 13:37:21 +0200623 ...
624
David Vincze8a2a4e22019-05-24 10:14:23 +0200625Swapping firmware upgrade
626=============================
627Follow the same instructions and platform related configurations as in case of
628overwriting build including these changes:
629
David Vincze9c609012019-08-22 13:37:21 +0200630- Set the ``MCUBOOT_UPGRADE_STRATEGY`` compile time switch to "SWAP"
631 before build.
632- Set the ``MCUBOOT_IMAGE_NUMBER`` compile time switch to "1" (single image
633 boot) or "2" (multiple image boot) before build.
David Vincze8a2a4e22019-05-24 10:14:23 +0200634
David Vincze9c609012019-08-22 13:37:21 +0200635During single image boot the following message will be shown in case of
636successful firmware upgrade, ``Swap type: test`` indicates that images were
637swapped:
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200638
639::
640
David Vincze8a2a4e22019-05-24 10:14:23 +0200641 [INF] Starting bootloader
642 [INF] Image 0: magic= good, copy_done=0x3, image_ok=0x3
643 [INF] Scratch: magic= bad, copy_done=0x0, image_ok=0x2
David Vincze8bdfc2d2019-03-18 15:49:23 +0100644 [INF] Boot source: primary slot
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200645 [INF] Swap type: test
646 [INF] Bootloader chainload address offset: 0x80000
647 [INF] Jumping to the first image slot
648 [Sec Thread] Secure image initializing!
649
David Vincze8a2a4e22019-05-24 10:14:23 +0200650 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800651 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze8a2a4e22019-05-24 10:14:23 +0200652 ...
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200653
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100654Direct execute-in-place firmware upgrade
655========================================
David Vincze9c609012019-08-22 13:37:21 +0200656Follow the same instructions and platform related configurations as in case of
657overwriting build including these changes:
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200658
Tamas Ban0bd0dfc2020-09-11 15:25:48 +0100659- Set the ``MCUBOOT_UPGRADE_STRATEGY`` compile time switch to "DIRECT_XIP"
David Vincze8a2a4e22019-05-24 10:14:23 +0200660 before build.
Anton Komlevb8e3af02020-08-28 10:23:57 +0100661- set ``MCUBOOT_EXECUTION_SLOT`` to ``1`` in the regression build dir.
David Vincze9c609012019-08-22 13:37:21 +0200662- Make sure the image version number was increased between the two build runs
663 either by specifying it manually or by checking in the build log that it was
664 incremented automatically.
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200665
666Executing firmware upgrade on FVP_MPS2_AEMv8M
667---------------------------------------------
668
669.. code-block:: bash
670
671 <DS5_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \
672 --parameter fvp_mps2.platform_type=2 \
673 --parameter cpu0.baseline=0 \
674 --parameter cpu0.INITVTOR_S=0x10000000 \
675 --parameter cpu0.semihosting-enable=0 \
676 --parameter fvp_mps2.DISABLE_GATING=0 \
677 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
678 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
679 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
680 --parameter fvp_mps2.telnetterminal0.quiet=0 \
681 --parameter fvp_mps2.telnetterminal1.quiet=1 \
682 --parameter fvp_mps2.telnetterminal2.quiet=1 \
683 --application cpu0=<build_dir>/bl2/ext/mcuboot/mcuboot.axf \
Anton Komlevb8e3af02020-08-28 10:23:57 +0100684 --data cpu0=<default_build_dir>/bin/tfm_s_ns_signed.bin@0x10080000 \
685 --data cpu0=<regresssion_build_dir>/bin/tfm_s_ns_signed.bin@0x10180000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200686
687Executing firmware upgrade on SSE 200 FPGA on MPS2 board
688--------------------------------------------------------
689
690::
691
692 TITLE: Versatile Express Images Configuration File
693 [IMAGES]
694 TOTALIMAGES: 3 ;Number of Images (Max: 32)
695 IMAGE0ADDRESS: 0x00000000
696 IMAGE0FILE: \Software\mcuboot.axf ; BL2 bootloader
697 IMAGE1ADDRESS: 0x10080000
Tamas Banbba85642019-06-06 09:31:59 +0100698 IMAGE1FILE: \Software\tfm_sign.bin ; TF-M default test binary blob
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200699 IMAGE2ADDRESS: 0x10180000
700 IMAGE2FILE: \Software\tfm_sig1.bin ; TF-M regression test binary blob
701
Balint Matyi6844e442020-04-22 07:24:40 +0100702Executing firmware upgrade on Musca-B1 and Musca-S1 boards
703----------------------------------------------------------
David Vincze9c609012019-08-22 13:37:21 +0200704After the two images have been built, they can be concatenated to create the
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200705combined image using ``srec_cat``:
706
707- Linux::
David Vincze8a2a4e22019-05-24 10:14:23 +0200708
Tamas Bane1570bd2019-10-25 15:20:35 +0100709 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 +0200710
711- Windows::
David Vincze8a2a4e22019-05-24 10:14:23 +0200712
Tamas Bane1570bd2019-10-25 15:20:35 +0100713 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 +0200714
715The following message will be shown in case of successful firmware upgrade,
716notice that image with higher version number (``version=1.2.3.5``) is executed:
717
718::
719
720 [INF] Starting bootloader
David Vincze8a2a4e22019-05-24 10:14:23 +0200721 [INF] Image 0: version=1.2.3.4, magic= good, image_ok=0x3
722 [INF] Image 1: version=1.2.3.5, magic= good, image_ok=0x3
David Vincze8bdfc2d2019-03-18 15:49:23 +0100723 [INF] Booting image from the secondary slot
David Vincze8a2a4e22019-05-24 10:14:23 +0200724 [INF] Bootloader chainload address offset: 0xa0000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200725 [INF] Jumping to the first image slot
726 [Sec Thread] Secure image initializing!
727
David Vincze8a2a4e22019-05-24 10:14:23 +0200728 #### Execute test suites for the Secure area ####
Kevin Pengc6d74502020-03-04 16:55:37 +0800729 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
David Vincze8a2a4e22019-05-24 10:14:23 +0200730 ...
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200731
Kevin Peng0a142112018-09-21 10:42:22 +0800732Executing firmware upgrade on CoreLink SSE-200 Subsystem for MPS3 (AN524)
733-------------------------------------------------------------------------
734
735::
736
737 TITLE: Arm MPS3 FPGA prototyping board Images Configuration File
738
739 [IMAGES]
740 TOTALIMAGES: 3 ;Number of Images (Max: 32)
741
742 IMAGE0UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE
743 IMAGE0ADDRESS: 0x00000000
744 IMAGE0FILE: \SOFTWARE\mcuboot.bin ;BL2 bootloader
745 IMAGE1UPDATE: AUTO
746 IMAGE1ADDRESS: 0x00040000
747 IMAGE1FILE: \SOFTWARE\tfm_sig0.bin ;TF-M example application binary blob
748 IMAGE2UPDATE: AUTO
749 IMAGE2ADDRESS: 0x000C0000
750 IMAGE2FILE: \SOFTWARE\tfm_sig1.bin ;TF-M regression test binary blob
751
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200752RAM loading firmware upgrade
753============================
Tamas Banf4023f32020-09-16 11:02:52 +0100754To enable RAM loading, please set ``MCUBOOT_UPGRADE_STRATEGY`` to "RAM_LOAD"
David Vincze8a2a4e22019-05-24 10:14:23 +0200755(either in the configuration file or through the command line), and then specify
756a destination load address in RAM where the image can be copied to and executed
757from. The ``IMAGE_LOAD_ADDRESS`` macro must be specified in the target dependent
758files, for example with Musca-A, its ``flash_layout.h`` file in the ``platform``
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200759folder should include ``#define IMAGE_LOAD_ADDRESS #0x10020000``
760
David Vincze8a2a4e22019-05-24 10:14:23 +0200761Executing firmware upgrade on Musca-A board
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200762--------------------------------------------
763After two images have been built, they can be concatenated to create the
764combined image using ``srec_cat``:
765
David Vincze8a2a4e22019-05-24 10:14:23 +0200766- Linux::
767
768 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 +0200769
770- Windows::
David Vincze8a2a4e22019-05-24 10:14:23 +0200771
David Vincze9c609012019-08-22 13:37:21 +0200772 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 +0200773
774The following message will be shown in case of successful firmware upgrade when,
775RAM loading is enabled, notice that image with higher version number
776(``version=0.0.0.2``) is executed:
777
778::
779
David Vincze8a2a4e22019-05-24 10:14:23 +0200780 [INF] Starting bootloader
781 [INF] Image 0: version=0.0.0.1, magic= good, image_ok=0x3
782 [INF] Image 1: version=0.0.0.2, magic= good, image_ok=0x3
David Vincze8bdfc2d2019-03-18 15:49:23 +0100783 [INF] Image has been copied from the secondary slot in flash to SRAM address 0x10020000
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200784 [INF] Booting image from SRAM at address 0x10020000
785 [INF] Bootloader chainload address offset: 0x20000
786 [INF] Jumping to the first image slot
787 [Sec Thread] Secure image initializing!
788
789--------------
790
David Vinczec3e313a2020-01-06 17:31:11 +0100791*Copyright (c) 2018-2020, Arm Limited. All rights reserved.*