mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * SPDX-License-Identifier: BSD-3-Clause
kenjiArai 0:5b88d5760320 5 *
kenjiArai 0:5b88d5760320 6 */
kenjiArai 0:5b88d5760320 7
kenjiArai 0:5b88d5760320 8 /* This file contains the APIs exported by the SPM to tfm core */
kenjiArai 0:5b88d5760320 9
kenjiArai 0:5b88d5760320 10 #include <stdio.h>
kenjiArai 0:5b88d5760320 11 #include <string.h>
kenjiArai 0:5b88d5760320 12 #include "spm_api.h"
kenjiArai 0:5b88d5760320 13 #include "platform/include/tfm_spm_hal.h"
kenjiArai 0:5b88d5760320 14 #include "tfm_memory_utils.h"
kenjiArai 0:5b88d5760320 15 #include "spm_db_setup.h"
kenjiArai 0:5b88d5760320 16 #include "tfm_internal.h"
kenjiArai 0:5b88d5760320 17 #include "tfm_api.h"
kenjiArai 0:5b88d5760320 18 #include "tfm_nspm.h"
kenjiArai 0:5b88d5760320 19 #include "secure_fw/core/tfm_core.h"
kenjiArai 0:5b88d5760320 20 #include "tfm_peripherals_def.h"
kenjiArai 0:5b88d5760320 21 #include "spm_partition_defs.h"
kenjiArai 0:5b88d5760320 22
kenjiArai 0:5b88d5760320 23
kenjiArai 0:5b88d5760320 24 struct spm_partition_db_t g_spm_partition_db = {0,};
kenjiArai 0:5b88d5760320 25
kenjiArai 0:5b88d5760320 26 typedef enum {
kenjiArai 0:5b88d5760320 27 TFM_INIT_FAILURE,
kenjiArai 0:5b88d5760320 28 } sp_error_type_t;
kenjiArai 0:5b88d5760320 29
kenjiArai 0:5b88d5760320 30 /*
kenjiArai 0:5b88d5760320 31 * This function is called when a secure partition causes an error.
kenjiArai 0:5b88d5760320 32 * In case of an error in the error handling, a non-zero value have to be
kenjiArai 0:5b88d5760320 33 * returned.
kenjiArai 0:5b88d5760320 34 */
kenjiArai 0:5b88d5760320 35 #ifndef TFM_PSA_API
kenjiArai 0:5b88d5760320 36 static void tfm_spm_partition_err_handler(
kenjiArai 0:5b88d5760320 37 const struct spm_partition_desc_t *partition,
kenjiArai 0:5b88d5760320 38 sp_error_type_t err_type,
kenjiArai 0:5b88d5760320 39 int32_t err_code)
kenjiArai 0:5b88d5760320 40 {
kenjiArai 0:5b88d5760320 41 #ifdef TFM_CORE_DEBUG
kenjiArai 0:5b88d5760320 42 if (err_type == TFM_INIT_FAILURE) {
kenjiArai 0:5b88d5760320 43 printf("Partition init failed for partition id 0x%08X\r\n",
kenjiArai 0:5b88d5760320 44 partition->static_data.partition_id);
kenjiArai 0:5b88d5760320 45 } else {
kenjiArai 0:5b88d5760320 46 printf(
kenjiArai 0:5b88d5760320 47 "Unknown partition error %d (code: %d) for partition id 0x%08X\r\n",
kenjiArai 0:5b88d5760320 48 err_type, err_code, partition->static_data.partition_id);
kenjiArai 0:5b88d5760320 49 }
kenjiArai 0:5b88d5760320 50 #else
kenjiArai 0:5b88d5760320 51 (void)err_type;
kenjiArai 0:5b88d5760320 52 (void)err_code;
kenjiArai 0:5b88d5760320 53 #endif
kenjiArai 0:5b88d5760320 54 tfm_spm_partition_set_state(partition->static_data.partition_id,
kenjiArai 0:5b88d5760320 55 SPM_PARTITION_STATE_CLOSED);
kenjiArai 0:5b88d5760320 56 }
kenjiArai 0:5b88d5760320 57 #endif /* !defined(TFM_PSA_API) */
kenjiArai 0:5b88d5760320 58
kenjiArai 0:5b88d5760320 59 /*
kenjiArai 0:5b88d5760320 60 * This function prevents name clashes between the variable names accessibles in
kenjiArai 0:5b88d5760320 61 * the scope of where tfm_partition_list.inc is included and the varaible names
kenjiArai 0:5b88d5760320 62 * defined inside tfm_partition_list.inc file.
kenjiArai 0:5b88d5760320 63 */
kenjiArai 0:5b88d5760320 64 static inline enum spm_err_t add_user_defined_partitions(void) {
kenjiArai 0:5b88d5760320 65 #include "tfm_partition_list.inc"
kenjiArai 0:5b88d5760320 66
kenjiArai 0:5b88d5760320 67 return SPM_ERR_OK;
kenjiArai 0:5b88d5760320 68 }
kenjiArai 0:5b88d5760320 69
kenjiArai 0:5b88d5760320 70 uint32_t get_partition_idx(uint32_t partition_id)
kenjiArai 0:5b88d5760320 71 {
kenjiArai 0:5b88d5760320 72 uint32_t i;
kenjiArai 0:5b88d5760320 73
kenjiArai 0:5b88d5760320 74 if (partition_id == INVALID_PARTITION_ID) {
kenjiArai 0:5b88d5760320 75 return SPM_INVALID_PARTITION_IDX;
kenjiArai 0:5b88d5760320 76 }
kenjiArai 0:5b88d5760320 77
kenjiArai 0:5b88d5760320 78 for (i = 0; i < g_spm_partition_db.partition_count; ++i) {
kenjiArai 0:5b88d5760320 79 if (g_spm_partition_db.partitions[i].static_data.partition_id ==
kenjiArai 0:5b88d5760320 80 partition_id) {
kenjiArai 0:5b88d5760320 81 return i;
kenjiArai 0:5b88d5760320 82 }
kenjiArai 0:5b88d5760320 83 }
kenjiArai 0:5b88d5760320 84 return SPM_INVALID_PARTITION_IDX;
kenjiArai 0:5b88d5760320 85 }
kenjiArai 0:5b88d5760320 86
kenjiArai 0:5b88d5760320 87 enum spm_err_t tfm_spm_db_init(void)
kenjiArai 0:5b88d5760320 88 {
kenjiArai 0:5b88d5760320 89 struct spm_partition_desc_t *part_ptr;
kenjiArai 0:5b88d5760320 90 enum spm_err_t err;
kenjiArai 0:5b88d5760320 91
kenjiArai 0:5b88d5760320 92 (void)tfm_memset (&g_spm_partition_db, 0, sizeof(g_spm_partition_db));
kenjiArai 0:5b88d5760320 93
kenjiArai 0:5b88d5760320 94 /* This function initialises partition db */
kenjiArai 0:5b88d5760320 95 g_spm_partition_db.running_partition_idx = SPM_INVALID_PARTITION_IDX;
kenjiArai 0:5b88d5760320 96 g_spm_partition_db.partition_count = 0;
kenjiArai 0:5b88d5760320 97
kenjiArai 0:5b88d5760320 98 /* There are a few partitions that are used by TF-M internally.
kenjiArai 0:5b88d5760320 99 * These are explicitly added to the partition db here.
kenjiArai 0:5b88d5760320 100 */
kenjiArai 0:5b88d5760320 101
kenjiArai 0:5b88d5760320 102 /* For the non secure Execution environment */
kenjiArai 0:5b88d5760320 103 #if (TFM_LVL != 1) || defined(TFM_PSA_API)
kenjiArai 0:5b88d5760320 104 extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Base[];
kenjiArai 0:5b88d5760320 105 extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Limit[];
kenjiArai 0:5b88d5760320 106 uint32_t psp_stack_bottom = (uint32_t)Image$$ARM_LIB_STACK$$ZI$$Base;
kenjiArai 0:5b88d5760320 107 uint32_t psp_stack_top = (uint32_t)Image$$ARM_LIB_STACK$$ZI$$Limit;
kenjiArai 0:5b88d5760320 108 #endif
kenjiArai 0:5b88d5760320 109 if (g_spm_partition_db.partition_count >= SPM_MAX_PARTITIONS) {
kenjiArai 0:5b88d5760320 110 return SPM_ERR_INVALID_CONFIG;
kenjiArai 0:5b88d5760320 111 }
kenjiArai 0:5b88d5760320 112 part_ptr = &(g_spm_partition_db.partitions[
kenjiArai 0:5b88d5760320 113 g_spm_partition_db.partition_count]);
kenjiArai 0:5b88d5760320 114 part_ptr->static_data.partition_id = TFM_SP_NON_SECURE_ID;
kenjiArai 0:5b88d5760320 115 #ifdef TFM_PSA_API
kenjiArai 0:5b88d5760320 116 part_ptr->static_data.partition_flags = SPM_PART_FLAG_APP_ROT |
kenjiArai 0:5b88d5760320 117 SPM_PART_FLAG_IPC;
kenjiArai 0:5b88d5760320 118 part_ptr->static_data.partition_priority = TFM_PRIORITY_LOW;
kenjiArai 0:5b88d5760320 119 part_ptr->static_data.partition_init = tfm_nspm_thread_entry;
kenjiArai 0:5b88d5760320 120 #else
kenjiArai 0:5b88d5760320 121 part_ptr->static_data.partition_flags = 0;
kenjiArai 0:5b88d5760320 122 #endif
kenjiArai 0:5b88d5760320 123
kenjiArai 0:5b88d5760320 124 #if (TFM_LVL != 1) || defined(TFM_PSA_API)
kenjiArai 0:5b88d5760320 125 part_ptr->memory_data.stack_bottom = psp_stack_bottom;
kenjiArai 0:5b88d5760320 126 part_ptr->memory_data.stack_top = psp_stack_top;
kenjiArai 0:5b88d5760320 127 /* Since RW, ZI and stack are configured as one MPU region, configure
kenjiArai 0:5b88d5760320 128 * RW start address to psp_stack_bottom to get RW access to stack
kenjiArai 0:5b88d5760320 129 */
kenjiArai 0:5b88d5760320 130 part_ptr->memory_data.rw_start = psp_stack_bottom;
kenjiArai 0:5b88d5760320 131 #endif
kenjiArai 0:5b88d5760320 132
kenjiArai 0:5b88d5760320 133 part_ptr->runtime_data.partition_state = SPM_PARTITION_STATE_UNINIT;
kenjiArai 0:5b88d5760320 134 tfm_nspm_configure_clients();
kenjiArai 0:5b88d5760320 135 ++g_spm_partition_db.partition_count;
kenjiArai 0:5b88d5760320 136
kenjiArai 0:5b88d5760320 137 /* For the TF-M core environment itself */
kenjiArai 0:5b88d5760320 138 if (g_spm_partition_db.partition_count >= SPM_MAX_PARTITIONS) {
kenjiArai 0:5b88d5760320 139 return SPM_ERR_INVALID_CONFIG;
kenjiArai 0:5b88d5760320 140 }
kenjiArai 0:5b88d5760320 141 part_ptr = &(g_spm_partition_db.partitions[
kenjiArai 0:5b88d5760320 142 g_spm_partition_db.partition_count]);
kenjiArai 0:5b88d5760320 143 part_ptr->static_data.partition_id = TFM_SP_CORE_ID;
kenjiArai 0:5b88d5760320 144 part_ptr->static_data.partition_flags =
kenjiArai 0:5b88d5760320 145 SPM_PART_FLAG_APP_ROT | SPM_PART_FLAG_PSA_ROT;
kenjiArai 0:5b88d5760320 146 part_ptr->runtime_data.partition_state = SPM_PARTITION_STATE_UNINIT;
kenjiArai 0:5b88d5760320 147 ++g_spm_partition_db.partition_count;
kenjiArai 0:5b88d5760320 148
kenjiArai 0:5b88d5760320 149 err = add_user_defined_partitions();
kenjiArai 0:5b88d5760320 150 if (err != SPM_ERR_OK) {
kenjiArai 0:5b88d5760320 151 return err;
kenjiArai 0:5b88d5760320 152 }
kenjiArai 0:5b88d5760320 153
kenjiArai 0:5b88d5760320 154 g_spm_partition_db.is_init = 1;
kenjiArai 0:5b88d5760320 155
kenjiArai 0:5b88d5760320 156 return SPM_ERR_OK;
kenjiArai 0:5b88d5760320 157 }
kenjiArai 0:5b88d5760320 158
kenjiArai 0:5b88d5760320 159 #ifndef TFM_PSA_API
kenjiArai 0:5b88d5760320 160 enum spm_err_t tfm_spm_partition_init(void)
kenjiArai 0:5b88d5760320 161 {
kenjiArai 0:5b88d5760320 162 struct spm_partition_desc_t *part;
kenjiArai 0:5b88d5760320 163 struct tfm_sfn_req_s desc;
kenjiArai 0:5b88d5760320 164 int32_t args[4] = {0};
kenjiArai 0:5b88d5760320 165 int32_t fail_cnt = 0;
kenjiArai 0:5b88d5760320 166 uint32_t idx;
kenjiArai 0:5b88d5760320 167
kenjiArai 0:5b88d5760320 168 /* Call the init function for each partition */
kenjiArai 0:5b88d5760320 169 for (idx = 0; idx < g_spm_partition_db.partition_count; ++idx) {
kenjiArai 0:5b88d5760320 170 part = &g_spm_partition_db.partitions[idx];
kenjiArai 0:5b88d5760320 171 tfm_spm_hal_configure_default_isolation(part->platform_data);
kenjiArai 0:5b88d5760320 172 if (part->static_data.partition_init == NULL) {
kenjiArai 0:5b88d5760320 173 tfm_spm_partition_set_state(idx, SPM_PARTITION_STATE_IDLE);
kenjiArai 0:5b88d5760320 174 tfm_spm_partition_set_caller_partition_idx(idx,
kenjiArai 0:5b88d5760320 175 SPM_INVALID_PARTITION_IDX);
kenjiArai 0:5b88d5760320 176 } else {
kenjiArai 0:5b88d5760320 177 int32_t res;
kenjiArai 0:5b88d5760320 178
kenjiArai 0:5b88d5760320 179 desc.args = args;
kenjiArai 0:5b88d5760320 180 desc.ns_caller = 0U;
kenjiArai 0:5b88d5760320 181 desc.iovec_api = TFM_SFN_API_IOVEC;
kenjiArai 0:5b88d5760320 182 desc.sfn = (sfn_t)part->static_data.partition_init;
kenjiArai 0:5b88d5760320 183 desc.sp_id = part->static_data.partition_id;
kenjiArai 0:5b88d5760320 184 res = tfm_core_sfn_request(&desc);
kenjiArai 0:5b88d5760320 185 if (res == TFM_SUCCESS) {
kenjiArai 0:5b88d5760320 186 tfm_spm_partition_set_state(idx, SPM_PARTITION_STATE_IDLE);
kenjiArai 0:5b88d5760320 187 } else {
kenjiArai 0:5b88d5760320 188 tfm_spm_partition_err_handler(part, TFM_INIT_FAILURE, res);
kenjiArai 0:5b88d5760320 189 fail_cnt++;
kenjiArai 0:5b88d5760320 190 }
kenjiArai 0:5b88d5760320 191 }
kenjiArai 0:5b88d5760320 192 }
kenjiArai 0:5b88d5760320 193
kenjiArai 0:5b88d5760320 194 tfm_secure_api_init_done();
kenjiArai 0:5b88d5760320 195
kenjiArai 0:5b88d5760320 196 if (fail_cnt == 0) {
kenjiArai 0:5b88d5760320 197 return SPM_ERR_OK;
kenjiArai 0:5b88d5760320 198 } else {
kenjiArai 0:5b88d5760320 199 return SPM_ERR_PARTITION_NOT_AVAILABLE;
kenjiArai 0:5b88d5760320 200 }
kenjiArai 0:5b88d5760320 201 }
kenjiArai 0:5b88d5760320 202 #endif /* !defined(TFM_PSA_API) */
kenjiArai 0:5b88d5760320 203
kenjiArai 0:5b88d5760320 204 #if (TFM_LVL != 1) || defined(TFM_PSA_API)
kenjiArai 0:5b88d5760320 205 uint32_t tfm_spm_partition_get_stack_bottom(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 206 {
kenjiArai 0:5b88d5760320 207 return g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 208 memory_data.stack_bottom;
kenjiArai 0:5b88d5760320 209 }
kenjiArai 0:5b88d5760320 210
kenjiArai 0:5b88d5760320 211 uint32_t tfm_spm_partition_get_stack_top(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 212 {
kenjiArai 0:5b88d5760320 213 return g_spm_partition_db.partitions[partition_idx].memory_data.stack_top;
kenjiArai 0:5b88d5760320 214 }
kenjiArai 0:5b88d5760320 215 #endif
kenjiArai 0:5b88d5760320 216
kenjiArai 0:5b88d5760320 217 #if (TFM_LVL != 1) && !defined(TFM_PSA_API)
kenjiArai 0:5b88d5760320 218 enum spm_err_t tfm_spm_partition_sandbox_config(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 219 {
kenjiArai 0:5b88d5760320 220 struct spm_partition_desc_t *part;
kenjiArai 0:5b88d5760320 221 if (!g_spm_partition_db.is_init) {
kenjiArai 0:5b88d5760320 222 return SPM_ERR_PARTITION_DB_NOT_INIT;
kenjiArai 0:5b88d5760320 223 }
kenjiArai 0:5b88d5760320 224
kenjiArai 0:5b88d5760320 225 part = &g_spm_partition_db.partitions[partition_idx];
kenjiArai 0:5b88d5760320 226
kenjiArai 0:5b88d5760320 227 return tfm_spm_hal_partition_sandbox_config(&(part->memory_data),
kenjiArai 0:5b88d5760320 228 part->platform_data);
kenjiArai 0:5b88d5760320 229
kenjiArai 0:5b88d5760320 230 }
kenjiArai 0:5b88d5760320 231
kenjiArai 0:5b88d5760320 232 enum spm_err_t tfm_spm_partition_sandbox_deconfig(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 233 {
kenjiArai 0:5b88d5760320 234 /* This function takes a partition id and disables the
kenjiArai 0:5b88d5760320 235 * SPM partition for that partition
kenjiArai 0:5b88d5760320 236 */
kenjiArai 0:5b88d5760320 237
kenjiArai 0:5b88d5760320 238 struct spm_partition_desc_t *part;
kenjiArai 0:5b88d5760320 239
kenjiArai 0:5b88d5760320 240 part = &g_spm_partition_db.partitions[partition_idx];
kenjiArai 0:5b88d5760320 241
kenjiArai 0:5b88d5760320 242 return tfm_spm_hal_partition_sandbox_deconfig(&(part->memory_data),
kenjiArai 0:5b88d5760320 243 part->platform_data);
kenjiArai 0:5b88d5760320 244 }
kenjiArai 0:5b88d5760320 245
kenjiArai 0:5b88d5760320 246 uint32_t tfm_spm_partition_get_zi_start(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 247 {
kenjiArai 0:5b88d5760320 248 return g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 249 memory_data.zi_start;
kenjiArai 0:5b88d5760320 250 }
kenjiArai 0:5b88d5760320 251
kenjiArai 0:5b88d5760320 252 uint32_t tfm_spm_partition_get_zi_limit(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 253 {
kenjiArai 0:5b88d5760320 254 return g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 255 memory_data.zi_limit;
kenjiArai 0:5b88d5760320 256 }
kenjiArai 0:5b88d5760320 257
kenjiArai 0:5b88d5760320 258 uint32_t tfm_spm_partition_get_rw_start(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 259 {
kenjiArai 0:5b88d5760320 260 return g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 261 memory_data.rw_start;
kenjiArai 0:5b88d5760320 262 }
kenjiArai 0:5b88d5760320 263
kenjiArai 0:5b88d5760320 264 uint32_t tfm_spm_partition_get_rw_limit(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 265 {
kenjiArai 0:5b88d5760320 266 return g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 267 memory_data.rw_limit;
kenjiArai 0:5b88d5760320 268 }
kenjiArai 0:5b88d5760320 269
kenjiArai 0:5b88d5760320 270 void tfm_spm_partition_set_stack(uint32_t partition_idx, uint32_t stack_ptr)
kenjiArai 0:5b88d5760320 271 {
kenjiArai 0:5b88d5760320 272 g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 273 runtime_data.stack_ptr = stack_ptr;
kenjiArai 0:5b88d5760320 274 }
kenjiArai 0:5b88d5760320 275 #endif
kenjiArai 0:5b88d5760320 276
kenjiArai 0:5b88d5760320 277 uint32_t tfm_spm_partition_get_partition_id(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 278 {
kenjiArai 0:5b88d5760320 279 return g_spm_partition_db.partitions[partition_idx].static_data.
kenjiArai 0:5b88d5760320 280 partition_id;
kenjiArai 0:5b88d5760320 281 }
kenjiArai 0:5b88d5760320 282
kenjiArai 0:5b88d5760320 283 uint32_t tfm_spm_partition_get_flags(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 284 {
kenjiArai 0:5b88d5760320 285 return g_spm_partition_db.partitions[partition_idx].static_data.
kenjiArai 0:5b88d5760320 286 partition_flags;
kenjiArai 0:5b88d5760320 287 }
kenjiArai 0:5b88d5760320 288
kenjiArai 0:5b88d5760320 289 #ifndef TFM_PSA_API
kenjiArai 0:5b88d5760320 290 void tfm_spm_partition_store_context(uint32_t partition_idx,
kenjiArai 0:5b88d5760320 291 uint32_t stack_ptr, uint32_t lr)
kenjiArai 0:5b88d5760320 292 {
kenjiArai 0:5b88d5760320 293 g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 294 runtime_data.stack_ptr = stack_ptr;
kenjiArai 0:5b88d5760320 295 g_spm_partition_db.partitions[partition_idx].
kenjiArai 0:5b88d5760320 296 runtime_data.lr = lr;
kenjiArai 0:5b88d5760320 297 }
kenjiArai 0:5b88d5760320 298
kenjiArai 0:5b88d5760320 299 const struct spm_partition_runtime_data_t *
kenjiArai 0:5b88d5760320 300 tfm_spm_partition_get_runtime_data(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 301 {
kenjiArai 0:5b88d5760320 302 return &(g_spm_partition_db.partitions[partition_idx].runtime_data);
kenjiArai 0:5b88d5760320 303 }
kenjiArai 0:5b88d5760320 304
kenjiArai 0:5b88d5760320 305 void tfm_spm_partition_set_state(uint32_t partition_idx, uint32_t state)
kenjiArai 0:5b88d5760320 306 {
kenjiArai 0:5b88d5760320 307 g_spm_partition_db.partitions[partition_idx].runtime_data.partition_state =
kenjiArai 0:5b88d5760320 308 state;
kenjiArai 0:5b88d5760320 309 if (state == SPM_PARTITION_STATE_RUNNING) {
kenjiArai 0:5b88d5760320 310 g_spm_partition_db.running_partition_idx = partition_idx;
kenjiArai 0:5b88d5760320 311 }
kenjiArai 0:5b88d5760320 312 }
kenjiArai 0:5b88d5760320 313
kenjiArai 0:5b88d5760320 314 void tfm_spm_partition_set_caller_partition_idx(uint32_t partition_idx,
kenjiArai 0:5b88d5760320 315 uint32_t caller_partition_idx)
kenjiArai 0:5b88d5760320 316 {
kenjiArai 0:5b88d5760320 317 g_spm_partition_db.partitions[partition_idx].runtime_data.
kenjiArai 0:5b88d5760320 318 caller_partition_idx = caller_partition_idx;
kenjiArai 0:5b88d5760320 319 }
kenjiArai 0:5b88d5760320 320
kenjiArai 0:5b88d5760320 321 void tfm_spm_partition_set_caller_client_id(uint32_t partition_idx,
kenjiArai 0:5b88d5760320 322 int32_t caller_client_id)
kenjiArai 0:5b88d5760320 323 {
kenjiArai 0:5b88d5760320 324 g_spm_partition_db.partitions[partition_idx].runtime_data.
kenjiArai 0:5b88d5760320 325 caller_client_id = caller_client_id;
kenjiArai 0:5b88d5760320 326 }
kenjiArai 0:5b88d5760320 327
kenjiArai 0:5b88d5760320 328 enum spm_err_t tfm_spm_partition_set_share(uint32_t partition_idx,
kenjiArai 0:5b88d5760320 329 uint32_t share)
kenjiArai 0:5b88d5760320 330 {
kenjiArai 0:5b88d5760320 331 enum spm_err_t ret = SPM_ERR_OK;
kenjiArai 0:5b88d5760320 332
kenjiArai 0:5b88d5760320 333 #if TFM_LVL != 1
kenjiArai 0:5b88d5760320 334 /* Only need to set configuration on levels higher than 1 */
kenjiArai 0:5b88d5760320 335 ret = tfm_spm_hal_set_share_region(share);
kenjiArai 0:5b88d5760320 336 #endif
kenjiArai 0:5b88d5760320 337
kenjiArai 0:5b88d5760320 338 if (ret == SPM_ERR_OK) {
kenjiArai 0:5b88d5760320 339 g_spm_partition_db.partitions[partition_idx].runtime_data.share = share;
kenjiArai 0:5b88d5760320 340 }
kenjiArai 0:5b88d5760320 341 return ret;
kenjiArai 0:5b88d5760320 342 }
kenjiArai 0:5b88d5760320 343
kenjiArai 0:5b88d5760320 344 enum spm_err_t tfm_spm_partition_set_iovec(uint32_t partition_idx,
kenjiArai 0:5b88d5760320 345 const int32_t *args)
kenjiArai 0:5b88d5760320 346 {
kenjiArai 0:5b88d5760320 347 struct spm_partition_runtime_data_t *runtime_data =
kenjiArai 0:5b88d5760320 348 &g_spm_partition_db.partitions[partition_idx].runtime_data;
kenjiArai 0:5b88d5760320 349 size_t i;
kenjiArai 0:5b88d5760320 350
kenjiArai 0:5b88d5760320 351 if ((args[1] < 0) || (args[3] < 0)) {
kenjiArai 0:5b88d5760320 352 return SPM_ERR_INVALID_PARAMETER;
kenjiArai 0:5b88d5760320 353 }
kenjiArai 0:5b88d5760320 354
kenjiArai 0:5b88d5760320 355 runtime_data->iovec_args.in_len = (size_t)args[1];
kenjiArai 0:5b88d5760320 356 for (i = 0U; i < runtime_data->iovec_args.in_len; ++i) {
kenjiArai 0:5b88d5760320 357 runtime_data->iovec_args.in_vec[i].base =
kenjiArai 0:5b88d5760320 358 ((psa_invec *)args[0])[i].base;
kenjiArai 0:5b88d5760320 359 runtime_data->iovec_args.in_vec[i].len = ((psa_invec *)args[0])[i].len;
kenjiArai 0:5b88d5760320 360 }
kenjiArai 0:5b88d5760320 361 runtime_data->iovec_args.out_len = (size_t)args[3];
kenjiArai 0:5b88d5760320 362 for (i = 0U; i < runtime_data->iovec_args.out_len; ++i) {
kenjiArai 0:5b88d5760320 363 runtime_data->iovec_args.out_vec[i].base =
kenjiArai 0:5b88d5760320 364 ((psa_outvec *)args[2])[i].base;
kenjiArai 0:5b88d5760320 365 runtime_data->iovec_args.out_vec[i].len =
kenjiArai 0:5b88d5760320 366 ((psa_outvec *)args[2])[i].len;
kenjiArai 0:5b88d5760320 367 }
kenjiArai 0:5b88d5760320 368 runtime_data->orig_outvec = (psa_outvec *)args[2];
kenjiArai 0:5b88d5760320 369 runtime_data->iovec_api = 1;
kenjiArai 0:5b88d5760320 370
kenjiArai 0:5b88d5760320 371 return SPM_ERR_OK;
kenjiArai 0:5b88d5760320 372 }
kenjiArai 0:5b88d5760320 373
kenjiArai 0:5b88d5760320 374 uint32_t tfm_spm_partition_get_running_partition_idx(void)
kenjiArai 0:5b88d5760320 375 {
kenjiArai 0:5b88d5760320 376 return g_spm_partition_db.running_partition_idx;
kenjiArai 0:5b88d5760320 377 }
kenjiArai 0:5b88d5760320 378
kenjiArai 0:5b88d5760320 379 void tfm_spm_partition_cleanup_context(uint32_t partition_idx)
kenjiArai 0:5b88d5760320 380 {
kenjiArai 0:5b88d5760320 381 struct spm_partition_desc_t *partition =
kenjiArai 0:5b88d5760320 382 &(g_spm_partition_db.partitions[partition_idx]);
kenjiArai 0:5b88d5760320 383 int32_t i;
kenjiArai 0:5b88d5760320 384
kenjiArai 0:5b88d5760320 385 partition->runtime_data.caller_partition_idx = SPM_INVALID_PARTITION_IDX;
kenjiArai 0:5b88d5760320 386 partition->runtime_data.share = 0;
kenjiArai 0:5b88d5760320 387 partition->runtime_data.iovec_args.in_len = 0;
kenjiArai 0:5b88d5760320 388 for (i = 0; i < PSA_MAX_IOVEC; ++i) {
kenjiArai 0:5b88d5760320 389 partition->runtime_data.iovec_args.in_vec[i].base = 0;
kenjiArai 0:5b88d5760320 390 partition->runtime_data.iovec_args.in_vec[i].len = 0;
kenjiArai 0:5b88d5760320 391 }
kenjiArai 0:5b88d5760320 392 partition->runtime_data.iovec_args.out_len = 0;
kenjiArai 0:5b88d5760320 393 for (i = 0; i < PSA_MAX_IOVEC; ++i) {
kenjiArai 0:5b88d5760320 394 partition->runtime_data.iovec_args.out_vec[i].base = 0;
kenjiArai 0:5b88d5760320 395 partition->runtime_data.iovec_args.out_vec[i].len = 0;
kenjiArai 0:5b88d5760320 396 }
kenjiArai 0:5b88d5760320 397 partition->runtime_data.orig_outvec = 0;
kenjiArai 0:5b88d5760320 398 partition->runtime_data.iovec_api = 0;
kenjiArai 0:5b88d5760320 399 }
kenjiArai 0:5b88d5760320 400 #endif /* !defined(TFM_PSA_API) */
kenjiArai 0:5b88d5760320 401
kenjiArai 0:5b88d5760320 402 __attribute__((section("SFN")))
kenjiArai 0:5b88d5760320 403 void tfm_spm_partition_change_privilege(uint32_t privileged)
kenjiArai 0:5b88d5760320 404 {
kenjiArai 0:5b88d5760320 405 CONTROL_Type ctrl;
kenjiArai 0:5b88d5760320 406
kenjiArai 0:5b88d5760320 407 ctrl.w = __get_CONTROL();
kenjiArai 0:5b88d5760320 408
kenjiArai 0:5b88d5760320 409 if (privileged == TFM_PARTITION_PRIVILEGED_MODE) {
kenjiArai 0:5b88d5760320 410 ctrl.b.nPRIV = 0;
kenjiArai 0:5b88d5760320 411 } else {
kenjiArai 0:5b88d5760320 412 ctrl.b.nPRIV = 1;
kenjiArai 0:5b88d5760320 413 }
kenjiArai 0:5b88d5760320 414
kenjiArai 0:5b88d5760320 415 __set_CONTROL(ctrl.w);
kenjiArai 0:5b88d5760320 416 }