blob: d0f1577bc84dbc59111d8a126757acd2ba716301 [file] [log] [blame]
Tamas Banf70ef8c2017-12-19 15:35:09 +00001/*
2 * Copyright (c) 2012-2014 Wind River Systems, Inc.
David Vincze225c58f2019-12-09 17:32:48 +01003 * Copyright (c) 2017-2020 Arm Limited.
Tamas Banf70ef8c2017-12-19 15:35:09 +00004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
Balint Matyi2fe04922020-02-18 12:27:38 +000018#include "mcuboot_config/mcuboot_config.h"
Tamas Banf70ef8c2017-12-19 15:35:09 +000019#include <assert.h>
Tamas Banf70ef8c2017-12-19 15:35:09 +000020#include "target.h"
Kevin Pengbc5e5aa2019-10-16 10:55:17 +080021#include "tfm_hal_device_header.h"
Tamas Banbd3f7512018-01-26 15:45:03 +000022#include "mbedtls/memory_buffer_alloc.h"
David Vincze7d591a62020-09-23 18:25:56 +020023#include "bootutil/security_cnt.h"
Tamas Banf70ef8c2017-12-19 15:35:09 +000024#include "bootutil/bootutil_log.h"
25#include "bootutil/image.h"
26#include "bootutil/bootutil.h"
Raef Coles8efad882020-07-10 09:46:00 +010027#include "bootutil/boot_record.h"
David Vincze7d591a62020-09-23 18:25:56 +020028#include "flash_map_backend/flash_map_backend.h"
David Vincze225c58f2019-12-09 17:32:48 +010029#include "boot_hal.h"
David Vincze73dfbc52019-10-11 13:54:58 +020030#include "uart_stdout.h"
Tamas Banf70ef8c2017-12-19 15:35:09 +000031
Tamas Ban581034a2017-12-19 19:54:37 +000032/* Avoids the semihosting issue */
33#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
34__asm(" .global __ARM_use_no_argv\n");
35#endif
36
Balint Matyi5c476312020-03-31 13:15:39 +010037#ifdef MCUBOOT_ENCRYPT_RSA
38#define BL2_MBEDTLS_MEM_BUF_LEN 0x225C
39#else
Tamas Banbd3f7512018-01-26 15:45:03 +000040#define BL2_MBEDTLS_MEM_BUF_LEN 0x2000
Balint Matyi5c476312020-03-31 13:15:39 +010041#endif
42
Tamas Banbd3f7512018-01-26 15:45:03 +000043/* Static buffer to be used by mbedtls for memory allocation */
44static uint8_t mbedtls_mem_buf[BL2_MBEDTLS_MEM_BUF_LEN];
Tamas Banf70ef8c2017-12-19 15:35:09 +000045
Tamas Banf70ef8c2017-12-19 15:35:09 +000046static void do_boot(struct boot_rsp *rsp)
47{
Michel Jaouen3ecd6222020-06-17 18:58:00 +020048 struct boot_arm_vector_table *vt;
Tamas Banf70ef8c2017-12-19 15:35:09 +000049 uintptr_t flash_base;
50 int rc;
51
52 /* The beginning of the image is the ARM vector table, containing
53 * the initial stack pointer address and the reset vector
54 * consecutively. Manually set the stack pointer and jump into the
55 * reset vector
56 */
57 rc = flash_device_base(rsp->br_flash_dev_id, &flash_base);
58 assert(rc == 0);
59
Oliver Swedef9982442018-08-24 18:37:44 +010060 if (rsp->br_hdr->ih_flags & IMAGE_F_RAM_LOAD) {
61 /* The image has been copied to SRAM, find the vector table
62 * at the load address instead of image's address in flash
63 */
Michel Jaouen3ecd6222020-06-17 18:58:00 +020064 vt = (struct boot_arm_vector_table *)(rsp->br_hdr->ih_load_addr +
Oliver Swedef9982442018-08-24 18:37:44 +010065 rsp->br_hdr->ih_hdr_size);
66 } else {
67 /* Using the flash address as not executing in SRAM */
Michel Jaouen3ecd6222020-06-17 18:58:00 +020068 vt = (struct boot_arm_vector_table *)(flash_base +
Oliver Swedef9982442018-08-24 18:37:44 +010069 rsp->br_image_off +
70 rsp->br_hdr->ih_hdr_size);
71 }
David Vinczeb57989f2018-09-24 10:59:04 +020072
David Vincze99f1b362019-12-12 16:17:35 +010073#if MCUBOOT_LOG_LEVEL > MCUBOOT_LOG_LEVEL_OFF
David Vincze8da7f102018-09-24 10:53:46 +020074 stdio_uninit();
David Vincze73dfbc52019-10-11 13:54:58 +020075#endif
David Vincze7d591a62020-09-23 18:25:56 +020076
Michel Jaouen3ecd6222020-06-17 18:58:00 +020077 /* This function never returns, because it calls the secure application
David Vincze7d591a62020-09-23 18:25:56 +020078 * Reset_Handler().
David Vinczee0a3c2f2019-05-15 16:45:14 +020079 */
Michel Jaouen3ecd6222020-06-17 18:58:00 +020080 boot_platform_quit(vt);
Tamas Banf70ef8c2017-12-19 15:35:09 +000081}
Tamas Banf70ef8c2017-12-19 15:35:09 +000082
Tamas Ban581034a2017-12-19 19:54:37 +000083int main(void)
Tamas Banf70ef8c2017-12-19 15:35:09 +000084{
85 struct boot_rsp rsp;
86 int rc;
87
David Vincze7d591a62020-09-23 18:25:56 +020088 /* Initialise the mbedtls static memory allocator so that mbedtls allocates
89 * memory from the provided static buffer instead of from the heap.
90 */
91 mbedtls_memory_buffer_alloc_init(mbedtls_mem_buf, BL2_MBEDTLS_MEM_BUF_LEN);
92
93#if MCUBOOT_LOG_LEVEL > MCUBOOT_LOG_LEVEL_OFF
94 stdio_init();
David Hu5cc9a3f2019-06-14 13:10:40 +080095#endif
David Vinczee0a3c2f2019-05-15 16:45:14 +020096
Andrei Narkevitchb0be4612020-01-27 17:26:19 -080097 /* Perform platform specific initialization */
98 if (boot_platform_init() != 0) {
Tamas Ban37aedb52020-10-01 10:54:48 +010099 BOOT_LOG_ERR("Platform init failed");
Andrei Narkevitchb0be4612020-01-27 17:26:19 -0800100 while (1)
101 ;
102 }
103
Tamas Banf70ef8c2017-12-19 15:35:09 +0000104 BOOT_LOG_INF("Starting bootloader");
105
David Vincze060968d2019-05-23 01:13:14 +0200106 rc = boot_nv_security_counter_init();
107 if (rc != 0) {
108 BOOT_LOG_ERR("Error while initializing the security counter");
109 while (1)
110 ;
111 }
112
Tamas Banf70ef8c2017-12-19 15:35:09 +0000113 rc = boot_go(&rsp);
114 if (rc != 0) {
115 BOOT_LOG_ERR("Unable to find bootable image");
116 while (1)
117 ;
118 }
119
120 BOOT_LOG_INF("Bootloader chainload address offset: 0x%x",
121 rsp.br_image_off);
Tamas Banf70ef8c2017-12-19 15:35:09 +0000122 BOOT_LOG_INF("Jumping to the first image slot");
123 do_boot(&rsp);
124
125 BOOT_LOG_ERR("Never should get here");
126 while (1)
127 ;
128}