blob: e1a024f14761aba83b528f5b9d15108e0af4da01 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Mate Toth-Pal65291f32018-02-23 14:35:22 +01002 * Copyright (c) 2017-2018, Arm Limited. All rights reserved.
Miklos Balint386b8b52017-11-29 13:12:32 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef __SPM_API_H__
9#define __SPM_API_H__
10
11/* This file contains the apis exported by the SPM to tfm core */
Mate Toth-Pal3db437a2018-06-22 16:15:13 +020012#include "tfm_api.h"
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010013#include "spm_partition_defs.h"
Miklos Balint386b8b52017-11-29 13:12:32 +000014#include "secure_fw/core/tfm_secure_api.h"
15
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010016#define SPM_INVALID_PARTITION_IDX (~0U)
17
Miklos Balint386b8b52017-11-29 13:12:32 +000018enum spm_err_t {
19 SPM_ERR_OK = 0,
Mate Toth-Pal349714a2018-02-23 15:30:24 +010020 SPM_ERR_PARTITION_DB_NOT_INIT,
21 SPM_ERR_PARTITION_ALREADY_ACTIVE,
22 SPM_ERR_PARTITION_NOT_AVAILABLE,
Miklos Balint386b8b52017-11-29 13:12:32 +000023 SPM_ERR_INVALID_CONFIG,
24};
25
Mate Toth-Pal65291f32018-02-23 14:35:22 +010026enum spm_part_state_t {
Mate Toth-Pal349714a2018-02-23 15:30:24 +010027 SPM_PARTITION_STATE_UNINIT = 0,
28 SPM_PARTITION_STATE_IDLE,
29 SPM_PARTITION_STATE_RUNNING,
30 SPM_PARTITION_STATE_SUSPENDED,
31 SPM_PARTITION_STATE_BLOCKED,
32 SPM_PARTITION_STATE_CLOSED
Mate Toth-Pal65291f32018-02-23 14:35:22 +010033};
34
Mate Toth-Pal59398712018-02-28 17:06:40 +010035enum spm_part_flag_mask_t {
36 SPM_PART_FLAG_SECURE = 0x01,
37 SPM_PART_FLAG_TRUSTED = 0x02,
38};
39
Miklos Balint386b8b52017-11-29 13:12:32 +000040/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +020041 * \brief Holds the iovec parameters that are passed to a service
42 *
43 * \note The size of the structure is (and have to be) multiple of 8 bytes
44 */
45struct iovec_args_t {
46 psa_invec in_vec[PSA_MAX_IOVEC]; /*!< Array of psa_invec objects */
47 size_t in_len; /*!< Number psa_invec objects in in_vec
48 */
49 psa_outvec out_vec[PSA_MAX_IOVEC]; /*!< Array of psa_outvec objects */
50 size_t out_len; /*!< Number psa_outvec objects in out_vec
51 */
52};
53
54/**
Mate Toth-Pal18b83922018-02-26 17:58:18 +010055 * \brief Runtime context information of a partition
56 */
57struct spm_partition_runtime_data_t {
58 uint32_t partition_state;
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010059 uint32_t caller_partition_idx;
Mate Toth-Pal21a74c92018-04-13 14:05:41 +020060 int32_t caller_client_id;
Mate Toth-Pal18b83922018-02-26 17:58:18 +010061 uint32_t share;
Mate Toth-Pal18b83922018-02-26 17:58:18 +010062 uint32_t stack_ptr;
Miklos Balintace4c3f2018-07-30 12:31:15 +020063 uint32_t lr;
Mate Toth-Pal3db437a2018-06-22 16:15:13 +020064 struct iovec_args_t iovec_args;
65 psa_outvec *orig_outvec;
Mate Toth-Pal18b83922018-02-26 17:58:18 +010066};
67
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010068
Mate Toth-Pal18b83922018-02-26 17:58:18 +010069/**
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010070 * \brief Returns the index of the partition with the given partition ID.
Miklos Balint386b8b52017-11-29 13:12:32 +000071 *
Mate Toth-Pal349714a2018-02-23 15:30:24 +010072 * \param[in] partition_id Partition id
Miklos Balint386b8b52017-11-29 13:12:32 +000073 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010074 * \return the partition idx if partition_id is valid,
75 * \ref SPM_INVALID_PARTITION_IDX othervise
76 */
77uint32_t get_partition_idx(uint32_t partition_id);
78
Mate Toth-Pal3db437a2018-06-22 16:15:13 +020079#if TFM_LVL != 1
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010080/**
81 * \brief Configure isolated sandbox for a partition
82 *
83 * \param[in] partition_idx Partition index
84 *
Miklos Balint386b8b52017-11-29 13:12:32 +000085 * \return Error code \ref spm_err_t
86 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010087 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +000088 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010089enum spm_err_t tfm_spm_partition_sandbox_config(uint32_t partition_idx);
Miklos Balint386b8b52017-11-29 13:12:32 +000090
91/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +010092 * \brief Deconfigure sandbox for a partition
Miklos Balint386b8b52017-11-29 13:12:32 +000093 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010094 * \param[in] partition_idx Partition index
Miklos Balint386b8b52017-11-29 13:12:32 +000095 *
96 * \return Error code \ref spm_err_t
97 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010098 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +000099 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100100enum spm_err_t tfm_spm_partition_sandbox_deconfig(uint32_t partition_idx);
Miklos Balint386b8b52017-11-29 13:12:32 +0000101
102/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100103 * \brief Get bottom of stack region for a partition
Miklos Balint386b8b52017-11-29 13:12:32 +0000104 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100105 * \param[in] partition_idx Partition index
Miklos Balint386b8b52017-11-29 13:12:32 +0000106 *
107 * \return Stack region bottom value
108 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100109 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +0000110 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100111uint32_t tfm_spm_partition_get_stack_bottom(uint32_t partition_idx);
Miklos Balint386b8b52017-11-29 13:12:32 +0000112
113/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100114 * \brief Get top of stack region for a partition
Miklos Balint386b8b52017-11-29 13:12:32 +0000115 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100116 * \param[in] partition_idx Partition index
Miklos Balint386b8b52017-11-29 13:12:32 +0000117 *
118 * \return Stack region top value
119 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100120 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +0000121 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100122uint32_t tfm_spm_partition_get_stack_top(uint32_t partition_idx);
123
124/**
Mate Toth-Pal21a74c92018-04-13 14:05:41 +0200125 * \brief Get the start of the zero-initialised region for a partition
126 *
127 * \param[in] partition_idx Partition idx
128 *
129 * \return Start of the zero-initialised region
130 *
131 * \note This function doesn't check if partition_idx is valid.
132 */
133uint32_t tfm_spm_partition_get_zi_start(uint32_t partition_idx);
134
135/**
136 * \brief Get the limit of the zero-initialised region for a partition
137 *
138 * \param[in] partition_idx Partition idx
139 *
140 * \return Limit of the zero-initialised region
141 *
142 * \note This function doesn't check if partition_idx is valid.
143 * \note The address returned is not part of the region.
144 */
145uint32_t tfm_spm_partition_get_zi_limit(uint32_t partition_idx);
146
147/**
148 * \brief Get the start of the read-write region for a partition
149 *
150 * \param[in] partition_idx Partition idx
151 *
152 * \return Start of the read-write region
153 *
154 * \note This function doesn't check if partition_idx is valid.
155 */
156uint32_t tfm_spm_partition_get_rw_start(uint32_t partition_idx);
157
158/**
159 * \brief Get the limit of the read-write region for a partition
160 *
161 * \param[in] partition_idx Partition idx
162 *
163 * \return Limit of the read-write region
164 *
165 * \note This function doesn't check if partition_idx is valid.
166 * \note The address returned is not part of the region.
167 */
168uint32_t tfm_spm_partition_get_rw_limit(uint32_t partition_idx);
169
170/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200171 * \brief Save stack pointer for partition in database
172 *
173 * \param[in] partition_idx Partition index
174 * \param[in] stack_ptr Stack pointer to be stored
175 *
176 * \note This function doesn't check if partition_idx is valid.
177 */
178void tfm_spm_partition_set_stack(uint32_t partition_id, uint32_t stack_ptr);
179#endif
180
181/**
182 * \brief Get the flags associated with a partition
183 *
184 * \param[in] partition_idx Partition index
185 *
186 * \return Flags associated with the partition
187 *
188 * \note This function doesn't check if partition_idx is valid.
189 */
190uint32_t tfm_spm_partition_get_flags(uint32_t partition_idx);
191
192/**
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100193 * \brief Get the current runtime data of a partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100194 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100195 * \param[in] partition_idx Partition index
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100196 *
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100197 * \return The runtime data of the specified partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100198 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100199 * \note This function doesn't check if partition_idx is valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100200 */
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100201const struct spm_partition_runtime_data_t *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100202 tfm_spm_partition_get_runtime_data(uint32_t partition_idx);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100203
204/**
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100205 * \brief Returns the index of the partition that has running state
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100206 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100207 * \return The index of the partition with the running state, if there is any
208 * set. 0 otherwise.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100209 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100210uint32_t tfm_spm_partition_get_running_partition_idx(void);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100211
212/**
Miklos Balintace4c3f2018-07-30 12:31:15 +0200213 * \brief Save stack pointer and link register for partition in database
214 *
215 * \param[in] partition_idx Partition index
216 * \param[in] stack_ptr Stack pointer to be stored
217 * \param[in] lr Link register to be stored
218 *
219 * \note This function doesn't check if partition_idx is valid.
220 */
221void tfm_spm_partition_store_context(uint32_t partition_idx,
222 uint32_t stack_ptr, uint32_t lr);
223
224/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200225 * \brief Get the id of the partition for its index from the db
226 *
227 * \param[in] partition_idx Partition index
228 *
229 * \return Partition ID for that partition
230 *
231 * \note This function doesn't check if partition_idx is valid.
232 */
233uint32_t tfm_spm_partition_get_partition_id(uint32_t partition_idx);
234
235/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100236 * \brief Set the current state of a partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100237 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100238 * \param[in] partition_idx Partition index
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100239 * \param[in] state The state to be set
240 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100241 * \note This function doesn't check if partition_idx is valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100242 * \note The \ref state has to have the value set of \ref spm_part_state_t.
243 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100244void tfm_spm_partition_set_state(uint32_t partition_idx, uint32_t state);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100245
246/**
Miklos Balint6a139ae2018-04-04 19:44:37 +0200247 * \brief Set the caller partition index for a given partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100248 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100249 * \param[in] partition_idx Partition index
Miklos Balint6a139ae2018-04-04 19:44:37 +0200250 * \param[in] caller_partition_idx The index of the caller partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100251 *
Miklos Balint6a139ae2018-04-04 19:44:37 +0200252 * \note This function doesn't check if any of the partition_idxs are valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100253 */
Miklos Balint6a139ae2018-04-04 19:44:37 +0200254void tfm_spm_partition_set_caller_partition_idx(uint32_t partition_idx,
255 uint32_t caller_partition_idx);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100256
257/**
Mate Toth-Pal21a74c92018-04-13 14:05:41 +0200258* \brief Set the caller client ID for a given partition
259*
260* \param[in] partition_idx Partition index
261* \param[in] caller_client_id The ID of the calling client
262*
263* \note This function doesn't check if any of the partition_idxs are valid.
264*/
265void tfm_spm_partition_set_caller_client_id(uint32_t partition_idx,
266 int32_t caller_client_id);
267
268/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100269 * \brief Set the buffer share region of the partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100270 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100271 * \param[in] partition_idx Partition index
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100272 * \param[in] share The buffer share region to be set
273 *
274 * \return Error code \ref spm_err_t
275 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100276 * \note This function doesn't check if partition_idx is valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100277 * \note share has to have the value set of \ref tfm_buffer_share_region_e
278 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100279enum spm_err_t tfm_spm_partition_set_share(uint32_t partition_idx,
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100280 uint32_t share);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100281
282/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200283 * \brief Set the iovec parameters for the partition
284 *
285 * \param[in] partition_idx Partition index
286 * \param[in] args The arguments of the secure function
287 *
288 * args is expected to be of type int32_t[4] where:
289 * args[0] is in_vec
290 * args[1] is in_len
291 * args[2] is out_vec
292 * args[3] is out_len
293 *
294 * \note This function doesn't check if partition_idx is valid.
295 * \note This function assumes that the iovecs that are passed in args are
296 * valid, and does no sanity check on them at all.
297 */
298void tfm_spm_partition_set_iovec(uint32_t partition_idx, int32_t *args);
299
300/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100301 * \brief Initialize partition database
Miklos Balint386b8b52017-11-29 13:12:32 +0000302 *
303 * \return Error code \ref spm_err_t
304 */
305enum spm_err_t tfm_spm_db_init(void);
306
307/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100308 * \brief Execute partition init function
Miklos Balint386b8b52017-11-29 13:12:32 +0000309 *
310 * \return Error code \ref spm_err_t
311 */
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100312enum spm_err_t tfm_spm_partition_init(void);
Miklos Balint386b8b52017-11-29 13:12:32 +0000313
314/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100315 * \brief Clears the context info from the database for a partition.
Miklos Balint386b8b52017-11-29 13:12:32 +0000316 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100317 * \param[in] partition_idx Partition index
Miklos Balint386b8b52017-11-29 13:12:32 +0000318 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100319 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +0000320 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100321void tfm_spm_partition_cleanup_context(uint32_t partition_idx);
Miklos Balint386b8b52017-11-29 13:12:32 +0000322
323#endif /*__SPM_API_H__ */