blob: 047207eaa90a75d5f5d2968435321994f6a8f8d7 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Ken Liu55ba01f2021-01-20 17:34:50 +08002 * Copyright (c) 2017-2021, 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"
17#include "tfm_nspm.h"
18#include "tfm_spm_hal.h"
Shawn Shanf5471ba2020-09-17 17:34:50 +080019#include "tfm_spm_log.h"
Summer Qin830c5542020-02-14 13:44:20 +080020#include "tfm_version.h"
Miklos Balint386b8b52017-11-29 13:12:32 +000021
Miklos Balint386b8b52017-11-29 13:12:32 +000022/*
23 * Avoids the semihosting issue
24 * FixMe: describe 'semihosting issue'
25 */
26#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
27__asm(" .global __ARM_use_no_argv\n");
28#endif
29
30#ifndef TFM_LVL
31#error TFM_LVL is not defined!
Summer Qinf993cd42020-08-12 16:55:17 +080032#elif (TFM_LVL != 1)
Edison Aicb0ecf62019-07-10 18:43:51 +080033#error Only TFM_LVL 1 is supported for library model!
34#endif
Miklos Balint386b8b52017-11-29 13:12:32 +000035
Mate Toth-Pal6bb416a2019-05-07 16:23:55 +020036REGION_DECLARE(Image$$, ARM_LIB_STACK_MSP, $$ZI$$Base);
37
David Hu9804b6a2021-02-15 21:23:06 +080038static fih_int tfm_core_init(void)
Miklos Balint386b8b52017-11-29 13:12:32 +000039{
Mate Toth-Pal4341de02018-10-02 12:55:47 +020040 size_t i;
Summer Qin0eb7c912020-08-19 16:08:50 +080041 enum tfm_hal_status_t hal_status = TFM_HAL_ERROR_GENERIC;
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020042 enum tfm_plat_err_t plat_err = TFM_PLAT_ERR_SYSTEM_ERR;
43 enum irq_target_state_t irq_target_state = TFM_IRQ_TARGET_STATE_SECURE;
David Hu9804b6a2021-02-15 21:23:06 +080044#ifdef TFM_FIH_PROFILE_ON
45 fih_int fih_rc = FIH_FAILURE;
46#endif
Mate Toth-Pal4341de02018-10-02 12:55:47 +020047
Miklos Balint386b8b52017-11-29 13:12:32 +000048 /* Enables fault handlers */
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020049 plat_err = tfm_spm_hal_enable_fault_handlers();
50 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +080051 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020052 }
Miklos Balint386b8b52017-11-29 13:12:32 +000053
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +010054 /* Configures the system reset request properties */
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020055 plat_err = tfm_spm_hal_system_reset_cfg();
56 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +080057 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020058 }
Marc Moreno Berengue8e0fa7a2018-10-04 18:25:13 +010059
Marc Moreno Berengued584b612018-11-26 11:46:31 +000060 /* Configures debug authentication */
David Hu9804b6a2021-02-15 21:23:06 +080061#ifdef TFM_FIH_PROFILE_ON
62 FIH_CALL(tfm_spm_hal_init_debug, fih_rc);
63 if (fih_not_eq(fih_rc, fih_int_encode(TFM_PLAT_ERR_SUCCESS))) {
64 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
65 }
66#else /* TFM_FIH_PROFILE_ON */
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +020067 plat_err = tfm_spm_hal_init_debug();
68 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
69 return TFM_ERROR_GENERIC;
70 }
David Hu9804b6a2021-02-15 21:23:06 +080071#endif /* TFM_FIH_PROFILE_ON */
Miklos Balint386b8b52017-11-29 13:12:32 +000072
Jaykumar Pitambarbhai Patel98e6ce42020-01-06 12:42:42 +053073 /*
74 * Access to any peripheral should be performed after programming
75 * the necessary security components such as PPC/SAU.
76 */
David Hu9804b6a2021-02-15 21:23:06 +080077#ifdef TFM_FIH_PROFILE_ON
78 FIH_CALL(tfm_hal_set_up_static_boundaries, fih_rc);
79 if (fih_not_eq(fih_rc, fih_int_encode(TFM_HAL_SUCCESS))) {
80 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
81 }
82#else /* TFM_FIH_PROFILE_ON */
Mingyang Sun9763dee2020-12-07 10:45:17 +080083 hal_status = tfm_hal_set_up_static_boundaries();
84 if (hal_status != TFM_HAL_SUCCESS) {
Jaykumar Pitambarbhai Patel98e6ce42020-01-06 12:42:42 +053085 return TFM_ERROR_GENERIC;
86 }
David Hu9804b6a2021-02-15 21:23:06 +080087#endif /* TFM_FIH_PROFILE_ON */
Jaykumar Pitambarbhai Patel98e6ce42020-01-06 12:42:42 +053088
Andrei Narkevitch5bba54c2019-09-23 14:09:13 -070089 /* Performs platform specific initialization */
Summer Qin0eb7c912020-08-19 16:08:50 +080090 hal_status = tfm_hal_platform_init();
91 if (hal_status != TFM_HAL_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +080092 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Andrei Narkevitch5bba54c2019-09-23 14:09:13 -070093 }
Miklos Balint386b8b52017-11-29 13:12:32 +000094
Summer Qindea1f2c2021-01-11 14:46:34 +080095 /* Configures architecture */
96 tfm_arch_config_extensions();
Jamie Fox45587672020-08-17 18:31:14 +010097
Shawn Shanf5471ba2020-09-17 17:34:50 +080098 SPMLOG_INFMSG("\033[1;34m[Sec Thread] Secure image initializing!\033[0m\r\n");
Miklos Balint6cbeba62018-04-12 17:31:34 +020099
Shawn Shanf5471ba2020-09-17 17:34:50 +0800100 SPMLOG_DBGMSGVAL("TF-M isolation level is: ", TFM_LVL);
Miklos Balint386b8b52017-11-29 13:12:32 +0000101
Tamas Ban9ff535b2018-09-18 08:15:18 +0100102 tfm_core_validate_boot_data();
103
Miklos Balint386b8b52017-11-29 13:12:32 +0000104 configure_ns_code();
105
106 /* Configures all interrupts to retarget NS state, except for
107 * secure peripherals
108 */
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200109 plat_err = tfm_spm_hal_nvic_interrupt_target_state_cfg();
110 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +0800111 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200112 }
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200113
114 for (i = 0; i < tfm_core_irq_signals_count; ++i) {
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200115 plat_err = tfm_spm_hal_set_secure_irq_priority(
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200116 tfm_core_irq_signals[i].irq_line,
117 tfm_core_irq_signals[i].irq_priority);
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200118 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +0800119 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200120 }
121 irq_target_state = tfm_spm_hal_set_irq_target_state(
122 tfm_core_irq_signals[i].irq_line,
123 TFM_IRQ_TARGET_STATE_SECURE);
124 if (irq_target_state != TFM_IRQ_TARGET_STATE_SECURE) {
David Hu9804b6a2021-02-15 21:23:06 +0800125 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200126 }
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200127 }
128
Miklos Balint386b8b52017-11-29 13:12:32 +0000129 /* Enable secure peripherals interrupts */
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200130 plat_err = tfm_spm_hal_nvic_interrupt_enable();
131 if (plat_err != TFM_PLAT_ERR_SUCCESS) {
David Hu9804b6a2021-02-15 21:23:06 +0800132 FIH_RET(fih_int_encode(TFM_ERROR_GENERIC));
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200133 }
Miklos Balint386b8b52017-11-29 13:12:32 +0000134
David Hu9804b6a2021-02-15 21:23:06 +0800135 FIH_RET(fih_int_encode(TFM_SUCCESS));
Miklos Balint386b8b52017-11-29 13:12:32 +0000136}
137
138int main(void)
139{
David Hu9804b6a2021-02-15 21:23:06 +0800140 enum spm_err_t spm_err = SPM_ERR_GENERIC_ERR;
141 fih_int fih_rc = FIH_FAILURE;
142
Mate Toth-Pal6bb416a2019-05-07 16:23:55 +0200143 /* set Main Stack Pointer limit */
Ken Liu05e13ba2020-07-25 10:31:33 +0800144 tfm_arch_init_secure_msp((uint32_t)&REGION_NAME(Image$$,
145 ARM_LIB_STACK_MSP,
146 $$ZI$$Base));
Mate Toth-Pal6bb416a2019-05-07 16:23:55 +0200147
Soby Mathew960521a2020-09-29 12:48:50 +0100148 /* Seal the PSP stacks viz ARM_LIB_STACK and TFM_SECURE_STACK */
149 tfm_spm_seal_psp_stacks();
150
David Hu9804b6a2021-02-15 21:23:06 +0800151 fih_delay_init();
152
153 FIH_CALL(tfm_core_init, fih_rc);
154 if (fih_not_eq(fih_rc, fih_int_encode(TFM_SUCCESS))) {
Edison Ai9059ea02019-11-28 13:46:14 +0800155 tfm_core_panic();
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000156 }
David Hu9804b6a2021-02-15 21:23:06 +0800157
Raef Coles0241dc62020-12-22 11:50:02 +0000158 /* All isolation should have been set up at this point */
159 FIH_LABEL_CRITICAL_POINT();
160
Soby Mathewc64adbc2020-03-11 12:33:44 +0000161 /* Print the TF-M version */
Shawn Shan45578e92020-10-19 17:50:02 +0800162 SPMLOG_INFMSG("\033[1;34mBooting TFM v"VERSION_FULLSTR"\033[0m\r\n");
Miklos Balint386b8b52017-11-29 13:12:32 +0000163
David Hu9804b6a2021-02-15 21:23:06 +0800164 spm_err = tfm_spm_db_init();
165 if (spm_err != SPM_ERR_OK) {
Edison Ai9059ea02019-11-28 13:46:14 +0800166 tfm_core_panic();
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000167 }
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200168
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100169 tfm_spm_partition_set_state(TFM_SP_CORE_ID, SPM_PARTITION_STATE_RUNNING);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100170
TTornblomc640e072019-06-14 14:33:51 +0200171 REGION_DECLARE(Image$$, ARM_LIB_STACK, $$ZI$$Base)[];
Mate Toth-Pal5d3ae082019-07-10 16:14:14 +0200172 uint32_t psp_stack_bottom =
173 (uint32_t)REGION_NAME(Image$$, ARM_LIB_STACK, $$ZI$$Base);
Miklos Balint386b8b52017-11-29 13:12:32 +0000174
David Hue05b6a62019-06-12 18:45:28 +0800175 tfm_arch_set_psplim(psp_stack_bottom);
Miklos Balint386b8b52017-11-29 13:12:32 +0000176
David Hu9804b6a2021-02-15 21:23:06 +0800177 FIH_CALL(tfm_spm_partition_init, fih_rc);
178 if (fih_not_eq(fih_rc, fih_int_encode(SPM_ERR_OK))) {
Miklos Balint6a139ae2018-04-04 19:44:37 +0200179 /* Certain systems might refuse to boot altogether if partitions fail
180 * to initialize. This is a placeholder for such an error handler
181 */
182 }
183
Ken Liu96714b32019-04-08 15:10:39 +0800184 /*
185 * Prioritise secure exceptions to avoid NS being able to pre-empt
186 * secure SVC or SecureFault. Do it before PSA API initialization.
187 */
Ken Liu50e21092020-10-14 16:42:15 +0800188 tfm_arch_set_secure_exception_priorities();
Ken Liu96714b32019-04-08 15:10:39 +0800189
Edison Ai4d66dc32019-02-18 17:58:49 +0800190 /* We close the TFM_SP_CORE_ID partition, because its only purpose is
191 * to be able to pass the state checks for the tests started from secure.
192 */
193 tfm_spm_partition_set_state(TFM_SP_CORE_ID, SPM_PARTITION_STATE_CLOSED);
194 tfm_spm_partition_set_state(TFM_SP_NON_SECURE_ID,
195 SPM_PARTITION_STATE_RUNNING);
Edison Ai4dcae6f2019-03-18 10:13:47 +0800196
David Hu9804b6a2021-02-15 21:23:06 +0800197#ifdef TFM_FIH_PROFILE_ON
198 FIH_CALL(tfm_spm_hal_verify_isolation_hw, fih_rc);
199 if (fih_not_eq(fih_rc, fih_int_encode(TFM_PLAT_ERR_SUCCESS))) {
200 tfm_core_panic();
201 }
202#endif
203
Edison Ai4dcae6f2019-03-18 10:13:47 +0800204#ifdef TFM_CORE_DEBUG
205 /* Jumps to non-secure code */
Shawn Shanf5471ba2020-09-17 17:34:50 +0800206 SPMLOG_DBGMSG("\033[1;34mJumping to non-secure code...\033[0m\r\n");
Edison Ai4dcae6f2019-03-18 10:13:47 +0800207#endif
208
209 jump_to_ns_code();
Miklos Balint386b8b52017-11-29 13:12:32 +0000210}