blob: 07b09ad118fcd7eab8300c5a4850efff23c488f0 [file] [log] [blame]
David Brownde7729e2017-01-09 10:41:35 -07001/* Run the boot image. */
2
Fabio Utzig9b0ee902017-11-23 19:49:00 -02003#include <assert.h>
David Brownde7729e2017-01-09 10:41:35 -07004#include <setjmp.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8#include <bootutil/bootutil.h>
9#include <bootutil/image.h>
Andrzej Puzdrowskib788c712018-04-12 12:42:49 +020010
11#include <flash_map_backend/flash_map_backend.h>
David Brownde7729e2017-01-09 10:41:35 -070012
David Brownd2b18532017-07-12 09:51:31 -060013#include "../../../boot/bootutil/src/bootutil_priv.h"
Fabio Utzig57c40f72017-12-12 21:48:30 -020014#include "bootsim.h"
David Brownde7729e2017-01-09 10:41:35 -070015
Fabio Utzig1e48b912018-09-18 09:04:18 -030016#ifdef MCUBOOT_ENCRYPT_RSA
17#include "mbedtls/rsa.h"
18#include "mbedtls/asn1.h"
19#endif
20
21#ifdef MCUBOOT_ENCRYPT_KW
22#include "mbedtls/nist_kw.h"
23#endif
24
Roman Okhrimenko977b3752022-03-31 14:40:48 +030025#define BOOT_LOG_LEVEL BOOT_LOG_LEVEL_ERROR
David Brown75fd5dc2017-05-04 09:04:47 -060026#include <bootutil/bootutil_log.h>
Roman Okhrimenko977b3752022-03-31 14:40:48 +030027#include "bootutil/crypto/common.h"
David Brown75fd5dc2017-05-04 09:04:47 -060028
David Vincze6c9b4162019-03-21 19:18:08 +010029#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
30
Fabio Utzig8000e322019-08-05 08:14:32 -030031struct area_desc;
32extern struct area_desc *sim_get_flash_areas(void);
33extern void sim_set_flash_areas(struct area_desc *areas);
34extern void sim_reset_flash_areas(void);
35
36struct sim_context;
37extern struct sim_context *sim_get_context(void);
38extern void sim_set_context(struct sim_context *ctx);
39extern void sim_reset_context(void);
40
Fabio Utzig99dfc782018-10-15 15:10:55 -070041extern int sim_flash_erase(uint8_t flash_id, uint32_t offset, uint32_t size);
42extern int sim_flash_read(uint8_t flash_id, uint32_t offset, uint8_t *dest,
43 uint32_t size);
44extern int sim_flash_write(uint8_t flash_id, uint32_t offset, const uint8_t *src,
45 uint32_t size);
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +030046extern uint32_t sim_flash_align(uint8_t flash_id);
Fabio Utzig73ffc442018-10-24 21:49:09 -030047extern uint8_t sim_flash_erased_val(uint8_t flash_id);
David Brownde7729e2017-01-09 10:41:35 -070048
Fabio Utzig8000e322019-08-05 08:14:32 -030049struct sim_context {
50 int flash_counter;
51 int jumped;
52 uint8_t c_asserts;
53 uint8_t c_catch_asserts;
54 jmp_buf boot_jmpbuf;
55};
David Brownde7729e2017-01-09 10:41:35 -070056
Fabio Utzig1e48b912018-09-18 09:04:18 -030057#ifdef MCUBOOT_ENCRYPT_RSA
58static int
59parse_pubkey(mbedtls_rsa_context *ctx, uint8_t **p, uint8_t *end)
60{
61 int rc;
62 size_t len;
63
64 if ((rc = mbedtls_asn1_get_tag(p, end, &len,
65 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
66 return -1;
67 }
68
69 if (*p + len != end) {
70 return -2;
71 }
72
73 if ((rc = mbedtls_asn1_get_tag(p, end, &len,
74 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
75 return -3;
76 }
77
78 *p += len;
79
80 if ((rc = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
81 return -4;
82 }
83
84 if (**p != MBEDTLS_ASN1_PRIMITIVE) {
85 return -5;
86 }
87
88 *p += 1;
89
90 if ((rc = mbedtls_asn1_get_tag(p, end, &len,
91 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
92 return -6;
93 }
94
Roman Okhrimenko977b3752022-03-31 14:40:48 +030095 if (mbedtls_asn1_get_mpi(p, end, &ctx->MBEDTLS_CONTEXT_MEMBER(N)) != 0) {
Fabio Utzig1e48b912018-09-18 09:04:18 -030096 return -7;
97 }
98
Roman Okhrimenko977b3752022-03-31 14:40:48 +030099 if (mbedtls_asn1_get_mpi(p, end, &ctx->MBEDTLS_CONTEXT_MEMBER(E)) != 0) {
Fabio Utzig1e48b912018-09-18 09:04:18 -0300100 return -8;
101 }
102
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300103 ctx->MBEDTLS_CONTEXT_MEMBER(len) = mbedtls_mpi_size(&ctx->MBEDTLS_CONTEXT_MEMBER(N));
Fabio Utzig1e48b912018-09-18 09:04:18 -0300104
105 if (*p != end) {
106 return -9;
107 }
108
109 if (mbedtls_rsa_check_pubkey(ctx) != 0) {
110 return -10;
111 }
112
113 return 0;
114}
115
116static int
117fake_rng(void *p_rng, unsigned char *output, size_t len)
118{
119 size_t i;
120
121 (void)p_rng;
122 for (i = 0; i < len; i++) {
123 output[i] = (char)i;
124 }
125
126 return 0;
127}
128#endif
129
130int mbedtls_platform_set_calloc_free(void * (*calloc_func)(size_t, size_t),
131 void (*free_func)(void *));
132
133int rsa_oaep_encrypt_(const uint8_t *pubkey, unsigned pubkey_len,
134 const uint8_t *seckey, unsigned seckey_len,
135 uint8_t *encbuf)
136{
137#ifdef MCUBOOT_ENCRYPT_RSA
138 mbedtls_rsa_context ctx;
139 uint8_t *cp;
140 uint8_t *cpend;
141 int rc;
142
143 mbedtls_platform_set_calloc_free(calloc, free);
144
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300145#if MBEDTLS_VERSION_NUMBER >= 0x03000000
146 mbedtls_rsa_init(&ctx);
147 mbedtls_rsa_set_padding(&ctx, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256);
148#else
Fabio Utzig1e48b912018-09-18 09:04:18 -0300149 mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256);
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300150#endif
Fabio Utzig1e48b912018-09-18 09:04:18 -0300151
152 cp = (uint8_t *)pubkey;
153 cpend = cp + pubkey_len;
154
155 rc = parse_pubkey(&ctx, &cp, cpend);
156 if (rc) {
157 goto done;
158 }
159
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300160#if MBEDTLS_VERSION_NUMBER >= 0x03000000
161 rc = mbedtls_rsa_rsaes_oaep_encrypt(&ctx, fake_rng, NULL,
162 NULL, 0, seckey_len, seckey, encbuf);
163#else
Fabio Utzig1e48b912018-09-18 09:04:18 -0300164 rc = mbedtls_rsa_rsaes_oaep_encrypt(&ctx, fake_rng, NULL, MBEDTLS_RSA_PUBLIC,
165 NULL, 0, seckey_len, seckey, encbuf);
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300166#endif
Fabio Utzig1e48b912018-09-18 09:04:18 -0300167 if (rc) {
168 goto done;
169 }
170
171done:
172 mbedtls_rsa_free(&ctx);
173 return rc;
174
175#else
176 (void)pubkey;
177 (void)pubkey_len;
178 (void)seckey;
179 (void)seckey_len;
180 (void)encbuf;
181 return 0;
182#endif
183}
184
185int kw_encrypt_(const uint8_t *kek, const uint8_t *seckey, uint8_t *encbuf)
186{
187#ifdef MCUBOOT_ENCRYPT_KW
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300188#ifdef MCUBOOT_AES_256
189 int key_len = 256;
190 int out_size = 40;
191 int in_len = 32;
192#else
193 int key_len = 128;
194 int out_size = 24;
195 int in_len = 16;
196#endif
Fabio Utzig1e48b912018-09-18 09:04:18 -0300197 mbedtls_nist_kw_context kw;
198 size_t olen;
199 int rc;
200
201 mbedtls_platform_set_calloc_free(calloc, free);
202
203 mbedtls_nist_kw_init(&kw);
204
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300205 rc = mbedtls_nist_kw_setkey(&kw, MBEDTLS_CIPHER_ID_AES, kek, key_len, 1);
Fabio Utzig1e48b912018-09-18 09:04:18 -0300206 if (rc) {
207 goto done;
208 }
209
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300210 rc = mbedtls_nist_kw_wrap(&kw, MBEDTLS_KW_MODE_KW, seckey, in_len, encbuf,
211 &olen, out_size);
Fabio Utzig1e48b912018-09-18 09:04:18 -0300212
213done:
214 mbedtls_nist_kw_free(&kw);
215 return rc;
216
217#else
218 (void)kek;
219 (void)seckey;
220 (void)encbuf;
221 return 0;
222#endif
223}
224
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300225uint32_t flash_area_align(const struct flash_area *area)
David Brown5acda262017-01-23 15:42:19 -0700226{
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300227 return (size_t)sim_flash_align(area->fa_device_id);
David Brown5acda262017-01-23 15:42:19 -0700228}
229
Fabio Utzigea0290b2018-08-09 14:23:01 -0300230uint8_t flash_area_erased_val(const struct flash_area *area)
231{
Fabio Utzig73ffc442018-10-24 21:49:09 -0300232 return sim_flash_erased_val(area->fa_device_id);
Fabio Utzigea0290b2018-08-09 14:23:01 -0300233}
234
David Brownde7729e2017-01-09 10:41:35 -0700235struct area {
David Brown7ad80882017-06-20 15:30:36 -0600236 struct flash_area whole;
237 struct flash_area *areas;
238 uint32_t num_areas;
239 uint8_t id;
David Brownde7729e2017-01-09 10:41:35 -0700240};
241
242struct area_desc {
David Brown7ad80882017-06-20 15:30:36 -0600243 struct area slots[16];
244 uint32_t num_slots;
David Brownde7729e2017-01-09 10:41:35 -0700245};
246
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300247int invoke_boot_go(struct sim_context *ctx, struct area_desc *adesc,
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300248 struct boot_rsp *rsp, int image_id)
David Brownde7729e2017-01-09 10:41:35 -0700249{
David Brown7ad80882017-06-20 15:30:36 -0600250 int res;
Fabio Utzig8000e322019-08-05 08:14:32 -0300251 struct boot_loader_state *state;
David Brownde7729e2017-01-09 10:41:35 -0700252
David Brown641af452021-02-19 12:16:48 -0700253#if defined(MCUBOOT_SIGN_RSA) || \
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300254 (defined(MCUBOOT_SIGN_EC256) && defined(MCUBOOT_USE_MBED_TLS)) ||\
255 (defined(MCUBOOT_ENCRYPT_EC256) && defined(MCUBOOT_USE_MBED_TLS)) ||\
256 (defined(MCUBOOT_ENCRYPT_X25519) && defined(MCUBOOT_USE_MBED_TLS))
Fabio Utzigb04afa92018-09-12 15:27:04 -0300257 mbedtls_platform_set_calloc_free(calloc, free);
258#endif
David Brown7e701d82017-07-11 13:24:25 -0600259
Fabio Utzig8000e322019-08-05 08:14:32 -0300260 state = malloc(sizeof(struct boot_loader_state));
261
262 sim_set_flash_areas(adesc);
263 sim_set_context(ctx);
264
265 if (setjmp(ctx->boot_jmpbuf) == 0) {
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300266 boot_state_clear(state);
267
268#if BOOT_IMAGE_NUMBER > 1
269 if (image_id >= 0) {
270 memset(state->img_mask, 1, sizeof(state->img_mask));
271 state->img_mask[image_id] = 0;
272 }
273#else
274 (void) image_id;
275#endif /* BOOT_IMAGE_NUMBER > 1 */
276
277#if defined(MCUBOOT_RAM_LOAD)
278 res = context_boot_go_ram(state, rsp);
279#else
280 res = context_boot_go_flash(state, rsp);
281#endif
Fabio Utzig8000e322019-08-05 08:14:32 -0300282 sim_reset_flash_areas();
283 sim_reset_context();
284 free(state);
David Brown7ad80882017-06-20 15:30:36 -0600285 /* printf("boot_go off: %d (0x%08x)\n", res, rsp.br_image_off); */
286 return res;
287 } else {
Fabio Utzig8000e322019-08-05 08:14:32 -0300288 sim_reset_flash_areas();
289 sim_reset_context();
290 free(state);
David Brown7ad80882017-06-20 15:30:36 -0600291 return -0x13579;
292 }
David Brownde7729e2017-01-09 10:41:35 -0700293}
294
David Brownde7729e2017-01-09 10:41:35 -0700295void *os_malloc(size_t size)
296{
David Brown7ad80882017-06-20 15:30:36 -0600297 // printf("os_malloc 0x%x bytes\n", size);
298 return malloc(size);
David Brownde7729e2017-01-09 10:41:35 -0700299}
300
Fabio Utzigb0f04732019-07-31 09:49:19 -0300301int flash_area_id_from_multi_image_slot(int image_index, int slot)
David Brownde7729e2017-01-09 10:41:35 -0700302{
Fabio Utzigb0f04732019-07-31 09:49:19 -0300303 switch (slot) {
304 case 0: return FLASH_AREA_IMAGE_PRIMARY(image_index);
305 case 1: return FLASH_AREA_IMAGE_SECONDARY(image_index);
306 case 2: return FLASH_AREA_IMAGE_SCRATCH;
David Vincze6c9b4162019-03-21 19:18:08 +0100307 }
308
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300309 printf("Image flash area ID not found\n");
David Vincze6c9b4162019-03-21 19:18:08 +0100310 return -1; /* flash_area_open will fail on that */
David Brownde7729e2017-01-09 10:41:35 -0700311}
312
313int flash_area_open(uint8_t id, const struct flash_area **area)
314{
Fabio Utzigcd5774b2017-11-29 10:18:26 -0200315 uint32_t i;
Fabio Utzig8000e322019-08-05 08:14:32 -0300316 struct area_desc *flash_areas;
David Brownde7729e2017-01-09 10:41:35 -0700317
Fabio Utzig8000e322019-08-05 08:14:32 -0300318 flash_areas = sim_get_flash_areas();
David Brown7ad80882017-06-20 15:30:36 -0600319 for (i = 0; i < flash_areas->num_slots; i++) {
320 if (flash_areas->slots[i].id == id)
321 break;
322 }
323 if (i == flash_areas->num_slots) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300324 printf("Unsupported area\n");
David Brown7ad80882017-06-20 15:30:36 -0600325 abort();
326 }
David Brownde7729e2017-01-09 10:41:35 -0700327
David Brown7ad80882017-06-20 15:30:36 -0600328 /* Unsure if this is right, just returning the first area. */
329 *area = &flash_areas->slots[i].whole;
330 return 0;
David Brownde7729e2017-01-09 10:41:35 -0700331}
332
333void flash_area_close(const struct flash_area *area)
334{
Fabio Utzigcd5774b2017-11-29 10:18:26 -0200335 (void)area;
David Brownde7729e2017-01-09 10:41:35 -0700336}
337
338/*
339 * Read/write/erase. Offset is relative from beginning of flash area.
340 */
341int flash_area_read(const struct flash_area *area, uint32_t off, void *dst,
David Brown7ad80882017-06-20 15:30:36 -0600342 uint32_t len)
David Brownde7729e2017-01-09 10:41:35 -0700343{
Fabio Utzig6fa2d402019-12-10 14:34:18 -0300344 BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x",
David Brown7ad80882017-06-20 15:30:36 -0600345 __func__, area->fa_id, off, len);
Fabio Utzig99dfc782018-10-15 15:10:55 -0700346 return sim_flash_read(area->fa_device_id, area->fa_off + off, dst, len);
David Brownde7729e2017-01-09 10:41:35 -0700347}
348
349int flash_area_write(const struct flash_area *area, uint32_t off, const void *src,
David Brown7ad80882017-06-20 15:30:36 -0600350 uint32_t len)
David Brownde7729e2017-01-09 10:41:35 -0700351{
Fabio Utzig6fa2d402019-12-10 14:34:18 -0300352 BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x", __func__,
David Brown7ad80882017-06-20 15:30:36 -0600353 area->fa_id, off, len);
Fabio Utzig8000e322019-08-05 08:14:32 -0300354 struct sim_context *ctx = sim_get_context();
355 if (--(ctx->flash_counter) == 0) {
356 ctx->jumped++;
357 longjmp(ctx->boot_jmpbuf, 1);
Fabio Utzig99dfc782018-10-15 15:10:55 -0700358 }
359 return sim_flash_write(area->fa_device_id, area->fa_off + off, src, len);
David Brownde7729e2017-01-09 10:41:35 -0700360}
361
362int flash_area_erase(const struct flash_area *area, uint32_t off, uint32_t len)
363{
Fabio Utzig6fa2d402019-12-10 14:34:18 -0300364 BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x", __func__,
David Brown7ad80882017-06-20 15:30:36 -0600365 area->fa_id, off, len);
Fabio Utzig8000e322019-08-05 08:14:32 -0300366 struct sim_context *ctx = sim_get_context();
367 if (--(ctx->flash_counter) == 0) {
368 ctx->jumped++;
369 longjmp(ctx->boot_jmpbuf, 1);
Fabio Utzig99dfc782018-10-15 15:10:55 -0700370 }
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300371
372// Align offset and length to sector size
373#ifdef MCUBOOT_SWAP_USING_STATUS
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300374 uint32_t sect_off = off / MEMORY_ALIGN * MEMORY_ALIGN;
375 len = ((off + len - 1) / MEMORY_ALIGN + 1) * MEMORY_ALIGN - sect_off;
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300376 off = sect_off;
377 BOOT_LOG_SIM("%s: erase with aligment at area=%d, off=%x, len=%x", __func__, area->fa_id, off, len);
378#endif
379
Fabio Utzig99dfc782018-10-15 15:10:55 -0700380 return sim_flash_erase(area->fa_device_id, area->fa_off + off, len);
David Brownde7729e2017-01-09 10:41:35 -0700381}
382
383int flash_area_to_sectors(int idx, int *cnt, struct flash_area *ret)
384{
Fabio Utzigcd5774b2017-11-29 10:18:26 -0200385 uint32_t i;
David Brown7ad80882017-06-20 15:30:36 -0600386 struct area *slot;
Fabio Utzig8000e322019-08-05 08:14:32 -0300387 struct area_desc *flash_areas;
David Brownde7729e2017-01-09 10:41:35 -0700388
Fabio Utzig8000e322019-08-05 08:14:32 -0300389 flash_areas = sim_get_flash_areas();
David Brown7ad80882017-06-20 15:30:36 -0600390 for (i = 0; i < flash_areas->num_slots; i++) {
391 if (flash_areas->slots[i].id == idx)
392 break;
393 }
394 if (i == flash_areas->num_slots) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300395 printf("Unsupported area\n");
David Brown7ad80882017-06-20 15:30:36 -0600396 abort();
397 }
David Brownde7729e2017-01-09 10:41:35 -0700398
David Brown7ad80882017-06-20 15:30:36 -0600399 slot = &flash_areas->slots[i];
David Brownde7729e2017-01-09 10:41:35 -0700400
Fabio Utzigcd5774b2017-11-29 10:18:26 -0200401 if (slot->num_areas > (uint32_t)*cnt) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300402 printf("Too many areas in slot\n");
David Brown7ad80882017-06-20 15:30:36 -0600403 abort();
404 }
David Brownde7729e2017-01-09 10:41:35 -0700405
David Brown7ad80882017-06-20 15:30:36 -0600406 *cnt = slot->num_areas;
407 memcpy(ret, slot->areas, slot->num_areas * sizeof(struct flash_area));
David Brownde7729e2017-01-09 10:41:35 -0700408
David Brown7ad80882017-06-20 15:30:36 -0600409 return 0;
David Brownde7729e2017-01-09 10:41:35 -0700410}
411
David Brown60399f62017-05-11 10:20:34 -0600412int flash_area_get_sectors(int fa_id, uint32_t *count,
413 struct flash_sector *sectors)
414{
Fabio Utzigcd5774b2017-11-29 10:18:26 -0200415 uint32_t i;
David Brown7ad80882017-06-20 15:30:36 -0600416 struct area *slot;
Fabio Utzig8000e322019-08-05 08:14:32 -0300417 struct area_desc *flash_areas;
David Brown60399f62017-05-11 10:20:34 -0600418
Fabio Utzig8000e322019-08-05 08:14:32 -0300419 flash_areas = sim_get_flash_areas();
David Brown7ad80882017-06-20 15:30:36 -0600420 for (i = 0; i < flash_areas->num_slots; i++) {
421 if (flash_areas->slots[i].id == fa_id)
422 break;
423 }
424 if (i == flash_areas->num_slots) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300425 printf("Unsupported area\n");
David Brown7ad80882017-06-20 15:30:36 -0600426 abort();
427 }
David Brown60399f62017-05-11 10:20:34 -0600428
David Brown7ad80882017-06-20 15:30:36 -0600429 slot = &flash_areas->slots[i];
David Brown60399f62017-05-11 10:20:34 -0600430
David Brown7ad80882017-06-20 15:30:36 -0600431 if (slot->num_areas > *count) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300432 printf("Too many areas in slot\n");
David Brown7ad80882017-06-20 15:30:36 -0600433 abort();
434 }
David Brown60399f62017-05-11 10:20:34 -0600435
David Brown7ad80882017-06-20 15:30:36 -0600436 for (i = 0; i < slot->num_areas; i++) {
437 sectors[i].fs_off = slot->areas[i].fa_off -
438 slot->whole.fa_off;
439 sectors[i].fs_size = slot->areas[i].fa_size;
440 }
441 *count = slot->num_areas;
David Brown60399f62017-05-11 10:20:34 -0600442
David Brown7ad80882017-06-20 15:30:36 -0600443 return 0;
David Brown60399f62017-05-11 10:20:34 -0600444}
Fabio Utzig9b0ee902017-11-23 19:49:00 -0200445
Fabio Utzigb0f04732019-07-31 09:49:19 -0300446int flash_area_id_to_multi_image_slot(int image_index, int area_id)
Andrzej Puzdrowskie575fe92019-03-14 12:20:19 +0100447{
Fabio Utzigb0f04732019-07-31 09:49:19 -0300448 if (area_id == FLASH_AREA_IMAGE_PRIMARY(image_index)) {
Andrzej Puzdrowskie575fe92019-03-14 12:20:19 +0100449 return 0;
Andrzej Puzdrowskie575fe92019-03-14 12:20:19 +0100450 }
Fabio Utzigb0f04732019-07-31 09:49:19 -0300451 if (area_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) {
David Vinczeb75c12a2019-03-22 14:58:33 +0100452 return 1;
453 }
454
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300455 printf("Unsupported image area ID\n");
David Vinczeb75c12a2019-03-22 14:58:33 +0100456 abort();
Andrzej Puzdrowskie575fe92019-03-14 12:20:19 +0100457}
458
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300459uint8_t flash_area_get_device_id(const struct flash_area *fa)
460{
461 return fa->fa_device_id;
462}
463
464int flash_area_id_from_image_slot(int slot) {
465 /* For single image cases, just use the first image. */
466 return flash_area_id_from_multi_image_slot(0, slot);
467}
468
Fabio Utzig9b0ee902017-11-23 19:49:00 -0200469void sim_assert(int x, const char *assertion, const char *file, unsigned int line, const char *function)
470{
471 if (!(x)) {
Fabio Utzig8000e322019-08-05 08:14:32 -0300472 struct sim_context *ctx = sim_get_context();
473 if (ctx->c_catch_asserts) {
474 ctx->c_asserts++;
Fabio Utzig9b0ee902017-11-23 19:49:00 -0200475 } else {
476 BOOT_LOG_ERR("%s:%d: %s: Assertion `%s' failed.", file, line, function, assertion);
477
478 /* NOTE: if the assert below is triggered, the place where it was originally
479 * asserted is printed by the message above...
480 */
481 assert(x);
482 }
483 }
484}
David Browne0bb1f92019-10-01 15:57:01 -0600485
486uint32_t boot_max_align(void)
487{
488 return BOOT_MAX_ALIGN;
489}
David Brown2b8a6952019-10-01 16:14:53 -0600490
491uint32_t boot_magic_sz(void)
492{
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300493 return BOOT_MAGIC_ALIGN_SIZE;
David Brown2b8a6952019-10-01 16:14:53 -0600494}