blob: 36f4afd30225f729b53a1059f10ce69351aab873 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Tamas Ban8bd24b72019-02-19 12:13:13 +00002 * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
Miklos Balint386b8b52017-11-29 13:12:32 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Mate Toth-Pal349714a2018-02-23 15:30:24 +01008/* This file contains the APIs exported by the SPM to tfm core */
Miklos Balint386b8b52017-11-29 13:12:32 +00009
10#include <stdio.h>
Mate Toth-Pal7345a4b2018-03-08 16:10:28 +010011#include <string.h>
Miklos Balint386b8b52017-11-29 13:12:32 +000012#include "spm_api.h"
Mingyang Sunf3d29892019-07-10 17:50:23 +080013#include "tfm_spm_hal.h"
Tamas Ban8bd24b72019-02-19 12:13:13 +000014#include "tfm_memory_utils.h"
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +020015#include "spm_db.h"
Miklos Balint6a139ae2018-04-04 19:44:37 +020016#include "tfm_internal.h"
Mate Toth-Pal65291f32018-02-23 14:35:22 +010017#include "tfm_api.h"
Mate Toth-Palce61afa2018-08-03 13:51:01 +020018#include "tfm_nspm.h"
Miklos Balint386b8b52017-11-29 13:12:32 +000019#include "secure_fw/core/tfm_core.h"
Mate Toth-Pal936c33b2018-04-10 14:02:07 +020020#include "tfm_peripherals_def.h"
Mate Toth-Pale1475332018-04-09 17:28:49 +020021#include "spm_partition_defs.h"
22
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +020023#define NON_SECURE_INTERNAL_PARTITION_DB_IDX 0
24#define TFM_CORE_INTERNAL_PARTITION_DB_IDX 1
Miklos Balint386b8b52017-11-29 13:12:32 +000025
Edison Ai66fbdf12019-07-08 16:05:07 +080026#ifndef TFM_PSA_API
Miklos Balint386b8b52017-11-29 13:12:32 +000027typedef enum {
28 TFM_INIT_FAILURE,
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010029} sp_error_type_t;
Miklos Balint386b8b52017-11-29 13:12:32 +000030
Mate Toth-Pal4341de02018-10-02 12:55:47 +020031/* The size of this struct must be multiple of 4 bytes as it is stacked to an
32 * uint32_t[] array
33 */
34struct interrupted_ctx_stack_frame_t {
35#if TFM_LVL != 1
36 uint32_t stack_ptr;
37#endif
38 uint32_t partition_state;
39};
40
41/* The size of this struct must be multiple of 4 bytes as it is stacked to an
42 * uint32_t[] array
43 */
44struct handler_ctx_stack_frame_t {
45 uint32_t partition_state;
46 uint32_t caller_partition_idx;
47};
Edison Ai66fbdf12019-07-08 16:05:07 +080048#endif /* !defined(TFM_PSA_API) */
Mate Toth-Pal4341de02018-10-02 12:55:47 +020049
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +020050/* Define SPM DB structure */
51#include "secure_fw/services/tfm_spm_db.inc"
52
Miklos Balint386b8b52017-11-29 13:12:32 +000053/*
Mate Toth-Pal349714a2018-02-23 15:30:24 +010054 * This function is called when a secure partition causes an error.
Mate Toth-Pal65291f32018-02-23 14:35:22 +010055 * In case of an error in the error handling, a non-zero value have to be
56 * returned.
Miklos Balint386b8b52017-11-29 13:12:32 +000057 */
Summer Qinb4a854d2019-05-29 15:31:22 +080058#ifndef TFM_PSA_API
Mate Toth-Pal349714a2018-02-23 15:30:24 +010059static void tfm_spm_partition_err_handler(
Hugues de Valonf704c802019-02-19 14:51:41 +000060 const struct spm_partition_desc_t *partition,
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010061 sp_error_type_t err_type,
Mate Toth-Pal65291f32018-02-23 14:35:22 +010062 int32_t err_code)
Miklos Balint386b8b52017-11-29 13:12:32 +000063{
Miklos Balint386b8b52017-11-29 13:12:32 +000064#ifdef TFM_CORE_DEBUG
65 if (err_type == TFM_INIT_FAILURE) {
Mate Toth-Pal349714a2018-02-23 15:30:24 +010066 printf("Partition init failed for partition id 0x%08X\r\n",
Mate Toth-Pal18b83922018-02-26 17:58:18 +010067 partition->static_data.partition_id);
Miklos Balint386b8b52017-11-29 13:12:32 +000068 } else {
Hugues de Valonf704c802019-02-19 14:51:41 +000069 printf(
70 "Unknown partition error %d (code: %d) for partition id 0x%08X\r\n",
71 err_type, err_code, partition->static_data.partition_id);
Miklos Balint386b8b52017-11-29 13:12:32 +000072 }
Hugues de Valonf704c802019-02-19 14:51:41 +000073#else
74 (void)err_type;
75 (void)err_code;
Miklos Balint386b8b52017-11-29 13:12:32 +000076#endif
Mate Toth-Pal18b83922018-02-26 17:58:18 +010077 tfm_spm_partition_set_state(partition->static_data.partition_id,
Mate Toth-Pal349714a2018-02-23 15:30:24 +010078 SPM_PARTITION_STATE_CLOSED);
Miklos Balint386b8b52017-11-29 13:12:32 +000079}
Summer Qinb4a854d2019-05-29 15:31:22 +080080#endif /* !defined(TFM_PSA_API) */
Miklos Balint386b8b52017-11-29 13:12:32 +000081
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010082uint32_t get_partition_idx(uint32_t partition_id)
83{
Hugues de Valonf704c802019-02-19 14:51:41 +000084 uint32_t i;
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010085
86 if (partition_id == INVALID_PARTITION_ID) {
87 return SPM_INVALID_PARTITION_IDX;
88 }
89
90 for (i = 0; i < g_spm_partition_db.partition_count; ++i) {
91 if (g_spm_partition_db.partitions[i].static_data.partition_id ==
92 partition_id) {
93 return i;
94 }
95 }
96 return SPM_INVALID_PARTITION_IDX;
97}
98
Miklos Balint386b8b52017-11-29 13:12:32 +000099enum spm_err_t tfm_spm_db_init(void)
100{
Edison Ai66fbdf12019-07-08 16:05:07 +0800101 struct spm_partition_desc_t *part_ptr;
102#ifndef TFM_PSA_API
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200103 static uint32_t ns_interrupt_ctx_stack[
104 sizeof(struct interrupted_ctx_stack_frame_t)/sizeof(uint32_t)] = {0};
105 static uint32_t tfm_core_interrupt_ctx_stack[
106 sizeof(struct interrupted_ctx_stack_frame_t)/sizeof(uint32_t)] = {0};
Edison Ai66fbdf12019-07-08 16:05:07 +0800107#endif /* !defined(TFM_PSA_API) */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100108
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100109 /* This function initialises partition db */
Miklos Balint386b8b52017-11-29 13:12:32 +0000110
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100111 /* There are a few partitions that are used by TF-M internally.
112 * These are explicitly added to the partition db here.
113 */
114
115 /* For the non secure Execution environment */
Miklos Balintdd02bb32019-05-26 21:13:12 +0200116#if (TFM_LVL != 1) || defined(TFM_PSA_API)
Tamas Ban56ef3022018-09-13 23:49:16 +0100117 extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Base[];
118 extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Limit[];
119 uint32_t psp_stack_bottom = (uint32_t)Image$$ARM_LIB_STACK$$ZI$$Base;
120 uint32_t psp_stack_top = (uint32_t)Image$$ARM_LIB_STACK$$ZI$$Limit;
Miklos Balintdd02bb32019-05-26 21:13:12 +0200121#endif
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +0200122
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100123 part_ptr = &(g_spm_partition_db.partitions[
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +0200124 NON_SECURE_INTERNAL_PARTITION_DB_IDX]);
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100125 part_ptr->static_data.partition_id = TFM_SP_NON_SECURE_ID;
Hugues de Valon99578562019-06-18 16:08:51 +0100126#ifdef TFM_PSA_API
Edison Ai4dcae6f2019-03-18 10:13:47 +0800127 part_ptr->static_data.partition_flags = SPM_PART_FLAG_APP_ROT |
128 SPM_PART_FLAG_IPC;
129 part_ptr->static_data.partition_priority = TFM_PRIORITY_LOW;
130 part_ptr->static_data.partition_init = tfm_nspm_thread_entry;
131#else
Mate Toth-Pal59398712018-02-28 17:06:40 +0100132 part_ptr->static_data.partition_flags = 0;
Edison Ai4dcae6f2019-03-18 10:13:47 +0800133#endif
Miklos Balint6a139ae2018-04-04 19:44:37 +0200134
Miklos Balintdd02bb32019-05-26 21:13:12 +0200135#if (TFM_LVL != 1) || defined(TFM_PSA_API)
Tamas Ban56ef3022018-09-13 23:49:16 +0100136 part_ptr->memory_data.stack_bottom = psp_stack_bottom;
137 part_ptr->memory_data.stack_top = psp_stack_top;
Miklos Balint6a139ae2018-04-04 19:44:37 +0200138 /* Since RW, ZI and stack are configured as one MPU region, configure
Tamas Ban56ef3022018-09-13 23:49:16 +0100139 * RW start address to psp_stack_bottom to get RW access to stack
Miklos Balint6a139ae2018-04-04 19:44:37 +0200140 */
Tamas Ban56ef3022018-09-13 23:49:16 +0100141 part_ptr->memory_data.rw_start = psp_stack_bottom;
Miklos Balintdd02bb32019-05-26 21:13:12 +0200142#endif
Miklos Balint6a139ae2018-04-04 19:44:37 +0200143
Edison Ai66fbdf12019-07-08 16:05:07 +0800144#ifndef TFM_PSA_API
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100145 part_ptr->runtime_data.partition_state = SPM_PARTITION_STATE_UNINIT;
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200146 part_ptr->runtime_data.ctx_stack_ptr = ns_interrupt_ctx_stack;
Edison Ai66fbdf12019-07-08 16:05:07 +0800147#endif /* !defined(TFM_PSA_API) */
148
Miklos Balint12735bc2018-08-01 15:45:18 +0200149 tfm_nspm_configure_clients();
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100150
151 /* For the TF-M core environment itself */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100152 part_ptr = &(g_spm_partition_db.partitions[
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +0200153 TFM_CORE_INTERNAL_PARTITION_DB_IDX]);
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100154 part_ptr->static_data.partition_id = TFM_SP_CORE_ID;
Mate Toth-Pal59398712018-02-28 17:06:40 +0100155 part_ptr->static_data.partition_flags =
Edison Aibb614aa2018-11-21 15:15:00 +0800156 SPM_PART_FLAG_APP_ROT | SPM_PART_FLAG_PSA_ROT;
Edison Ai66fbdf12019-07-08 16:05:07 +0800157#ifndef TFM_PSA_API
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100158 part_ptr->runtime_data.partition_state = SPM_PARTITION_STATE_UNINIT;
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200159 part_ptr->runtime_data.ctx_stack_ptr = tfm_core_interrupt_ctx_stack;
Edison Ai66fbdf12019-07-08 16:05:07 +0800160#endif /* !defined(TFM_PSA_API) */
Miklos Balint386b8b52017-11-29 13:12:32 +0000161
Mate Toth-Pal7345a4b2018-03-08 16:10:28 +0100162 g_spm_partition_db.is_init = 1;
163
Miklos Balint386b8b52017-11-29 13:12:32 +0000164 return SPM_ERR_OK;
165}
166
Summer Qinb4a854d2019-05-29 15:31:22 +0800167#ifndef TFM_PSA_API
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100168enum spm_err_t tfm_spm_partition_init(void)
Miklos Balint386b8b52017-11-29 13:12:32 +0000169{
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200170 struct spm_partition_desc_t *part;
Miklos Balintace4c3f2018-07-30 12:31:15 +0200171 struct tfm_sfn_req_s desc;
Miklos Balint6a139ae2018-04-04 19:44:37 +0200172 int32_t args[4] = {0};
Miklos Balint386b8b52017-11-29 13:12:32 +0000173 int32_t fail_cnt = 0;
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100174 uint32_t idx;
Miklos Balint386b8b52017-11-29 13:12:32 +0000175
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100176 /* Call the init function for each partition */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100177 for (idx = 0; idx < g_spm_partition_db.partition_count; ++idx) {
178 part = &g_spm_partition_db.partitions[idx];
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200179 tfm_spm_hal_configure_default_isolation(part->platform_data);
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100180 if (part->static_data.partition_init == NULL) {
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100181 tfm_spm_partition_set_state(idx, SPM_PARTITION_STATE_IDLE);
Miklos Balint6a139ae2018-04-04 19:44:37 +0200182 tfm_spm_partition_set_caller_partition_idx(idx,
183 SPM_INVALID_PARTITION_IDX);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100184 } else {
Miklos Balintace4c3f2018-07-30 12:31:15 +0200185 int32_t res;
Miklos Balint6a139ae2018-04-04 19:44:37 +0200186
187 desc.args = args;
Hugues de Valonf704c802019-02-19 14:51:41 +0000188 desc.ns_caller = 0U;
Mate Toth-Palb8ce0dd2018-07-25 10:18:34 +0200189 desc.iovec_api = TFM_SFN_API_IOVEC;
Miklos Balint6a139ae2018-04-04 19:44:37 +0200190 desc.sfn = (sfn_t)part->static_data.partition_init;
191 desc.sp_id = part->static_data.partition_id;
Miklos Balintace4c3f2018-07-30 12:31:15 +0200192 res = tfm_core_sfn_request(&desc);
Hugues de Valon99578562019-06-18 16:08:51 +0100193 if (res == (int32_t)TFM_SUCCESS) {
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100194 tfm_spm_partition_set_state(idx, SPM_PARTITION_STATE_IDLE);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100195 } else {
Miklos Balintace4c3f2018-07-30 12:31:15 +0200196 tfm_spm_partition_err_handler(part, TFM_INIT_FAILURE, res);
Miklos Balint386b8b52017-11-29 13:12:32 +0000197 fail_cnt++;
198 }
199 }
200 }
201
Miklos Balint6a139ae2018-04-04 19:44:37 +0200202 tfm_secure_api_init_done();
203
Miklos Balint386b8b52017-11-29 13:12:32 +0000204 if (fail_cnt == 0) {
205 return SPM_ERR_OK;
206 } else {
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100207 return SPM_ERR_PARTITION_NOT_AVAILABLE;
Miklos Balint386b8b52017-11-29 13:12:32 +0000208 }
209}
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200210
211void tfm_spm_partition_push_interrupted_ctx(uint32_t partition_idx)
212{
213 struct spm_partition_runtime_data_t *runtime_data =
214 &g_spm_partition_db.partitions[partition_idx].runtime_data;
215 struct interrupted_ctx_stack_frame_t *stack_frame =
216 (struct interrupted_ctx_stack_frame_t *)
217 runtime_data->ctx_stack_ptr;
218
219 stack_frame->partition_state = runtime_data->partition_state;
220#if TFM_LVL != 1
221 stack_frame->stack_ptr = runtime_data->stack_ptr;
222#endif
223 runtime_data->ctx_stack_ptr +=
224 sizeof(struct interrupted_ctx_stack_frame_t) / sizeof(uint32_t);
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200225}
226
227void tfm_spm_partition_pop_interrupted_ctx(uint32_t partition_idx)
228{
229 struct spm_partition_runtime_data_t *runtime_data =
230 &g_spm_partition_db.partitions[partition_idx].runtime_data;
231 struct interrupted_ctx_stack_frame_t *stack_frame;
232
233 runtime_data->ctx_stack_ptr -=
234 sizeof(struct interrupted_ctx_stack_frame_t) / sizeof(uint32_t);
235 stack_frame = (struct interrupted_ctx_stack_frame_t *)
236 runtime_data->ctx_stack_ptr;
237 tfm_spm_partition_set_state(partition_idx, stack_frame->partition_state);
238 stack_frame->partition_state = 0;
239#if TFM_LVL != 1
240 tfm_spm_partition_set_stack(partition_idx, stack_frame->stack_ptr);
241 stack_frame->stack_ptr = 0;
242#endif
243}
244
245void tfm_spm_partition_push_handler_ctx(uint32_t partition_idx)
246{
247 struct spm_partition_runtime_data_t *runtime_data =
248 &g_spm_partition_db.partitions[partition_idx].runtime_data;
249 struct handler_ctx_stack_frame_t *stack_frame =
250 (struct handler_ctx_stack_frame_t *)
251 runtime_data->ctx_stack_ptr;
252
253 stack_frame->partition_state = runtime_data->partition_state;
254 stack_frame->caller_partition_idx = runtime_data->caller_partition_idx;
255
256 runtime_data->ctx_stack_ptr +=
257 sizeof(struct handler_ctx_stack_frame_t) / sizeof(uint32_t);
258}
259
260void tfm_spm_partition_pop_handler_ctx(uint32_t partition_idx)
261{
262 struct spm_partition_runtime_data_t *runtime_data =
263 &g_spm_partition_db.partitions[partition_idx].runtime_data;
264 struct handler_ctx_stack_frame_t *stack_frame;
265
266 runtime_data->ctx_stack_ptr -=
267 sizeof(struct handler_ctx_stack_frame_t) / sizeof(uint32_t);
268
269 stack_frame = (struct handler_ctx_stack_frame_t *)
270 runtime_data->ctx_stack_ptr;
271
272 tfm_spm_partition_set_state(partition_idx, stack_frame->partition_state);
273 stack_frame->partition_state = 0;
274 tfm_spm_partition_set_caller_partition_idx(
Mingyang Sunf3d29892019-07-10 17:50:23 +0800275 partition_idx, stack_frame->caller_partition_idx);
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200276 stack_frame->caller_partition_idx = 0;
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200277}
278
Summer Qinb4a854d2019-05-29 15:31:22 +0800279#endif /* !defined(TFM_PSA_API) */
Miklos Balint386b8b52017-11-29 13:12:32 +0000280
Miklos Balintdd02bb32019-05-26 21:13:12 +0200281#if (TFM_LVL != 1) || defined(TFM_PSA_API)
Summer Qind00e4db2019-05-09 18:03:52 +0800282uint32_t tfm_spm_partition_get_stack_bottom(uint32_t partition_idx)
283{
284 return g_spm_partition_db.partitions[partition_idx].
285 memory_data.stack_bottom;
286}
287
288uint32_t tfm_spm_partition_get_stack_top(uint32_t partition_idx)
289{
290 return g_spm_partition_db.partitions[partition_idx].memory_data.stack_top;
291}
Miklos Balintdd02bb32019-05-26 21:13:12 +0200292#endif
Summer Qind00e4db2019-05-09 18:03:52 +0800293
Miklos Balintdd02bb32019-05-26 21:13:12 +0200294#if (TFM_LVL != 1) && !defined(TFM_PSA_API)
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100295enum spm_err_t tfm_spm_partition_sandbox_config(uint32_t partition_idx)
Miklos Balint386b8b52017-11-29 13:12:32 +0000296{
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200297 struct spm_partition_desc_t *part;
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100298 if (!g_spm_partition_db.is_init) {
299 return SPM_ERR_PARTITION_DB_NOT_INIT;
Miklos Balint386b8b52017-11-29 13:12:32 +0000300 }
301
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100302 part = &g_spm_partition_db.partitions[partition_idx];
Miklos Balint386b8b52017-11-29 13:12:32 +0000303
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200304 return tfm_spm_hal_partition_sandbox_config(&(part->memory_data),
305 part->platform_data);
Miklos Balint386b8b52017-11-29 13:12:32 +0000306}
307
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100308enum spm_err_t tfm_spm_partition_sandbox_deconfig(uint32_t partition_idx)
Miklos Balint386b8b52017-11-29 13:12:32 +0000309{
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100310 /* This function takes a partition id and disables the
311 * SPM partition for that partition
Miklos Balint386b8b52017-11-29 13:12:32 +0000312 */
313
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200314 struct spm_partition_desc_t *part;
Miklos Balint386b8b52017-11-29 13:12:32 +0000315
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100316 part = &g_spm_partition_db.partitions[partition_idx];
Miklos Balint386b8b52017-11-29 13:12:32 +0000317
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200318 return tfm_spm_hal_partition_sandbox_deconfig(&(part->memory_data),
319 part->platform_data);
Miklos Balint386b8b52017-11-29 13:12:32 +0000320}
321
Mate Toth-Pal21a74c92018-04-13 14:05:41 +0200322uint32_t tfm_spm_partition_get_zi_start(uint32_t partition_idx)
323{
324 return g_spm_partition_db.partitions[partition_idx].
325 memory_data.zi_start;
326}
327
328uint32_t tfm_spm_partition_get_zi_limit(uint32_t partition_idx)
329{
330 return g_spm_partition_db.partitions[partition_idx].
331 memory_data.zi_limit;
332}
333
334uint32_t tfm_spm_partition_get_rw_start(uint32_t partition_idx)
335{
336 return g_spm_partition_db.partitions[partition_idx].
337 memory_data.rw_start;
338}
339
340uint32_t tfm_spm_partition_get_rw_limit(uint32_t partition_idx)
341{
342 return g_spm_partition_db.partitions[partition_idx].
343 memory_data.rw_limit;
344}
345
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100346void tfm_spm_partition_set_stack(uint32_t partition_idx, uint32_t stack_ptr)
Miklos Balint386b8b52017-11-29 13:12:32 +0000347{
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100348 g_spm_partition_db.partitions[partition_idx].
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100349 runtime_data.stack_ptr = stack_ptr;
Miklos Balint386b8b52017-11-29 13:12:32 +0000350}
351#endif
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100352
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100353uint32_t tfm_spm_partition_get_partition_id(uint32_t partition_idx)
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100354{
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100355 return g_spm_partition_db.partitions[partition_idx].static_data.
356 partition_id;
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100357}
358
Mate Toth-Pal59398712018-02-28 17:06:40 +0100359uint32_t tfm_spm_partition_get_flags(uint32_t partition_idx)
360{
361 return g_spm_partition_db.partitions[partition_idx].static_data.
362 partition_flags;
363}
364
Summer Qinb4a854d2019-05-29 15:31:22 +0800365#ifndef TFM_PSA_API
366void tfm_spm_partition_store_context(uint32_t partition_idx,
367 uint32_t stack_ptr, uint32_t lr)
368{
369 g_spm_partition_db.partitions[partition_idx].
370 runtime_data.stack_ptr = stack_ptr;
371 g_spm_partition_db.partitions[partition_idx].
372 runtime_data.lr = lr;
373}
374
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100375const struct spm_partition_runtime_data_t *
Mate Toth-Pal59398712018-02-28 17:06:40 +0100376 tfm_spm_partition_get_runtime_data(uint32_t partition_idx)
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100377{
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100378 return &(g_spm_partition_db.partitions[partition_idx].runtime_data);
379}
380
381void tfm_spm_partition_set_state(uint32_t partition_idx, uint32_t state)
382{
383 g_spm_partition_db.partitions[partition_idx].runtime_data.partition_state =
384 state;
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200385 if (state == SPM_PARTITION_STATE_RUNNING ||
386 state == SPM_PARTITION_STATE_HANDLING_IRQ) {
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100387 g_spm_partition_db.running_partition_idx = partition_idx;
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100388 }
389}
390
Miklos Balint6a139ae2018-04-04 19:44:37 +0200391void tfm_spm_partition_set_caller_partition_idx(uint32_t partition_idx,
392 uint32_t caller_partition_idx)
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100393{
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100394 g_spm_partition_db.partitions[partition_idx].runtime_data.
395 caller_partition_idx = caller_partition_idx;
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100396}
397
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200398void tfm_spm_partition_set_signal_mask(uint32_t partition_idx,
399 uint32_t signal_mask)
400{
401 g_spm_partition_db.partitions[partition_idx].runtime_data.
402 signal_mask = signal_mask;
403}
404
Mate Toth-Pal21a74c92018-04-13 14:05:41 +0200405void tfm_spm_partition_set_caller_client_id(uint32_t partition_idx,
406 int32_t caller_client_id)
407{
408 g_spm_partition_db.partitions[partition_idx].runtime_data.
409 caller_client_id = caller_client_id;
410}
411
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100412enum spm_err_t tfm_spm_partition_set_share(uint32_t partition_idx,
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100413 uint32_t share)
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100414{
415 enum spm_err_t ret = SPM_ERR_OK;
416
417#if TFM_LVL != 1
418 /* Only need to set configuration on levels higher than 1 */
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200419 ret = tfm_spm_hal_set_share_region(share);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100420#endif
421
422 if (ret == SPM_ERR_OK) {
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100423 g_spm_partition_db.partitions[partition_idx].runtime_data.share = share;
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100424 }
425 return ret;
426}
427
Hugues de Valonf704c802019-02-19 14:51:41 +0000428enum spm_err_t tfm_spm_partition_set_iovec(uint32_t partition_idx,
429 const int32_t *args)
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200430{
431 struct spm_partition_runtime_data_t *runtime_data =
432 &g_spm_partition_db.partitions[partition_idx].runtime_data;
Hugues de Valonf704c802019-02-19 14:51:41 +0000433 size_t i;
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200434
Hugues de Valonf704c802019-02-19 14:51:41 +0000435 if ((args[1] < 0) || (args[3] < 0)) {
436 return SPM_ERR_INVALID_PARAMETER;
437 }
438
439 runtime_data->iovec_args.in_len = (size_t)args[1];
440 for (i = 0U; i < runtime_data->iovec_args.in_len; ++i) {
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200441 runtime_data->iovec_args.in_vec[i].base =
442 ((psa_invec *)args[0])[i].base;
443 runtime_data->iovec_args.in_vec[i].len = ((psa_invec *)args[0])[i].len;
444 }
Hugues de Valonf704c802019-02-19 14:51:41 +0000445 runtime_data->iovec_args.out_len = (size_t)args[3];
446 for (i = 0U; i < runtime_data->iovec_args.out_len; ++i) {
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200447 runtime_data->iovec_args.out_vec[i].base =
448 ((psa_outvec *)args[2])[i].base;
449 runtime_data->iovec_args.out_vec[i].len =
450 ((psa_outvec *)args[2])[i].len;
451 }
452 runtime_data->orig_outvec = (psa_outvec *)args[2];
Mate Toth-Pal2a6f8c22018-12-13 16:37:17 +0100453 runtime_data->iovec_api = 1;
Hugues de Valonf704c802019-02-19 14:51:41 +0000454
455 return SPM_ERR_OK;
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200456}
457
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100458uint32_t tfm_spm_partition_get_running_partition_idx(void)
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100459{
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100460 return g_spm_partition_db.running_partition_idx;
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100461}
462
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100463void tfm_spm_partition_cleanup_context(uint32_t partition_idx)
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100464{
Mate Toth-Pal936c33b2018-04-10 14:02:07 +0200465 struct spm_partition_desc_t *partition =
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100466 &(g_spm_partition_db.partitions[partition_idx]);
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200467 int32_t i;
468
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100469 partition->runtime_data.caller_partition_idx = SPM_INVALID_PARTITION_IDX;
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100470 partition->runtime_data.share = 0;
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200471 partition->runtime_data.iovec_args.in_len = 0;
472 for (i = 0; i < PSA_MAX_IOVEC; ++i) {
473 partition->runtime_data.iovec_args.in_vec[i].base = 0;
474 partition->runtime_data.iovec_args.in_vec[i].len = 0;
475 }
476 partition->runtime_data.iovec_args.out_len = 0;
477 for (i = 0; i < PSA_MAX_IOVEC; ++i) {
478 partition->runtime_data.iovec_args.out_vec[i].base = 0;
479 partition->runtime_data.iovec_args.out_vec[i].len = 0;
480 }
481 partition->runtime_data.orig_outvec = 0;
Mate Toth-Pal2a6f8c22018-12-13 16:37:17 +0100482 partition->runtime_data.iovec_api = 0;
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100483}
Summer Qinb4a854d2019-05-29 15:31:22 +0800484#endif /* !defined(TFM_PSA_API) */
Edison Aib5571352019-03-22 10:49:52 +0800485
486__attribute__((section("SFN")))
487void tfm_spm_partition_change_privilege(uint32_t privileged)
488{
489 CONTROL_Type ctrl;
490
491 ctrl.w = __get_CONTROL();
492
493 if (privileged == TFM_PARTITION_PRIVILEGED_MODE) {
494 ctrl.b.nPRIV = 0;
495 } else {
496 ctrl.b.nPRIV = 1;
497 }
498
499 __set_CONTROL(ctrl.w);
500}