blob: c5fa6b5727ea80f58f4ac8626c7e4a0fa5ac7b21 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Summer Qin95444822022-01-27 11:22:00 +08002 * Copyright (c) 2017-2022, Arm Limited. All rights reserved.
Miklos Balint386b8b52017-11-29 13:12:32 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Summer Qin9c1fba12020-08-12 15:49:12 +08008#include "arch.h"
David Hu9804b6a2021-02-15 21:23:06 +08009#include "fih.h"
Ken Liu55ba01f2021-01-20 17:34:50 +080010#include "ffm/tfm_boot_data.h"
TTornblom83d96372019-11-19 12:53:16 +010011#include "region.h"
Summer Qinf993cd42020-08-12 16:55:17 +080012#include "spm_func.h"
Mingyang Sun9763dee2020-12-07 10:45:17 +080013#include "tfm_hal_defs.h"
Summer Qin0eb7c912020-08-19 16:08:50 +080014#include "tfm_hal_platform.h"
Håkon Øye Amundsencf793942021-01-14 10:50:49 +010015#include "tfm_hal_isolation.h"
Summer Qin830c5542020-02-14 13:44:20 +080016#include "tfm_irq_list.h"
Summer Qin830c5542020-02-14 13:44:20 +080017#include "tfm_spm_hal.h"
Shawn Shanf5471ba2020-09-17 17:34:50 +080018#include "tfm_spm_log.h"
Summer Qin830c5542020-02-14 13:44:20 +080019#include "tfm_version.h"
Raef Colesaefbe082021-06-18 08:53:43 +010020#include "tfm_plat_otp.h"
21#include "tfm_plat_provisioning.h"
Miklos Balint386b8b52017-11-29 13:12:32 +000022
Miklos Balint386b8b52017-11-29 13:12:32 +000023/*
24 * Avoids the semihosting issue
25 * FixMe: describe 'semihosting issue'
26 */
27#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
28__asm(" .global __ARM_use_no_argv\n");
29#endif
30
31#ifndef TFM_LVL
32#error TFM_LVL is not defined!
Summer Qinf993cd42020-08-12 16:55:17 +080033#elif (TFM_LVL != 1)
Edison Aicb0ecf62019-07-10 18:43:51 +080034#error Only TFM_LVL 1 is supported for library model!
35#endif
Miklos Balint386b8b52017-11-29 13:12:32 +000036
Kevin Peng300c68d2021-08-12 17:40:17 +080037REGION_DECLARE(Image$$, ARM_LIB_STACK, $$ZI$$Base);
Michel Jaouenf373efb2021-09-17 15:36:19 +020038REGION_DECLARE(Image$$, ARM_LIB_STACK, $$ZI$$Limit)[];
39REGION_DECLARE(Image$$, ER_INITIAL_PSP, $$ZI$$Limit)[];
Mate Toth-Pal6bb416a2019-05-07 16:23:55 +020040
Summer Qin95444822022-01-27 11:22:00 +080041static void configure_ns_code(void)
42{
43 /* SCB_NS.VTOR points to the Non-secure vector table base address */
44 SCB_NS->VTOR = tfm_spm_hal_get_ns_VTOR();
45
46 /* Setups Main stack pointer of the non-secure code */
47 uint32_t ns_msp = tfm_spm_hal_get_ns_MSP();
48
49 __TZ_set_MSP_NS(ns_msp);
50
51 /* Get the address of non-secure code entry point to jump there */
52 uint32_t entry_ptr = tfm_spm_hal_get_ns_entry_point();
53
54 /* Clears LSB of the function address to indicate the function-call
55 * will perform the switch from secure to non-secure
56 */
57 ns_entry = (nsfptr_t)cmse_nsfptr_create(entry_ptr);
58}
59
David Hu9804b6a2021-02-15 21:23:06 +080060static fih_int tfm_core_init(void)
Miklos Balint386b8b52017-11-29 13:12:32 +000061{
Mate Toth-Pal4341de02018-10-02 12:55:47 +020062 size_t i;
Summer Qin0eb7c912020-08-19 16:08:50 +080063 enum tfm_hal_status_t hal_status = TFM_HAL_ERROR_GENERIC;
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020064 enum tfm_plat_err_t plat_err = TFM_PLAT_ERR_SYSTEM_ERR;
65 enum irq_target_state_t irq_target_state = TFM_IRQ_TARGET_STATE_SECURE;
David Hu9804b6a2021-02-15 21:23:06 +080066#ifdef TFM_FIH_PROFILE_ON
67 fih_int fih_rc = FIH_FAILURE;
68#endif
Mate Toth-Pal4341de02018-10-02 12:55:47 +020069
Jaykumar Pitambarbhai Patel98e6ce42020-01-06 12:42:42 +053070 /*
71 * Access to any peripheral should be performed after programming
72 * the necessary security components such as PPC/SAU.
73 */
David Hu9804b6a2021-02-15 21:23:06 +080074#ifdef TFM_FIH_PROFILE_ON
75 FIH_CALL(tfm_hal_set_up_static_boundaries, fih_rc);
76 if (fih_not_eq(fih_rc, fih_int_encode(TFM_HAL_SUCCESS))) {
77 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
78 }
79#else /* TFM_FIH_PROFILE_ON */
Mingyang Sun9763dee2020-12-07 10:45:17 +080080 hal_status = tfm_hal_set_up_static_boundaries();
81 if (hal_status != TFM_HAL_SUCCESS) {
Jaykumar Pitambarbhai Patel98e6ce42020-01-06 12:42:42 +053082 return TFM_ERROR_GENERIC;
83 }
David Hu9804b6a2021-02-15 21:23:06 +080084#endif /* TFM_FIH_PROFILE_ON */
Jaykumar Pitambarbhai Patel98e6ce42020-01-06 12:42:42 +053085
Kevin Pengc8555732021-09-24 15:15:21 +080086#ifdef TFM_FIH_PROFILE_ON
87 FIH_CALL(tfm_hal_platform_init, fih_rc);
88 if (fih_not_eq(fih_rc, fih_int_encode(TFM_HAL_SUCCESS))) {
David Hu9804b6a2021-02-15 21:23:06 +080089 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Andrei Narkevitch5bba54c2019-09-23 14:09:13 -070090 }
Kevin Pengc8555732021-09-24 15:15:21 +080091#else /* TFM_FIH_PROFILE_ON */
92 hal_status = tfm_hal_platform_init();
93 if (hal_status != TFM_HAL_SUCCESS) {
94 return TFM_ERROR_GENERIC;
95 }
96#endif /* TFM_FIH_PROFILE_ON */
Miklos Balint386b8b52017-11-29 13:12:32 +000097
Raef Colesaefbe082021-06-18 08:53:43 +010098 plat_err = tfm_plat_otp_init();
99 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
100 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
101 }
102
103 /* Perform provisioning. */
104 if (tfm_plat_provisioning_is_required()) {
105 plat_err = tfm_plat_provisioning_perform();
106 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
107 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
108 }
109 } else {
110 tfm_plat_provisioning_check_for_dummy_keys();
111 }
112
Summer Qindea1f2c2021-01-11 14:46:34 +0800113 /* Configures architecture */
114 tfm_arch_config_extensions();
Jamie Fox45587672020-08-17 18:31:14 +0100115
Shawn Shanf5471ba2020-09-17 17:34:50 +0800116 SPMLOG_INFMSG("\033[1;34m[Sec Thread] Secure image initializing!\033[0m\r\n");
Miklos Balint6cbeba62018-04-12 17:31:34 +0200117
Shawn Shanf5471ba2020-09-17 17:34:50 +0800118 SPMLOG_DBGMSGVAL("TF-M isolation level is: ", TFM_LVL);
Miklos Balint386b8b52017-11-29 13:12:32 +0000119
Tamas Ban9ff535b2018-09-18 08:15:18 +0100120 tfm_core_validate_boot_data();
121
Miklos Balint386b8b52017-11-29 13:12:32 +0000122 configure_ns_code();
123
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200124 for (i = 0; i < tfm_core_irq_signals_count; ++i) {
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200125 plat_err = tfm_spm_hal_set_secure_irq_priority(
Kevin Peng0979b0e2021-06-15 10:54:53 +0800126 tfm_core_irq_signals[i].irq_line);
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200127 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +0800128 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200129 }
130 irq_target_state = tfm_spm_hal_set_irq_target_state(
131 tfm_core_irq_signals[i].irq_line,
132 TFM_IRQ_TARGET_STATE_SECURE);
133 if (irq_target_state != TFM_IRQ_TARGET_STATE_SECURE) {
David Hu9804b6a2021-02-15 21:23:06 +0800134 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200135 }
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200136 }
137
David Hu9804b6a2021-02-15 21:23:06 +0800138 FIH_RET(fih_int_encode(TFM_SUCCESS));
Miklos Balint386b8b52017-11-29 13:12:32 +0000139}
140
Kevin Peng300c68d2021-08-12 17:40:17 +0800141__attribute__((naked))
Miklos Balint386b8b52017-11-29 13:12:32 +0000142int main(void)
143{
Kevin Peng300c68d2021-08-12 17:40:17 +0800144 __ASM volatile(
145#if !defined(__ICCARM__)
146 ".syntax unified \n"
147#endif
Michel Jaouenf373efb2021-09-17 15:36:19 +0200148 "msr msp, %0 \n"
149 "msr psp, %1 \n"
Kevin Peng300c68d2021-08-12 17:40:17 +0800150 "mrs r0, control \n"
151 "movs r1, #2 \n"
152 "orrs r0, r0, r1 \n" /* Switch to PSP */
153 "msr control, r0 \n"
154 "bl c_main \n"
Michel Jaouenf373efb2021-09-17 15:36:19 +0200155 :
156 : "r" (REGION_NAME(Image$$, ARM_LIB_STACK, $$ZI$$Limit)),
157 "r" (REGION_NAME(Image$$, ER_INITIAL_PSP, $$ZI$$Limit))
158 : "r0", "memory"
Kevin Peng300c68d2021-08-12 17:40:17 +0800159 );
160}
161
162int c_main(void)
163{
David Hu9804b6a2021-02-15 21:23:06 +0800164 enum spm_err_t spm_err = SPM_ERR_GENERIC_ERR;
165 fih_int fih_rc = FIH_FAILURE;
166
Mate Toth-Pal6bb416a2019-05-07 16:23:55 +0200167 /* set Main Stack Pointer limit */
Ken Liu05e13ba2020-07-25 10:31:33 +0800168 tfm_arch_init_secure_msp((uint32_t)&REGION_NAME(Image$$,
Kevin Peng300c68d2021-08-12 17:40:17 +0800169 ARM_LIB_STACK,
Ken Liu05e13ba2020-07-25 10:31:33 +0800170 $$ZI$$Base));
Mate Toth-Pal6bb416a2019-05-07 16:23:55 +0200171
Soby Mathew960521a2020-09-29 12:48:50 +0100172 /* Seal the PSP stacks viz ARM_LIB_STACK and TFM_SECURE_STACK */
173 tfm_spm_seal_psp_stacks();
174
David Hu9804b6a2021-02-15 21:23:06 +0800175 fih_delay_init();
176
177 FIH_CALL(tfm_core_init, fih_rc);
178 if (fih_not_eq(fih_rc, fih_int_encode(TFM_SUCCESS))) {
Edison Ai9059ea02019-11-28 13:46:14 +0800179 tfm_core_panic();
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000180 }
David Hu9804b6a2021-02-15 21:23:06 +0800181
Raef Coles0241dc62020-12-22 11:50:02 +0000182 /* All isolation should have been set up at this point */
183 FIH_LABEL_CRITICAL_POINT();
184
Soby Mathewc64adbc2020-03-11 12:33:44 +0000185 /* Print the TF-M version */
Anton Komlev2d2a6fc2022-02-20 15:47:53 +0000186 SPMLOG_INFMSG("\033[1;34mBooting TF-M "VERSION_FULLSTR"\033[0m\r\n");
Miklos Balint386b8b52017-11-29 13:12:32 +0000187
David Hu9804b6a2021-02-15 21:23:06 +0800188 spm_err = tfm_spm_db_init();
189 if (spm_err != SPM_ERR_OK) {
Edison Ai9059ea02019-11-28 13:46:14 +0800190 tfm_core_panic();
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000191 }
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200192
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100193 tfm_spm_partition_set_state(TFM_SP_CORE_ID, SPM_PARTITION_STATE_RUNNING);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100194
Kevin Peng300c68d2021-08-12 17:40:17 +0800195 REGION_DECLARE(Image$$, ER_INITIAL_PSP, $$ZI$$Base)[];
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200196 uint32_t psp_stack_bottom =
Kevin Peng300c68d2021-08-12 17:40:17 +0800197 (uint32_t)REGION_NAME(Image$$, ER_INITIAL_PSP, $$ZI$$Base);
Miklos Balint386b8b52017-11-29 13:12:32 +0000198
David Hue05b6a62019-06-12 18:45:28 +0800199 tfm_arch_set_psplim(psp_stack_bottom);
Miklos Balint386b8b52017-11-29 13:12:32 +0000200
David Hu9804b6a2021-02-15 21:23:06 +0800201 FIH_CALL(tfm_spm_partition_init, fih_rc);
202 if (fih_not_eq(fih_rc, fih_int_encode(SPM_ERR_OK))) {
Miklos Balint6a139ae2018-04-04 19:44:37 +0200203 /* Certain systems might refuse to boot altogether if partitions fail
204 * to initialize. This is a placeholder for such an error handler
205 */
206 }
207
Ken Liu96714b32019-04-08 15:10:39 +0800208 /*
209 * Prioritise secure exceptions to avoid NS being able to pre-empt
210 * secure SVC or SecureFault. Do it before PSA API initialization.
211 */
Ken Liu50e21092020-10-14 16:42:15 +0800212 tfm_arch_set_secure_exception_priorities();
Ken Liu96714b32019-04-08 15:10:39 +0800213
Edison Ai4d66dc32019-02-18 17:58:49 +0800214 /* We close the TFM_SP_CORE_ID partition, because its only purpose is
215 * to be able to pass the state checks for the tests started from secure.
216 */
217 tfm_spm_partition_set_state(TFM_SP_CORE_ID, SPM_PARTITION_STATE_CLOSED);
218 tfm_spm_partition_set_state(TFM_SP_NON_SECURE_ID,
219 SPM_PARTITION_STATE_RUNNING);
Edison Ai4dcae6f2019-03-18 10:13:47 +0800220
David Hu9804b6a2021-02-15 21:23:06 +0800221#ifdef TFM_FIH_PROFILE_ON
Kevin Peng38788a12021-09-08 16:23:50 +0800222 FIH_CALL(tfm_hal_verify_static_boundaries, fih_rc);
223 if (fih_not_eq(fih_rc, fih_int_encode(TFM_HAL_SUCCESS))) {
David Hu9804b6a2021-02-15 21:23:06 +0800224 tfm_core_panic();
225 }
226#endif
227
Edison Ai4dcae6f2019-03-18 10:13:47 +0800228#ifdef TFM_CORE_DEBUG
229 /* Jumps to non-secure code */
Shawn Shanf5471ba2020-09-17 17:34:50 +0800230 SPMLOG_DBGMSG("\033[1;34mJumping to non-secure code...\033[0m\r\n");
Edison Ai4dcae6f2019-03-18 10:13:47 +0800231#endif
232
233 jump_to_ns_code();
Kevin Peng300c68d2021-08-12 17:40:17 +0800234
235 return 0;
Miklos Balint386b8b52017-11-29 13:12:32 +0000236}