blob: a15434d43aeeab273d709e4b6c9580fac93d7fa6 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Gyorgy Szing40a7af02019-02-06 14:19:47 +01002 * 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
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
Summer Qineb537e52019-03-29 09:57:10 +080018/* Privileged definitions for partition thread mode */
19#define TFM_PARTITION_PRIVILEGED_MODE 1
20#define TFM_PARTITION_UNPRIVILEGED_MODE 0
21
Miklos Balint386b8b52017-11-29 13:12:32 +000022enum spm_err_t {
23 SPM_ERR_OK = 0,
Mate Toth-Pal349714a2018-02-23 15:30:24 +010024 SPM_ERR_PARTITION_DB_NOT_INIT,
25 SPM_ERR_PARTITION_ALREADY_ACTIVE,
26 SPM_ERR_PARTITION_NOT_AVAILABLE,
Hugues de Valonf704c802019-02-19 14:51:41 +000027 SPM_ERR_INVALID_PARAMETER,
Miklos Balint386b8b52017-11-29 13:12:32 +000028 SPM_ERR_INVALID_CONFIG,
29};
30
Mate Toth-Pal65291f32018-02-23 14:35:22 +010031enum spm_part_state_t {
Mate Toth-Pal349714a2018-02-23 15:30:24 +010032 SPM_PARTITION_STATE_UNINIT = 0,
33 SPM_PARTITION_STATE_IDLE,
34 SPM_PARTITION_STATE_RUNNING,
35 SPM_PARTITION_STATE_SUSPENDED,
36 SPM_PARTITION_STATE_BLOCKED,
37 SPM_PARTITION_STATE_CLOSED
Mate Toth-Pal65291f32018-02-23 14:35:22 +010038};
39
Mate Toth-Pal59398712018-02-28 17:06:40 +010040enum spm_part_flag_mask_t {
Edison Aibb614aa2018-11-21 15:15:00 +080041 SPM_PART_FLAG_APP_ROT = 0x01,
42 SPM_PART_FLAG_PSA_ROT = 0x02,
43 SPM_PART_FLAG_IPC = 0x04
Mate Toth-Pal59398712018-02-28 17:06:40 +010044};
45
Miklos Balint386b8b52017-11-29 13:12:32 +000046/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +020047 * \brief Holds the iovec parameters that are passed to a service
48 *
49 * \note The size of the structure is (and have to be) multiple of 8 bytes
50 */
51struct iovec_args_t {
52 psa_invec in_vec[PSA_MAX_IOVEC]; /*!< Array of psa_invec objects */
53 size_t in_len; /*!< Number psa_invec objects in in_vec
54 */
55 psa_outvec out_vec[PSA_MAX_IOVEC]; /*!< Array of psa_outvec objects */
56 size_t out_len; /*!< Number psa_outvec objects in out_vec
57 */
58};
59
60/**
Mate Toth-Pal18b83922018-02-26 17:58:18 +010061 * \brief Runtime context information of a partition
62 */
63struct spm_partition_runtime_data_t {
64 uint32_t partition_state;
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010065 uint32_t caller_partition_idx;
Mate Toth-Pal21a74c92018-04-13 14:05:41 +020066 int32_t caller_client_id;
Mate Toth-Pal18b83922018-02-26 17:58:18 +010067 uint32_t share;
Mate Toth-Pal18b83922018-02-26 17:58:18 +010068 uint32_t stack_ptr;
Miklos Balintace4c3f2018-07-30 12:31:15 +020069 uint32_t lr;
Mate Toth-Pal2a6f8c22018-12-13 16:37:17 +010070 int32_t iovec_api; /*!< Whether the function in the partition
71 * had been called using the iovec API.
72 * FIXME: Remove the field once this is the
73 * only option
74 */
Mate Toth-Pal3db437a2018-06-22 16:15:13 +020075 struct iovec_args_t iovec_args;
76 psa_outvec *orig_outvec;
Mate Toth-Pal18b83922018-02-26 17:58:18 +010077};
78
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010079
Mate Toth-Pal18b83922018-02-26 17:58:18 +010080/**
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010081 * \brief Returns the index of the partition with the given partition ID.
Miklos Balint386b8b52017-11-29 13:12:32 +000082 *
Mate Toth-Pal349714a2018-02-23 15:30:24 +010083 * \param[in] partition_id Partition id
Miklos Balint386b8b52017-11-29 13:12:32 +000084 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +010085 * \return the partition idx if partition_id is valid,
86 * \ref SPM_INVALID_PARTITION_IDX othervise
87 */
88uint32_t get_partition_idx(uint32_t partition_id);
89
Miklos Balintdd02bb32019-05-26 21:13:12 +020090#if (TFM_LVL != 1) || defined(TFM_PSA_API)
Summer Qind00e4db2019-05-09 18:03:52 +080091/**
92 * \brief Get bottom of stack region for a partition
93 *
94 * \param[in] partition_idx Partition index
95 *
96 * \return Stack region bottom value
97 *
98 * \note This function doesn't check if partition_idx is valid.
99 */
100uint32_t tfm_spm_partition_get_stack_bottom(uint32_t partition_idx);
101
102/**
103 * \brief Get top of stack region for a partition
104 *
105 * \param[in] partition_idx Partition index
106 *
107 * \return Stack region top value
108 *
109 * \note This function doesn't check if partition_idx is valid.
110 */
111uint32_t tfm_spm_partition_get_stack_top(uint32_t partition_idx);
Miklos Balintdd02bb32019-05-26 21:13:12 +0200112#endif
Summer Qind00e4db2019-05-09 18:03:52 +0800113
Miklos Balintdd02bb32019-05-26 21:13:12 +0200114#if (TFM_LVL != 1) && !defined(TFM_PSA_API)
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100115/**
116 * \brief Configure isolated sandbox for a partition
117 *
118 * \param[in] partition_idx Partition index
119 *
Miklos Balint386b8b52017-11-29 13:12:32 +0000120 * \return Error code \ref spm_err_t
121 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100122 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +0000123 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100124enum spm_err_t tfm_spm_partition_sandbox_config(uint32_t partition_idx);
Miklos Balint386b8b52017-11-29 13:12:32 +0000125
126/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100127 * \brief Deconfigure sandbox for a partition
Miklos Balint386b8b52017-11-29 13:12:32 +0000128 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100129 * \param[in] partition_idx Partition index
Miklos Balint386b8b52017-11-29 13:12:32 +0000130 *
131 * \return Error code \ref spm_err_t
132 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100133 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +0000134 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100135enum spm_err_t tfm_spm_partition_sandbox_deconfig(uint32_t partition_idx);
Miklos Balint386b8b52017-11-29 13:12:32 +0000136
137/**
Mate Toth-Pal21a74c92018-04-13 14:05:41 +0200138 * \brief Get the start of the zero-initialised region for a partition
139 *
140 * \param[in] partition_idx Partition idx
141 *
142 * \return Start of the zero-initialised region
143 *
144 * \note This function doesn't check if partition_idx is valid.
145 */
146uint32_t tfm_spm_partition_get_zi_start(uint32_t partition_idx);
147
148/**
149 * \brief Get the limit of the zero-initialised region for a partition
150 *
151 * \param[in] partition_idx Partition idx
152 *
153 * \return Limit of the zero-initialised region
154 *
155 * \note This function doesn't check if partition_idx is valid.
156 * \note The address returned is not part of the region.
157 */
158uint32_t tfm_spm_partition_get_zi_limit(uint32_t partition_idx);
159
160/**
161 * \brief Get the start of the read-write region for a partition
162 *
163 * \param[in] partition_idx Partition idx
164 *
165 * \return Start of the read-write region
166 *
167 * \note This function doesn't check if partition_idx is valid.
168 */
169uint32_t tfm_spm_partition_get_rw_start(uint32_t partition_idx);
170
171/**
172 * \brief Get the limit of the read-write region for a partition
173 *
174 * \param[in] partition_idx Partition idx
175 *
176 * \return Limit of the read-write region
177 *
178 * \note This function doesn't check if partition_idx is valid.
179 * \note The address returned is not part of the region.
180 */
181uint32_t tfm_spm_partition_get_rw_limit(uint32_t partition_idx);
182
183/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200184 * \brief Save stack pointer for partition in database
185 *
186 * \param[in] partition_idx Partition index
187 * \param[in] stack_ptr Stack pointer to be stored
188 *
189 * \note This function doesn't check if partition_idx is valid.
190 */
Gyorgy Szing40a7af02019-02-06 14:19:47 +0100191void tfm_spm_partition_set_stack(uint32_t partition_idx, uint32_t stack_ptr);
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200192#endif
193
194/**
Summer Qinb4a854d2019-05-29 15:31:22 +0800195 * \brief Get the id of the partition for its index from the db
196 *
197 * \param[in] partition_idx Partition index
198 *
199 * \return Partition ID for that partition
200 *
201 * \note This function doesn't check if partition_idx is valid.
202 */
203uint32_t tfm_spm_partition_get_partition_id(uint32_t partition_idx);
204
205/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200206 * \brief Get the flags associated with a partition
207 *
208 * \param[in] partition_idx Partition index
209 *
210 * \return Flags associated with the partition
211 *
212 * \note This function doesn't check if partition_idx is valid.
213 */
214uint32_t tfm_spm_partition_get_flags(uint32_t partition_idx);
215
Summer Qinb4a854d2019-05-29 15:31:22 +0800216#ifndef TFM_PSA_API
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200217/**
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100218 * \brief Get the current runtime data of a partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100219 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100220 * \param[in] partition_idx Partition index
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100221 *
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100222 * \return The runtime data of the specified partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100223 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100224 * \note This function doesn't check if partition_idx is valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100225 */
Mate Toth-Pal18b83922018-02-26 17:58:18 +0100226const struct spm_partition_runtime_data_t *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100227 tfm_spm_partition_get_runtime_data(uint32_t partition_idx);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100228
229/**
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100230 * \brief Returns the index of the partition that has running state
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100231 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100232 * \return The index of the partition with the running state, if there is any
233 * set. 0 otherwise.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100234 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100235uint32_t tfm_spm_partition_get_running_partition_idx(void);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100236
237/**
Miklos Balintace4c3f2018-07-30 12:31:15 +0200238 * \brief Save stack pointer and link register for partition in database
239 *
240 * \param[in] partition_idx Partition index
241 * \param[in] stack_ptr Stack pointer to be stored
242 * \param[in] lr Link register to be stored
243 *
244 * \note This function doesn't check if partition_idx is valid.
245 */
246void tfm_spm_partition_store_context(uint32_t partition_idx,
247 uint32_t stack_ptr, uint32_t lr);
248
249/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100250 * \brief Set the current state of a partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100251 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100252 * \param[in] partition_idx Partition index
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100253 * \param[in] state The state to be set
254 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100255 * \note This function doesn't check if partition_idx is valid.
Gyorgy Szing40a7af02019-02-06 14:19:47 +0100256 * \note The state has to have the value set of \ref spm_part_state_t.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100257 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100258void tfm_spm_partition_set_state(uint32_t partition_idx, uint32_t state);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100259
260/**
Miklos Balint6a139ae2018-04-04 19:44:37 +0200261 * \brief Set the caller partition index for a given partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100262 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100263 * \param[in] partition_idx Partition index
Miklos Balint6a139ae2018-04-04 19:44:37 +0200264 * \param[in] caller_partition_idx The index of the caller partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100265 *
Miklos Balint6a139ae2018-04-04 19:44:37 +0200266 * \note This function doesn't check if any of the partition_idxs are valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100267 */
Miklos Balint6a139ae2018-04-04 19:44:37 +0200268void tfm_spm_partition_set_caller_partition_idx(uint32_t partition_idx,
269 uint32_t caller_partition_idx);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100270
271/**
Mate Toth-Pal21a74c92018-04-13 14:05:41 +0200272* \brief Set the caller client ID for a given partition
273*
274* \param[in] partition_idx Partition index
275* \param[in] caller_client_id The ID of the calling client
276*
277* \note This function doesn't check if any of the partition_idxs are valid.
278*/
279void tfm_spm_partition_set_caller_client_id(uint32_t partition_idx,
280 int32_t caller_client_id);
281
282/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100283 * \brief Set the buffer share region of the partition
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100284 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100285 * \param[in] partition_idx Partition index
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100286 * \param[in] share The buffer share region to be set
287 *
288 * \return Error code \ref spm_err_t
289 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100290 * \note This function doesn't check if partition_idx is valid.
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100291 * \note share has to have the value set of \ref tfm_buffer_share_region_e
292 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100293enum spm_err_t tfm_spm_partition_set_share(uint32_t partition_idx,
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100294 uint32_t share);
Mate Toth-Pal65291f32018-02-23 14:35:22 +0100295
296/**
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200297 * \brief Set the iovec parameters for the partition
298 *
299 * \param[in] partition_idx Partition index
300 * \param[in] args The arguments of the secure function
301 *
302 * args is expected to be of type int32_t[4] where:
303 * args[0] is in_vec
304 * args[1] is in_len
305 * args[2] is out_vec
306 * args[3] is out_len
307 *
Hugues de Valonf704c802019-02-19 14:51:41 +0000308 * \return Error code \ref spm_err_t
309 *
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200310 * \note This function doesn't check if partition_idx is valid.
311 * \note This function assumes that the iovecs that are passed in args are
312 * valid, and does no sanity check on them at all.
313 */
Hugues de Valonf704c802019-02-19 14:51:41 +0000314enum spm_err_t tfm_spm_partition_set_iovec(uint32_t partition_idx,
315 const int32_t *args);
Mate Toth-Pal3db437a2018-06-22 16:15:13 +0200316
317/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100318 * \brief Execute partition init function
Miklos Balint386b8b52017-11-29 13:12:32 +0000319 *
320 * \return Error code \ref spm_err_t
321 */
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100322enum spm_err_t tfm_spm_partition_init(void);
Miklos Balint386b8b52017-11-29 13:12:32 +0000323
324/**
Mate Toth-Pal349714a2018-02-23 15:30:24 +0100325 * \brief Clears the context info from the database for a partition.
Miklos Balint386b8b52017-11-29 13:12:32 +0000326 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100327 * \param[in] partition_idx Partition index
Miklos Balint386b8b52017-11-29 13:12:32 +0000328 *
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100329 * \note This function doesn't check if partition_idx is valid.
Miklos Balint386b8b52017-11-29 13:12:32 +0000330 */
Mate Toth-Pal52674ab2018-02-26 09:47:56 +0100331void tfm_spm_partition_cleanup_context(uint32_t partition_idx);
Summer Qinb4a854d2019-05-29 15:31:22 +0800332#endif /* !defined(TFM_PSA_API) */
333
334/**
335 * \brief Initialize partition database
336 *
337 * \return Error code \ref spm_err_t
338 */
339enum spm_err_t tfm_spm_db_init(void);
Miklos Balint386b8b52017-11-29 13:12:32 +0000340
Edison Aib5571352019-03-22 10:49:52 +0800341/**
342 * \brief Change the privilege mode for partition thread mode.
343 *
344 * \param[in] privileged Privileged mode,
345 * \ref TFM_PARTITION_PRIVILEGED_MODE
346 * and \ref TFM_PARTITION_UNPRIVILEGED_MODE
347 *
348 * \note Barrier instructions are not called by this function, and if
349 * it is called in thread mode, it might be necessary to call
350 * them after this function returns (just like it is done in
351 * jump_to_ns_code()).
352 */
353void tfm_spm_partition_change_privilege(uint32_t privileged);
354
Miklos Balint386b8b52017-11-29 13:12:32 +0000355#endif /*__SPM_API_H__ */