blob: 69292c638cc078bf99cb896489fef8d30400c848 [file] [log] [blame] [view]
David Brown17e20d12017-09-12 11:53:20 -06001<!--
2 Licensed to the Apache Software Foundation (ASF) under one
3 or more contributor license agreements. See the NOTICE file
4 distributed with this work for additional information
5 regarding copyright ownership. The ASF licenses this file
6 to you under the Apache License, Version 2.0 (the
7 "License"); you may not use this file except in compliance
8 with the License. You may obtain a copy of the License at
Christopher Collins92ea77f2016-12-12 15:59:26 -08009
David Brown17e20d12017-09-12 11:53:20 -060010 http://www.apache.org/licenses/LICENSE-2.0
Christopher Collins92ea77f2016-12-12 15:59:26 -080011
David Brown17e20d12017-09-12 11:53:20 -060012 Unless required by applicable law or agreed to in writing,
13 software distributed under the License is distributed on an
14 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 KIND, either express or implied. See the License for the
16 specific language governing permissions and limitations
17 under the License.
18-->
19
20# Boot Loader
21
22## Summary
Christopher Collins92ea77f2016-12-12 15:59:26 -080023
Fabio Utzigac834962017-07-20 13:20:48 -030024mcuboot comprises two packages:
Christopher Collins92ea77f2016-12-12 15:59:26 -080025
David Brown17e20d12017-09-12 11:53:20 -060026* The bootutil library (boot/bootutil)
27* The boot application (each port has its own at boot/<port>)
Christopher Collins92ea77f2016-12-12 15:59:26 -080028
29The bootutil library performs most of the functions of a boot loader. In
30particular, the piece that is missing is the final step of actually jumping to
31the main image. This last step is instead implemented by the boot application.
32Boot loader functionality is separated in this manner to enable unit testing of
33the boot loader. A library can be unit tested, but an application can't.
34Therefore, functionality is delegated to the bootutil library when possible.
35
David Brown17e20d12017-09-12 11:53:20 -060036## Limitations
Christopher Collins92ea77f2016-12-12 15:59:26 -080037
38The boot loader currently only supports images with the following
39characteristics:
David Brown17e20d12017-09-12 11:53:20 -060040* Built to run from flash.
41* Built to run from a fixed location (i.e., not position-independent).
Christopher Collins92ea77f2016-12-12 15:59:26 -080042
David Brown17e20d12017-09-12 11:53:20 -060043## Image Format
Christopher Collins92ea77f2016-12-12 15:59:26 -080044
45The following definitions describe the image format.
46
David Brown17e20d12017-09-12 11:53:20 -060047``` c
Fabio Utzigea422c22017-09-11 11:02:47 -030048#define IMAGE_MAGIC 0x96f3b83d
Christopher Collins92ea77f2016-12-12 15:59:26 -080049
50#define IMAGE_HEADER_SIZE 32
51
52struct image_version {
53 uint8_t iv_major;
54 uint8_t iv_minor;
55 uint16_t iv_revision;
56 uint32_t iv_build_num;
57};
58
59/** Image header. All fields are in little endian byte order. */
60struct image_header {
61 uint32_t ih_magic;
Fabio Utzigea422c22017-09-11 11:02:47 -030062 uint32_t ih_load_addr;
Christopher Collins92ea77f2016-12-12 15:59:26 -080063 uint16_t ih_hdr_size; /* Size of image header (bytes). */
64 uint16_t _pad2;
65 uint32_t ih_img_size; /* Does not include header. */
Fabio Utzigea422c22017-09-11 11:02:47 -030066 uint32_t ih_flags; /* IMAGE_F_[...]. */
Christopher Collins92ea77f2016-12-12 15:59:26 -080067 struct image_version ih_ver;
68 uint32_t _pad3;
69};
70
Fabio Utzigea422c22017-09-11 11:02:47 -030071/** Image TLV header. All fields in little endian. */
72struct image_tlv_info {
73 uint16_t it_magic;
74 uint16_t it_tlv_tot; /* size of TLV area (including tlv_info header) */
75};
76
Christopher Collins92ea77f2016-12-12 15:59:26 -080077/** Image trailer TLV format. All fields in little endian. */
78struct image_tlv {
79 uint8_t it_type; /* IMAGE_TLV_[...]. */
80 uint8_t _pad;
Marti Bolivar49b29172017-08-04 14:50:51 -040081 uint16_t it_len; /* Data length (not including TLV header). */
Christopher Collins92ea77f2016-12-12 15:59:26 -080082};
83
84/*
85 * Image header flags.
86 */
Marti Bolivar7c057e92017-08-04 14:46:39 -040087#define IMAGE_F_PIC 0x00000001 /* Not supported. */
Marti Bolivar7c057e92017-08-04 14:46:39 -040088#define IMAGE_F_NON_BOOTABLE 0x00000010 /* Split image app. */
Fabio Utzigea422c22017-09-11 11:02:47 -030089#define IMAGE_F_RAM_LOAD 0x00000020
Christopher Collins92ea77f2016-12-12 15:59:26 -080090
91/*
92 * Image trailer TLV types.
93 */
Fabio Utzigea422c22017-09-11 11:02:47 -030094#define IMAGE_TLV_KEYHASH 0x01 /* hash of the public key */
David Brown27648b82017-08-31 10:40:29 -060095#define IMAGE_TLV_SHA256 0x10 /* SHA256 of image hdr and body */
Marko Kiiskila8dd56f32017-08-22 21:40:49 -070096#define IMAGE_TLV_RSA2048_PSS 0x20 /* RSA2048 of hash output */
David Brown27648b82017-08-31 10:40:29 -060097#define IMAGE_TLV_ECDSA224 0x21 /* ECDSA of hash output */
98#define IMAGE_TLV_ECDSA256 0x22 /* ECDSA of hash output */
David Brown17e20d12017-09-12 11:53:20 -060099```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800100
101Optional type-length-value records (TLVs) containing image metadata are placed
102after the end of the image.
103
David Brown17e20d12017-09-12 11:53:20 -0600104The `ih_hdr_size` field indicates the length of the header, and therefore the
Christopher Collins92ea77f2016-12-12 15:59:26 -0800105offset of the image itself. This field provides for backwards compatibility in
106case of changes to the format of the image header.
107
David Brown17e20d12017-09-12 11:53:20 -0600108## Flash Map
Christopher Collins92ea77f2016-12-12 15:59:26 -0800109
Fabio Utzigac834962017-07-20 13:20:48 -0300110A device's flash is partitioned according to its _flash map_. At a high
Christopher Collins92ea77f2016-12-12 15:59:26 -0800111level, the flash map maps numeric IDs to _flash areas_. A flash area is a
112region of disk with the following properties:
David Brown17e20d12017-09-12 11:53:20 -06001131. An area can be fully erased without affecting any other areas.
1142. A write to one area does not restrict writes to other areas.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800115
Marti Bolivar4e64d562017-08-04 14:53:33 -0400116The boot loader uses the following flash area IDs:
Christopher Collins92ea77f2016-12-12 15:59:26 -0800117
David Brown17e20d12017-09-12 11:53:20 -0600118``` c
Christopher Collins92ea77f2016-12-12 15:59:26 -0800119#define FLASH_AREA_BOOTLOADER 0
120#define FLASH_AREA_IMAGE_0 1
121#define FLASH_AREA_IMAGE_1 2
122#define FLASH_AREA_IMAGE_SCRATCH 3
David Brown17e20d12017-09-12 11:53:20 -0600123```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800124
Marti Bolivar4e64d562017-08-04 14:53:33 -0400125The bootloader area contains the bootloader image itself. The other areas are
126described in subsequent sections.
127
David Brown17e20d12017-09-12 11:53:20 -0600128## Image Slots
Christopher Collins92ea77f2016-12-12 15:59:26 -0800129
130A portion of the flash memory is partitioned into two image slots: a primary
131slot (0) and a secondary slot (1). The boot loader will only run an image from
132the primary slot, so images must be built such that they can run from that
133fixed location in flash. If the boot loader needs to run the image resident in
Marti Bolivara91674f2017-08-04 14:56:08 -0400134the secondary slot, it must copy its contents into the primary slot before doing
135so, either by swapping the two images or by overwriting the contents of the
136primary slot. The bootloader supports either swap- or overwrite-based image
137upgrades, but must be configured at build time to choose one of these two
138strategies.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800139
140In addition to the two image slots, the boot loader requires a scratch area to
141allow for reliable image swapping.
142
Marti Bolivara91674f2017-08-04 14:56:08 -0400143The overwrite upgrade strategy is substantially simpler to implement than the
144image swapping strategy, especially since the bootloader must work properly
145even when it is reset during the middle of an image swap. For this reason, the
146rest of the document describes its behavior when configured to swap images
147during an upgrade.
148
David Brown17e20d12017-09-12 11:53:20 -0600149## Boot Swap Types
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800150
Marti Bolivar048d8d82017-08-04 17:14:24 -0400151When the device first boots under normal circumstances, there is an up-to-date
152firmware image in slot 0, which mcuboot can validate and then chain-load. In
153this case, no image swaps are necessary. During device upgrades, however, new
154candidate images are present in slot 1, which mcuboot must swap into slot 0
155before booting as discussed above.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800156
Marti Bolivar048d8d82017-08-04 17:14:24 -0400157Upgrading an old image with a new one by swapping can be a two-step process. In
158this process, mcuboot performs a "test" swap of image data in flash and boots
159the new image. The new image can then update the contents of flash at runtime
160to mark itself "OK", and mcuboot will then still choose to run it during the
161next boot. When this happens, the swap is made "permanent". If this doesn't
162happen, mcuboot will perform a "revert" swap during the next boot by swapping
163the images back into their original locations, and attempting to boot the old
164image.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800165
Marti Bolivar048d8d82017-08-04 17:14:24 -0400166Depending on the use case, the first swap can also be made permanent directly.
167In this case, mcuboot will never attempt to revert the images on the next reset.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800168
Marti Bolivar048d8d82017-08-04 17:14:24 -0400169Test swaps are supported to provide a rollback mechanism to prevent devices
170from becoming "bricked" by bad firmware. If the device crashes immediately
171upon booting a new (bad) image, mcuboot will revert to the old (working) image
172at the next device reset, rather than booting the bad image again. This allows
173device firmware to make test swaps permanent only after performing a self-test
174routine.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800175
Marti Bolivar048d8d82017-08-04 17:14:24 -0400176On startup, mcuboot inspects the contents of flash to decide which of these
177"swap types" to perform; this decision determines how it proceeds.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800178
Marti Bolivar048d8d82017-08-04 17:14:24 -0400179The possible swap types, and their meanings, are:
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800180
David Brown17e20d12017-09-12 11:53:20 -0600181- `BOOT_SWAP_TYPE_NONE`: The "usual" or "no upgrade" case; attempt to boot the
Marti Bolivar048d8d82017-08-04 17:14:24 -0400182 contents of slot 0.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800183
David Brown17e20d12017-09-12 11:53:20 -0600184- `BOOT_SWAP_TYPE_TEST`: Boot the contents of slot 1 by swapping images. Unless
Marti Bolivar048d8d82017-08-04 17:14:24 -0400185 the swap is made permanent, revert back on the next boot.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800186
David Brown17e20d12017-09-12 11:53:20 -0600187- `BOOT_SWAP_TYPE_PERM`: Permanently swap images, and boot the upgraded image
Marti Bolivar048d8d82017-08-04 17:14:24 -0400188 firmware.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800189
David Brown17e20d12017-09-12 11:53:20 -0600190- `BOOT_SWAP_TYPE_REVERT`: A previous test swap was not made permanent; swap back
Marti Bolivar048d8d82017-08-04 17:14:24 -0400191 to the old image whose data are now in slot 1. If the old image marks itself
David Brown17e20d12017-09-12 11:53:20 -0600192 "OK" when it boots, the next boot will have swap type `BOOT_SWAP_TYPE_NONE`.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800193
David Brown17e20d12017-09-12 11:53:20 -0600194- `BOOT_SWAP_TYPE_FAIL`: Swap failed because image to be run is not valid.
Marti Bolivar048d8d82017-08-04 17:14:24 -0400195
David Brown17e20d12017-09-12 11:53:20 -0600196- `BOOT_SWAP_TYPE_PANIC`: Swapping encountered an unrecoverable error.
Marti Bolivar048d8d82017-08-04 17:14:24 -0400197
198The "swap type" is a high-level representation of the outcome of the
199boot. Subsequent sections describe how mcuboot determines the swap type from
200the bit-level contents of flash.
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800201
David Brown17e20d12017-09-12 11:53:20 -0600202## Image Trailer
Christopher Collins92ea77f2016-12-12 15:59:26 -0800203
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300204For the bootloader to be able to determine the current state and what actions
Marti Bolivar42818032017-08-04 15:45:01 -0400205should be taken during the current boot operation, it uses metadata stored in
206the image flash areas. While swapping, some of this metadata is temporarily
207copied into and out of the scratch area.
208
209This metadata is located at the end of the image flash areas, and is called an
210image trailer. An image trailer has the following structure:
Christopher Collins92ea77f2016-12-12 15:59:26 -0800211
David Brown17e20d12017-09-12 11:53:20 -0600212```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800213 0 1 2 3
214 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
215 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Christopher Collins92ea77f2016-12-12 15:59:26 -0800216 ~ ~
217 ~ Swap status (128 * min-write-size * 3) ~
218 ~ ~
219 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Fabio Utzigea422c22017-09-11 11:02:47 -0300220 | Swap size |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800221 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Fabio Utzigea422c22017-09-11 11:02:47 -0300222 | 0xff padding (4 octets) |
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300223 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Fabio Utzigea422c22017-09-11 11:02:47 -0300224 | Copy done | 0xff padding (7 octets) ~
225 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
226 | Image OK | 0xff padding (7 octets) ~
227 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
228 ~ MAGIC (16 octets) ~
Christopher Collins92ea77f2016-12-12 15:59:26 -0800229 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
David Brown17e20d12017-09-12 11:53:20 -0600230```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800231
Marti Bolivar42818032017-08-04 15:45:01 -0400232The offset immediately following such a record represents the start of the next
233flash area.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800234
235Note: "min-write-size" is a property of the flash hardware. If the hardware
236allows individual bytes to be written at arbitrary addresses, then
237min-write-size is 1. If the hardware only allows writes at even addresses,
238then min-write-size is 2, and so on.
239
Marti Bolivar1dcb6852017-08-04 15:59:32 -0400240An image trailer contains the following fields:
Christopher Collins92ea77f2016-12-12 15:59:26 -0800241
Marti Bolivar1dcb6852017-08-04 15:59:32 -04002421. Swap status: A series of records which records the progress of an image
David Brown17e20d12017-09-12 11:53:20 -0600243 swap. To swap entire images, data are swapped between the two image areas one
244 or more sectors at a time, like this:
Marti Bolivar1dcb6852017-08-04 15:59:32 -0400245
David Brown17e20d12017-09-12 11:53:20 -0600246 - sector data in slot 0 is copied into scratch, then erased
247 - sector data in slot 1 is copied into slot 0, then erased
248 - sector data in scratch is copied into slot 1
Marti Bolivar1dcb6852017-08-04 15:59:32 -0400249
250As it swaps images, the bootloader updates the swap status field in a way that
251allows it to compute how far this swap operation has progressed for each
252sector. The swap status field can thus used to resume a swap operation if the
253bootloader is halted while a swap operation is ongoing and later reset. The
254factor of 128 is the maximum number of sectors mcuboot supports for each image;
255its value is a bootloader design decision. The factor of min-write-sz is due to
256the behavior of flash hardware. The factor of 3 is explained below.
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300257
Fabio Utzigea422c22017-09-11 11:02:47 -03002582. Swap size: When beginning a new swap operation, the total size that needs
David Brown17e20d12017-09-12 11:53:20 -0600259 to be swapped (based on the slot with largest image + tlvs) is written to this
260 location for easier recovery in case of a reset while performing the swap.
Fabio Utzigea422c22017-09-11 11:02:47 -0300261
2623. Copy done: A single byte indicating whether the image in this slot is
David Brown17e20d12017-09-12 11:53:20 -0600263 complete (0x01=done; 0xff=not done).
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300264
Fabio Utzigea422c22017-09-11 11:02:47 -03002654. Image OK: A single byte indicating whether the image in this slot has been
David Brown17e20d12017-09-12 11:53:20 -0600266 confirmed as good by the user (0x01=confirmed; 0xff=not confirmed).
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300267
Fabio Utzigea422c22017-09-11 11:02:47 -03002685. MAGIC: The following 16 bytes, written in host-byte-order:
Christopher Collins92ea77f2016-12-12 15:59:26 -0800269
David Brown17e20d12017-09-12 11:53:20 -0600270``` c
Christopher Collins92ea77f2016-12-12 15:59:26 -0800271 const uint32_t boot_img_magic[4] = {
272 0xf395c277,
273 0x7fefd260,
274 0x0f505235,
275 0x8079b62c,
276 };
David Brown17e20d12017-09-12 11:53:20 -0600277```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800278
David Brown17e20d12017-09-12 11:53:20 -0600279## IMAGE TRAILERS
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300280
Marti Bolivar048d8d82017-08-04 17:14:24 -0400281At startup, the boot loader determines the boot swap type by inspecting the
282image trailers. When using the term "image trailers" what is meant is the
283aggregate information provided by both image slot's trailers.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300284
285The image trailers records are structured around the limitations imposed by flash
Christopher Collins92ea77f2016-12-12 15:59:26 -0800286hardware. As a consequence, they do not have a very intuitive design, and it
287is difficult to get a sense of the state of the device just by looking at the
Marti Bolivar048d8d82017-08-04 17:14:24 -0400288image trailers. It is better to map all the possible trailer states to the swap
289types described above via a set of tables. These tables are reproduced below.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300290
291Note: An important caveat about the tables described below is that they must
292be evaluated in the order presented here. Lower state numbers must have a
293higher priority when testing the image trailers.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800294
David Brown17e20d12017-09-12 11:53:20 -0600295```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800296 State I
297 | slot-0 | slot-1 |
298 -----------------+--------+--------|
Christopher Collins92ea77f2016-12-12 15:59:26 -0800299 magic | Any | Good |
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800300 image-ok | Any | Unset |
Fabio Utzigf9d44282017-07-20 15:05:13 -0300301 copy-done | Any | Any |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800302 -----------------+--------+--------'
Marti Bolivar048d8d82017-08-04 17:14:24 -0400303 result: BOOT_SWAP_TYPE_TEST |
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800304 -----------------------------------'
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300305
Christopher Collins92ea77f2016-12-12 15:59:26 -0800306
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300307 State II
Christopher Collins92ea77f2016-12-12 15:59:26 -0800308 | slot-0 | slot-1 |
309 -----------------+--------+--------|
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800310 magic | Any | Good |
311 image-ok | Any | 0x01 |
Fabio Utzigf9d44282017-07-20 15:05:13 -0300312 copy-done | Any | Any |
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800313 -----------------+--------+--------'
Marti Bolivar048d8d82017-08-04 17:14:24 -0400314 result: BOOT_SWAP_TYPE_PERM |
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800315 -----------------------------------'
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300316
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800317
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300318 State III
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800319 | slot-0 | slot-1 |
320 -----------------+--------+--------|
Christopher Collins92ea77f2016-12-12 15:59:26 -0800321 magic | Good | Unset |
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800322 image-ok | 0xff | Any |
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300323 copy-done | 0x01 | Any |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800324 -----------------+--------+--------'
Marti Bolivar048d8d82017-08-04 17:14:24 -0400325 result: BOOT_SWAP_TYPE_REVERT |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800326 -----------------------------------'
David Brown17e20d12017-09-12 11:53:20 -0600327```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800328
Marti Bolivar048d8d82017-08-04 17:14:24 -0400329Any of the above three states results in mcuboot attempting to swap images.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800330
Marti Bolivar048d8d82017-08-04 17:14:24 -0400331Otherwise, mcuboot does not attempt to swap images, resulting in one of the
332other three swap types, as illustrated by State IV.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300333
David Brown17e20d12017-09-12 11:53:20 -0600334```
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300335 State IV
Christopher Collins92ea77f2016-12-12 15:59:26 -0800336 | slot-0 | slot-1 |
337 -----------------+--------+--------|
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300338 magic | Any | Any |
339 image-ok | Any | Any |
Fabio Utzigf9d44282017-07-20 15:05:13 -0300340 copy-done | Any | Any |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800341 -----------------+--------+--------'
Marti Bolivar048d8d82017-08-04 17:14:24 -0400342 result: BOOT_SWAP_TYPE_NONE, |
343 BOOT_SWAP_TYPE_FAIL, or |
344 BOOT_SWAP_TYPE_PANIC |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800345 -----------------------------------'
David Brown17e20d12017-09-12 11:53:20 -0600346```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800347
Marti Bolivar048d8d82017-08-04 17:14:24 -0400348In State IV, when no errors occur, mcuboot will attempt to boot the contents of
David Brown17e20d12017-09-12 11:53:20 -0600349slot 0 directly, and the result is `BOOT_SWAP_TYPE_NONE`. If the image in slot 0
350is not valid, the result is `BOOT_SWAP_TYPE_FAIL`. If a fatal error occurs during
351boot, the result is `BOOT_SWAP_TYPE_PANIC`. If the result is either
352`BOOT_SWAP_TYPE_FAIL` or `BOOT_SWAP_TYPE_PANIC`, mcuboot hangs rather than booting
Marti Bolivar048d8d82017-08-04 17:14:24 -0400353an invalid or compromised image.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300354
Marti Bolivar048d8d82017-08-04 17:14:24 -0400355Note: An important caveat to the above is the result when a swap is requested
356 and the image in slot 1 fails to validate, due to a hashing or signing
357 error. This state behaves as State IV with the extra action of marking
358 the image in slot 0 as "OK", to prevent further attempts to swap.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300359
360
David Brown17e20d12017-09-12 11:53:20 -0600361## High-Level Operation
Christopher Collins92ea77f2016-12-12 15:59:26 -0800362
363With the terms defined, we can now explore the boot loader's operation. First,
364a high-level overview of the boot process is presented. Then, the following
365sections describe each step of the process in more detail.
366
367Procedure:
368
David Brown17e20d12017-09-12 11:53:20 -06003691. Inspect swap status region; is an interrupted swap being resumed?
370 Yes: Complete the partial swap operation; skip to step 3.
371 No: Proceed to step 2.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800372
David Brown17e20d12017-09-12 11:53:20 -06003732. Inspect image trailers; is a swap requested?
Christopher Collins92ea77f2016-12-12 15:59:26 -0800374 Yes.
375 1. Is the requested image valid (integrity and security check)?
376 Yes.
377 a. Perform swap operation.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300378 b. Persist completion of swap procedure to image trailers.
David Brown17e20d12017-09-12 11:53:20 -0600379 c. Proceed to step 3.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800380 No.
381 a. Erase invalid image.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300382 b. Persist failure of swap procedure to image trailers.
David Brown17e20d12017-09-12 11:53:20 -0600383 c. Proceed to step 3.
384 No: Proceed to step 3.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800385
David Brown17e20d12017-09-12 11:53:20 -06003863. Boot into image in slot 0.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800387
David Brown17e20d12017-09-12 11:53:20 -0600388## Image Swapping
Christopher Collins92ea77f2016-12-12 15:59:26 -0800389
390The boot loader swaps the contents of the two image slots for two reasons:
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800391 * User has issued a "set pending" operation; the image in slot-1 should be
392 run once (state II) or repeatedly (state III), depending on whether a
393 permanent swap was specified.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800394 * Test image rebooted without being confirmed; the boot loader should
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800395 revert to the original image currently in slot-1 (state IV).
Christopher Collins92ea77f2016-12-12 15:59:26 -0800396
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300397If the image trailers indicates that the image in the secondary slot should be
Christopher Collins92ea77f2016-12-12 15:59:26 -0800398run, the boot loader needs to copy it to the primary slot. The image currently
399in the primary slot also needs to be retained in flash so that it can be used
400later. Furthermore, both images need to be recoverable if the boot loader
401resets in the middle of the swap operation. The two images are swapped
402according to the following procedure:
403
David Brown17e20d12017-09-12 11:53:20 -0600404<!-- Markdown doesn't do nested numbered lists. It will do nested
405bulletted lists, so maybe that is better. -->
Christopher Collins92ea77f2016-12-12 15:59:26 -0800406 1. Determine how many flash sectors each image slot consists of. This
407 number must be the same for both slots.
408 2. Iterate the list of sector indices in descending order (i.e., starting
409 with the greatest index); current element = "index".
410 b. Erase scratch area.
411 c. Copy slot0[index] to scratch area.
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300412 - If these are the last sectors (i.e., first swap being perfomed),
413 copy the full sector *except* the image trailer.
414 - Else, copy entire sector contents.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800415 d. Write updated swap status (i).
416
417 e. Erase slot1[index]
418 f. Copy slot0[index] to slot1[index]
419 - If these are the last sectors (i.e., first swap being perfomed),
420 copy the full sector *except* the image trailer.
421 - Else, copy entire sector contents.
422 g. Write updated swap status (ii).
423
424 h. Erase slot0[index].
425 i. Copy scratch area slot0[index].
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300426 - If these are the last sectors (i.e., first swap being perfomed),
427 copy the full sector *except* the image trailer.
428 - Else, copy entire sector contents.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800429 j. Write updated swap status (iii).
430
431 3. Persist completion of swap procedure to slot 0 image trailer.
432
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800433The additional caveats in step 2f are necessary so that the slot 1 image
434trailer can be written by the user at a later time. With the image trailer
435unwritten, the user can test the image in slot 1 (i.e., transition to state
436II).
Christopher Collins92ea77f2016-12-12 15:59:26 -0800437
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300438Note1: If the sector being copied is the last sector, then swap status is
439temporarily maintained on scratch for the duration of this operation, always
440using slot0's area otherwise.
441
442Note2: The bootloader tries to copy only used sectors (based on largest image
443installed on any of the slots), minimizing the amount of sectors copied and
444reducing the amount of time required for a swap operation.
445
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800446The particulars of step 3 vary depending on whether an image is being tested,
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300447permanently used, reverted or a validation failure of slot 1 happened when a
448swap was requested:
449
Christopher Collins92ea77f2016-12-12 15:59:26 -0800450 * test:
451 o Write slot0.copy_done = 1
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800452 (swap caused the following values to be written:
453 slot0.magic = BOOT_MAGIC
454 slot0.image_ok = Unset)
Christopher Collinsfd7eb5c2016-12-21 13:46:08 -0800455
456 * permanent:
457 o Write slot0.copy_done = 1
458 (swap caused the following values to be written:
459 slot0.magic = BOOT_MAGIC
460 slot0.image_ok = 0x01)
Christopher Collins92ea77f2016-12-12 15:59:26 -0800461
462 * revert:
Christopher Collins92ea77f2016-12-12 15:59:26 -0800463 o Write slot0.copy_done = 1
464 o Write slot0.image_ok = 1
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300465 (swap caused the following values to be written:
466 slot0.magic = BOOT_MAGIC)
467
468 * failure to validate slot 1:
469 o Write slot0.image_ok = 1
470
471After completing the operations as described above the image in slot 0 should
472be booted.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800473
David Brown17e20d12017-09-12 11:53:20 -0600474## Swap Status
Christopher Collins92ea77f2016-12-12 15:59:26 -0800475
476The swap status region allows the boot loader to recover in case it restarts in
477the middle of an image swap operation. The swap status region consists of a
478series of single-byte records. These records are written independently, and
479therefore must be padded according to the minimum write size imposed by the
480flash hardware. In the below figure, a min-write-size of 1 is assumed for
481simplicity. The structure of the swap status region is illustrated below. In
482this figure, a min-write-size of 1 is assumed for simplicity.
483
David Brown17e20d12017-09-12 11:53:20 -0600484```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800485 0 1 2 3
486 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
487 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
488 |sec127,state 0 |sec127,state 1 |sec127,state 2 |sec126,state 0 |
489 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
490 |sec126,state 1 |sec126,state 2 |sec125,state 0 |sec125,state 1 |
491 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
492 |sec125,state 2 | |
493 +-+-+-+-+-+-+-+-+ +
494 ~ ~
495 ~ [Records for indices 124 through 1 ~
496 ~ ~
497 ~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
498 ~ |sec000,state 0 |sec000,state 1 |sec000,state 2 |
499 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
David Brown17e20d12017-09-12 11:53:20 -0600500```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800501
502The above is probably not helpful at all; here is a description in English.
503
504Each image slot is partitioned into a sequence of flash sectors. If we were to
505enumerate the sectors in a single slot, starting at 0, we would have a list of
506sector indices. Since there are two image slots, each sector index would
507correspond to a pair of sectors. For example, sector index 0 corresponds to
508the first sector in slot 0 and the first sector in slot 1. Furthermore, we
509impose a limit of 128 indices. If an image slot consists of more than 128
510sectors, the flash layout is not compatible with this boot loader. Finally,
511reverse the list of indices such that the list starts with index 127 and ends
512with 0. The swap status region is a representation of this reversed list.
513
514During a swap operation, each sector index transitions through four separate
515states:
David Brown17e20d12017-09-12 11:53:20 -0600516```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800517 0. slot 0: image 0, slot 1: image 1, scratch: N/A
518 1. slot 0: image 0, slot 1: N/A, scratch: image 1 (1->s, erase 1)
519 2. slot 0: N/A, slot 1: image 0, scratch: image 1 (0->1, erase 0)
520 3. slot 0: image 1, slot 1: image 0, scratch: N/A (s->0)
David Brown17e20d12017-09-12 11:53:20 -0600521```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800522
523Each time a sector index transitions to a new state, the boot loader writes a
524record to the swap status region. Logically, the boot loader only needs one
525record per sector index to keep track of the current swap state. However, due
526to limitations imposed by flash hardware, a record cannot be overwritten when
527an index's state changes. To solve this problem, the boot loader uses three
528records per sector index rather than just one.
529
530Each sector-state pair is represented as a set of three records. The record
531values map to the above four states as follows
532
David Brown17e20d12017-09-12 11:53:20 -0600533```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800534 | rec0 | rec1 | rec2
535 --------+------+------+------
536 state 0 | 0xff | 0xff | 0xff
537 state 1 | 0x01 | 0xff | 0xff
538 state 2 | 0x01 | 0x02 | 0xff
539 state 3 | 0x01 | 0x02 | 0x03
David Brown17e20d12017-09-12 11:53:20 -0600540```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800541
542The swap status region can accommodate 128 sector indices. Hence, the size of
David Brown17e20d12017-09-12 11:53:20 -0600543the region, in bytes, is `128 * min-write-size * 3`. The number 128 is chosen
Christopher Collins92ea77f2016-12-12 15:59:26 -0800544somewhat arbitrarily and will likely be made configurable. The only
545requirement for the index count is that is is great enough to account for a
546maximum-sized image (i.e., at least as great as the total sector count in an
547image slot). If a device's image slots use less than 128 sectors, the first
548record that gets written will be somewhere in the middle of the region. For
549example, if a slot uses 64 sectors, the first sector index that gets swapped is
55063, which corresponds to the exact halfway point within the region.
551
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300552Note: since the scratch area only ever needs to record swapping of the last
553sector, it uses at most min-write-size * 3 bytes for its own status area.
554
David Brown17e20d12017-09-12 11:53:20 -0600555## Reset Recovery
Christopher Collins92ea77f2016-12-12 15:59:26 -0800556
557If the boot loader resets in the middle of a swap operation, the two images may
558be discontiguous in flash. Bootutil recovers from this condition by using the
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300559image trailers to determine how the image parts are distributed in flash.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800560
561The first step is determine where the relevant swap status region is located.
562Because this region is embedded within the image slots, its location in flash
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300563changes during a swap operation. The below set of tables map image trailers
Christopher Collins92ea77f2016-12-12 15:59:26 -0800564contents to swap status location. In these tables, the "source" field
565indicates where the swap status region is located.
566
David Brown17e20d12017-09-12 11:53:20 -0600567```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800568 | slot-0 | scratch |
569 ----------+------------+------------|
570 magic | Good | Any |
571 copy-done | 0x01 | N/A |
572 ----------+------------+------------'
573 source: none |
574 ------------------------------------'
Marti Bolivar49b29172017-08-04 14:50:51 -0400575
Christopher Collins92ea77f2016-12-12 15:59:26 -0800576 | slot-0 | scratch |
577 ----------+------------+------------|
578 magic | Good | Any |
579 copy-done | 0xff | N/A |
580 ----------+------------+------------'
581 source: slot 0 |
582 ------------------------------------'
Marti Bolivar49b29172017-08-04 14:50:51 -0400583
Christopher Collins92ea77f2016-12-12 15:59:26 -0800584 | slot-0 | scratch |
585 ----------+------------+------------|
586 magic | Any | Good |
587 copy-done | Any | N/A |
588 ----------+------------+------------'
589 source: scratch |
590 ------------------------------------'
Marti Bolivar49b29172017-08-04 14:50:51 -0400591
Christopher Collins92ea77f2016-12-12 15:59:26 -0800592 | slot-0 | scratch |
593 ----------+------------+------------|
594 magic | Unset | Any |
595 copy-done | 0xff | N/A |
596 ----------+------------+------------|
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300597 source: slot 0 |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800598 ------------------------------------+------------------------------+
599 This represents one of two cases: |
600 o No swaps ever (no status to read, so no harm in checking). |
601 o Mid-revert; status in slot 0. |
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300602 For this reason we assume slot 0 as source, to trigger a check |
603 of the status area and find out if there was swapping under way. |
Christopher Collins92ea77f2016-12-12 15:59:26 -0800604 -------------------------------------------------------------------'
David Brown17e20d12017-09-12 11:53:20 -0600605```
Christopher Collins92ea77f2016-12-12 15:59:26 -0800606
607If the swap status region indicates that the images are not contiguous,
608bootutil completes the swap operation that was in progress when the system was
609reset. In other words, it applies the procedure defined in the previous
610section, moving image 1 into slot 0 and image 0 into slot 1. If the boot
611status file indicates that an image part is present in the scratch area, this
612part is copied into the correct location by starting at step e or step h in the
613area-swap procedure, depending on whether the part belongs to image 0 or image
6141.
615
616After the swap operation has been completed, the boot loader proceeds as though
617it had just been started.
618
David Brown17e20d12017-09-12 11:53:20 -0600619## Integrity Check
Christopher Collins92ea77f2016-12-12 15:59:26 -0800620
621An image is checked for integrity immediately before it gets copied into the
Fabio Utzig5bd4e582017-07-20 08:55:38 -0300622primary slot. If the boot loader doesn't perform an image swap, then it can
623perform an optional integrity check of the image in slot0 if
David Brown17e20d12017-09-12 11:53:20 -0600624`MCUBOOT_VALIDATE_SLOT0` is set, otherwise it doesn't perform an integrity check.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800625
626During the integrity check, the boot loader verifies the following aspects of
627an image:
Fabio Utzigea422c22017-09-11 11:02:47 -0300628 * 32-bit magic number must be correct (0x96f3b83d).
David Brown17e20d12017-09-12 11:53:20 -0600629 * Image must contain an `image_tlv_info` struct, identified by its magic
Fabio Utzigea422c22017-09-11 11:02:47 -0300630 (0x6907) exactly following the firmware (hdr_size + img_size).
Christopher Collins92ea77f2016-12-12 15:59:26 -0800631 * Image must contain a SHA256 TLV.
Fabio Utzig86fe4b22017-07-28 18:56:29 -0300632 * Calculated SHA256 must match SHA256 TLV contents.
Fabio Utzigea422c22017-09-11 11:02:47 -0300633 * Image *may* contain a signature TLV. If it does, it must also have a
634 KEYHASH TLV with the hash of the key that was used to sign. The list of
635 keys will then be iterated over looking for the matching key, which then
636 will then be used to verify the image contents.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800637
David Brown17e20d12017-09-12 11:53:20 -0600638## Security
Christopher Collins92ea77f2016-12-12 15:59:26 -0800639
640As indicated above, the final step of the integrity check is signature
641verification. The boot loader can have one or more public keys embedded in it
642at build time. During signature verification, the boot loader verifies that an
Fabio Utzigea422c22017-09-11 11:02:47 -0300643image was signed with a private key that corresponds to the embedded keyhash
644TLV.
Christopher Collins92ea77f2016-12-12 15:59:26 -0800645
646For information on embedding public keys in the boot loader, as well as
David Brown17e20d12017-09-12 11:53:20 -0600647producing signed images, see: [signed_images]({% link signed_images.md
648%}).