blob: f71db784d3f91358eb9628e246b3c36fd89315d2 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +01002 * Copyright (c) 2017-2020, Arm Limited. All rights reserved.
Miklos Balint386b8b52017-11-29 13:12:32 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Mingyang Sunda01a972019-07-12 17:32:59 +08008/* All the APIs defined in this file are common for library and IPC model. */
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"
David Hu49a28eb2019-08-14 18:18:15 +080019#include "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"
Shawn Shan6e7be072019-11-29 17:56:29 +080022#include "psa/lifecycle.h"
TTornblom83d96372019-11-19 12:53:16 +010023#include "region.h"
Mate Toth-Pale1475332018-04-09 17:28:49 +020024
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +020025#define NON_SECURE_INTERNAL_PARTITION_DB_IDX 0
26#define TFM_CORE_INTERNAL_PARTITION_DB_IDX 1
Miklos Balint386b8b52017-11-29 13:12:32 +000027
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +020028/* Define SPM DB structure */
Edison Aia8e751e2019-10-12 14:08:15 +080029#include "tfm_spm_db.inc"
Mate Toth-Pal3ad2e3e2019-07-11 21:43:37 +020030
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010031uint32_t get_partition_idx(uint32_t partition_id)
32{
Hugues de Valonf704c802019-02-19 14:51:41 +000033 uint32_t i;
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010034
35 if (partition_id == INVALID_PARTITION_ID) {
36 return SPM_INVALID_PARTITION_IDX;
37 }
38
39 for (i = 0; i < g_spm_partition_db.partition_count; ++i) {
Summer Qin423dbef2019-08-22 15:59:35 +080040 if (g_spm_partition_db.partitions[i].static_data->partition_id ==
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010041 partition_id) {
42 return i;
43 }
44 }
45 return SPM_INVALID_PARTITION_IDX;
46}
47
Miklos Balint386b8b52017-11-29 13:12:32 +000048enum spm_err_t tfm_spm_db_init(void)
49{
Summer Qin423dbef2019-08-22 15:59:35 +080050 uint32_t i;
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010051
Mate Toth-Pal349714a2018-02-23 15:30:24 +010052 /* This function initialises partition db */
Miklos Balint386b8b52017-11-29 13:12:32 +000053
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010054 /* For the non secure Execution environment */
Edison Ai66fbdf12019-07-08 16:05:07 +080055#ifndef TFM_PSA_API
Miklos Balint12735bc2018-08-01 15:45:18 +020056 tfm_nspm_configure_clients();
Summer Qin423dbef2019-08-22 15:59:35 +080057#endif
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010058
Summer Qin423dbef2019-08-22 15:59:35 +080059 for (i = 0; i < g_spm_partition_db.partition_count; i++) {
60#ifndef TFM_PSA_API
61 g_spm_partition_db.partitions[i].runtime_data.partition_state =
62 SPM_PARTITION_STATE_UNINIT;
63 g_spm_partition_db.partitions[i].runtime_data.caller_partition_idx =
64 SPM_INVALID_PARTITION_IDX;
65 g_spm_partition_db.partitions[i].runtime_data.caller_client_id =
66 TFM_INVALID_CLIENT_ID;
Summer Qin423dbef2019-08-22 15:59:35 +080067 g_spm_partition_db.partitions[i].runtime_data.ctx_stack_ptr =
68 ctx_stack_list[i];
Edison Ai66fbdf12019-07-08 16:05:07 +080069#endif /* !defined(TFM_PSA_API) */
Summer Qin423dbef2019-08-22 15:59:35 +080070 g_spm_partition_db.partitions[i].static_data = &static_data_list[i];
Mate Toth-Pal8ac98a72019-11-21 17:30:10 +010071 g_spm_partition_db.partitions[i].platform_data_list =
72 platform_data_list_list[i];
Summer Qin423dbef2019-08-22 15:59:35 +080073#ifdef TFM_PSA_API
74 g_spm_partition_db.partitions[i].memory_data = &memory_data_list[i];
75#endif
76 }
Mate Toth-Pal7345a4b2018-03-08 16:10:28 +010077 g_spm_partition_db.is_init = 1;
78
Miklos Balint386b8b52017-11-29 13:12:32 +000079 return SPM_ERR_OK;
80}
81
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010082uint32_t tfm_spm_partition_get_partition_id(uint32_t partition_idx)
Mate Toth-Pal65291f32018-02-23 14:35:22 +010083{
Summer Qin423dbef2019-08-22 15:59:35 +080084 return g_spm_partition_db.partitions[partition_idx].static_data->
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010085 partition_id;
Mate Toth-Pal349714a2018-02-23 15:30:24 +010086}
87
Mate Toth-Pal59398712018-02-28 17:06:40 +010088uint32_t tfm_spm_partition_get_flags(uint32_t partition_idx)
89{
Summer Qin423dbef2019-08-22 15:59:35 +080090 return g_spm_partition_db.partitions[partition_idx].static_data->
Mate Toth-Pal59398712018-02-28 17:06:40 +010091 partition_flags;
92}
93
Mate Toth-Pal5e6d0342019-11-22 11:43:20 +010094uint32_t tfm_spm_partition_get_privileged_mode(uint32_t partition_flags)
95{
96 if (partition_flags & SPM_PART_FLAG_PSA_ROT) {
97 return TFM_PARTITION_PRIVILEGED_MODE;
98 } else {
99 return TFM_PARTITION_UNPRIVILEGED_MODE;
100 }
101}
102
103bool tfm_is_partition_privileged(uint32_t partition_idx)
104{
105 uint32_t flags = tfm_spm_partition_get_flags(partition_idx);
106
107 return tfm_spm_partition_get_privileged_mode(flags) ==
108 TFM_PARTITION_PRIVILEGED_MODE;
109}
110
Shawn Shan6e7be072019-11-29 17:56:29 +0800111uint32_t tfm_spm_get_lifecycle_state(void)
112{
113 /*
114 * FixMe: return PSA_LIFECYCLE_UNKNOWN to the caller directly. It will be
115 * implemented in the future.
116 */
117 return PSA_LIFECYCLE_UNKNOWN;
118}
119
Edison Aib5571352019-03-22 10:49:52 +0800120__attribute__((section("SFN")))
121void tfm_spm_partition_change_privilege(uint32_t privileged)
122{
123 CONTROL_Type ctrl;
124
125 ctrl.w = __get_CONTROL();
126
127 if (privileged == TFM_PARTITION_PRIVILEGED_MODE) {
128 ctrl.b.nPRIV = 0;
129 } else {
130 ctrl.b.nPRIV = 1;
131 }
132
133 __set_CONTROL(ctrl.w);
134}