blob: c072896deb7d2462c37faaf2b5e4ad66925e1265 [file] [log] [blame]
Kevin Peng62a87112020-07-07 15:07:46 +08001/*
Feder Liang7abe9a42021-12-03 17:54:58 +08002 * Copyright (c) 2017-2022, Arm Limited. All rights reserved.
Chris Brand5c8b6392022-05-20 14:46:12 -07003 * Copyright (c) 2022 Cypress Semiconductor Corporation (an Infineon company)
4 * or an affiliate of Cypress Semiconductor Corporation. All rights reserved.
Kevin Peng62a87112020-07-07 15:07:46 +08005 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 *
8 */
9
Kevin Peng62a87112020-07-07 15:07:46 +080010#include "cmsis_os2.h"
Xinyu Zhang4c640e82021-09-22 15:25:09 +080011#include "cmsis_compiler.h"
Kevin Peng62a87112020-07-07 15:07:46 +080012#include "tfm_ns_interface.h"
Xinyu Zhangeebbea32021-09-01 15:26:39 +080013#include "tfm_nsid_manager.h"
Kevin Peng342ec682022-04-29 10:36:58 +080014#include "test_app.h"
Kevin Peng62a87112020-07-07 15:07:46 +080015#include "tfm_plat_ns.h"
Anton Komlevc0ad6042023-08-29 18:23:26 +010016#include "Driver_USART.h"
Kevin Peng62a87112020-07-07 15:07:46 +080017#include "device_cfg.h"
Chris Brand5c8b6392022-05-20 14:46:12 -070018#ifdef TFM_PARTITION_NS_AGENT_MAILBOX
Kevin Peng62a87112020-07-07 15:07:46 +080019#include "tfm_multi_core_api.h"
20#include "tfm_ns_mailbox.h"
21#endif
Summer Qin77894232020-08-28 11:24:15 +080022#include "tfm_log.h"
Kevin Peng62a87112020-07-07 15:07:46 +080023#include "uart_stdout.h"
Gabor Toth608e92f2022-09-06 12:41:41 +020024#if (CONFIG_TFM_FLOAT_ABI >= 1)
Feder Liang7abe9a42021-12-03 17:54:58 +080025#include "cmsis.h"
26#endif
Jianliang Shen407bfef2023-08-07 16:37:25 +080027#ifdef CONFIG_TFM_ENALBE_PROFILING
28#include "tfm_ns_profiling.h"
29#endif
Kevin Peng62a87112020-07-07 15:07:46 +080030
31/**
32 * \brief Modified table template for user defined SVC functions
33 *
34 * \details RTX has a weak definition of osRtxUserSVC, which
35 * is overridden here
36 */
David Huacba69e2021-09-10 15:36:48 +080037#if defined(__ARMCC_VERSION)
38#if (__ARMCC_VERSION == 6110004)
Kevin Peng62a87112020-07-07 15:07:46 +080039/* Workaround needed for a bug in Armclang 6.11, more details at:
40 * http://www.keil.com/support/docs/4089.htm
41 */
42__attribute__((section(".gnu.linkonce")))
43#endif
David Huacba69e2021-09-10 15:36:48 +080044
45/* Avoids the semihosting issue */
46#if (__ARMCC_VERSION >= 6010050)
47__asm(" .global __ARM_use_no_argv\n");
48#endif
49#endif
50
Jianliang Shen407bfef2023-08-07 16:37:25 +080051#ifdef CONFIG_TFM_ENALBE_PROFILING
52
53#if TFM_NS_REG_TEST || PSA_API_TEST_NS
54#error "TF-M NS profiling shall not run together with NS regression tests"
55#endif
56/**
57 * \brief List of Profiling thread attributes
58 */
59const osThreadAttr_t thread_attr = {
60 .name = "profiling_thread",
61 .stack_size = 4096U,
62};
63osThreadFunc_t thread_func = tfm_ns_profiling;
64#else
Kevin Peng62a87112020-07-07 15:07:46 +080065/**
66 * \brief List of RTOS thread attributes
67 */
Kevin Peng62a87112020-07-07 15:07:46 +080068static const osThreadAttr_t thread_attr = {
69 .name = "test_thread",
Xinyu Zhangeebbea32021-09-01 15:26:39 +080070 .stack_size = 4096U,
71 .tz_module = ((TZ_ModuleId_t)TFM_DEFAULT_NSID)
Kevin Peng62a87112020-07-07 15:07:46 +080072};
Kevin Peng342ec682022-04-29 10:36:58 +080073/**
74 * \brief Static globals to hold RTOS related quantities,
75 * main thread
76 */
77static osThreadFunc_t thread_func = test_app;
Jianliang Shen407bfef2023-08-07 16:37:25 +080078#endif
Kevin Peng62a87112020-07-07 15:07:46 +080079
David Hu98adf322020-09-01 16:18:46 +080080#ifdef TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD
81static osThreadFunc_t mailbox_thread_func = tfm_ns_mailbox_thread_runner;
David Hu98adf322020-09-01 16:18:46 +080082static const osThreadAttr_t mailbox_thread_attr = {
83 .name = "mailbox_thread",
Robert Rostohar26ebd142020-12-21 16:48:58 +010084 .stack_size = 1024U
David Hu98adf322020-09-01 16:18:46 +080085};
86#endif
87
Chris Brand5c8b6392022-05-20 14:46:12 -070088#ifdef TFM_PARTITION_NS_AGENT_MAILBOX
Kevin Peng62a87112020-07-07 15:07:46 +080089static struct ns_mailbox_queue_t ns_mailbox_queue;
90
91static void tfm_ns_multi_core_boot(void)
92{
93 int32_t ret;
94
Chris Branda1499292021-10-28 12:02:05 -070095 LOG_MSG("Non-secure code running on non-secure core.\r\n");
Kevin Peng62a87112020-07-07 15:07:46 +080096
97 if (tfm_ns_wait_for_s_cpu_ready()) {
Chris Branda1499292021-10-28 12:02:05 -070098 LOG_MSG("Error sync'ing with secure core.\r\n");
Kevin Peng62a87112020-07-07 15:07:46 +080099
100 /* Avoid undefined behavior after multi-core sync-up failed */
101 for (;;) {
102 }
103 }
104
105 ret = tfm_ns_mailbox_init(&ns_mailbox_queue);
106 if (ret != MAILBOX_SUCCESS) {
Chris Branda1499292021-10-28 12:02:05 -0700107 LOG_MSG("Non-secure mailbox initialization failed.\r\n");
Kevin Peng62a87112020-07-07 15:07:46 +0800108
109 /* Avoid undefined behavior after NS mailbox initialization failed */
110 for (;;) {
111 }
112 }
113}
Chris Brand5c8b6392022-05-20 14:46:12 -0700114#endif /* TFM_PARTITION_NS_AGENT_MAILBOX */
115
116#ifdef CONFIG_TFM_USE_TRUSTZONE
David Hucdc51fb2021-04-06 18:10:46 +0800117extern uint32_t tfm_ns_interface_init(void);
Kevin Peng62a87112020-07-07 15:07:46 +0800118#endif
119
120/**
121 * \brief Platform peripherals and devices initialization.
122 * Can be overridden for platform specific initialization.
123 *
124 * \return ARM_DRIVER_OK if the initialization succeeds
125 */
126__WEAK int32_t tfm_ns_platform_init(void)
127{
128 stdio_init();
129
130 return ARM_DRIVER_OK;
131}
132
133/**
134 * \brief Platform peripherals and devices de-initialization.
135 * Can be overridden for platform specific initialization.
136 *
137 * \return ARM_DRIVER_OK if the de-initialization succeeds
138 */
139__WEAK int32_t tfm_ns_platform_uninit(void)
140{
141 stdio_uninit();
142
143 return ARM_DRIVER_OK;
144}
145
Feder Liang7abe9a42021-12-03 17:54:58 +0800146
147__WEAK int32_t tfm_ns_cp_init(void)
148{
Gabor Toth608e92f2022-09-06 12:41:41 +0200149#if (CONFIG_TFM_FLOAT_ABI >= 1)
Feder Liang7abe9a42021-12-03 17:54:58 +0800150#ifdef __GNUC__
151 /* Enable NSPE privileged and unprivilged access to the FP Extension */
152 SCB->CPACR |= (3U << 10U*2U) /* enable CP10 full access */
153 | (3U << 11U*2U); /* enable CP11 full access */
154#endif
155#endif
156 return ARM_DRIVER_OK;
157}
158
Kevin Peng62a87112020-07-07 15:07:46 +0800159/**
160 * \brief main() function
161 */
162#ifndef __GNUC__
163__attribute__((noreturn))
164#endif
165int main(void)
166{
Kevin Peng62a87112020-07-07 15:07:46 +0800167 if (tfm_ns_platform_init() != ARM_DRIVER_OK) {
168 /* Avoid undefined behavior if platform init failed */
169 while(1);
170 }
171
Feder Liang7abe9a42021-12-03 17:54:58 +0800172 if (tfm_ns_cp_init() != ARM_DRIVER_OK) {
173 /* Avoid undefined behavior if co-porcessor init failed */
174 while(1);
175 }
176
David Hu4ae00fe2021-01-27 17:48:07 +0800177 (void) osKernelInitialize();
178
Chris Brand5c8b6392022-05-20 14:46:12 -0700179#ifdef TFM_PARTITION_NS_AGENT_MAILBOX
Kevin Peng62a87112020-07-07 15:07:46 +0800180 tfm_ns_multi_core_boot();
Chris Brand5c8b6392022-05-20 14:46:12 -0700181#endif
182
183#ifdef CONFIG_TFM_USE_TRUSTZONE
Kevin Peng62a87112020-07-07 15:07:46 +0800184 /* Initialize the TFM NS interface */
185 tfm_ns_interface_init();
David Hucdc51fb2021-04-06 18:10:46 +0800186#endif
Kevin Peng62a87112020-07-07 15:07:46 +0800187
David Hu98adf322020-09-01 16:18:46 +0800188#ifdef TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD
189 (void) osThreadNew(mailbox_thread_func, NULL, &mailbox_thread_attr);
190#endif
191
Kevin Peng62a87112020-07-07 15:07:46 +0800192 (void) osThreadNew(thread_func, NULL, &thread_attr);
Kevin Peng62a87112020-07-07 15:07:46 +0800193
194 LOG_MSG("Non-Secure system starting...\r\n");
195 (void) osKernelStart();
196
197 /* Reached only in case of error */
198 for (;;) {
199 }
200}