blob: 977f394ce90de756364cdc8814ff45af74c2c947 [file] [log] [blame]
Miklos Balint9ecb24c2018-03-29 15:30:28 +02001/*
Kevin Penge61e7052022-01-27 14:57:06 +08002 * Copyright (c) 2018-2022, Arm Limited. All rights reserved.
Miklos Balint9ecb24c2018-03-29 15:30:28 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef __PSA_SERVICE_H__
9#define __PSA_SERVICE_H__
10
Jamie Fox520fb4d2019-06-13 14:27:21 +010011#include <stddef.h>
12#include <stdint.h>
13
Jamie Fox520fb4d2019-06-13 14:27:21 +010014#include "psa/client.h"
Ken Liu82e3eac2021-10-14 16:19:13 +080015#include "psa_config.h"
16#include "psa/error.h"
Shawn Shan038348e2021-09-08 17:11:04 +080017#include "psa/framework_feature.h"
Jamie Fox520fb4d2019-06-13 14:27:21 +010018
Miklos Balint9ecb24c2018-03-29 15:30:28 +020019#ifdef __cplusplus
20extern "C" {
21#endif
22
Edison Aib3e56962018-09-04 19:12:31 +080023/********************** PSA Secure Partition Macros and Types ****************/
24
Summer Qin4b1d03b2019-07-02 14:56:08 +080025/**
26 * A timeout value that requests a polling wait operation.
27 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020028#define PSA_POLL (0x00000000u)
Summer Qin4b1d03b2019-07-02 14:56:08 +080029
30/**
31 * A timeout value that requests a blocking wait operation.
32 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020033#define PSA_BLOCK (0x80000000u)
34
Summer Qin4b1d03b2019-07-02 14:56:08 +080035/**
36 * A mask value that includes all Secure Partition signals.
37 */
38#define PSA_WAIT_ANY (0xFFFFFFFFu)
Edison Aib3e56962018-09-04 19:12:31 +080039
Summer Qin4b1d03b2019-07-02 14:56:08 +080040/**
41 * The signal number for the Secure Partition doorbell.
42 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020043#define PSA_DOORBELL (0x00000008u)
44
45/* PSA message types */
Summer Qin4b1d03b2019-07-02 14:56:08 +080046/* An IPC message type that indicates a new connection. */
47#define PSA_IPC_CONNECT (-1)
48/* An IPC message type that indicates the end of a connection. */
49#define PSA_IPC_DISCONNECT (-2)
Edison Aib3e56962018-09-04 19:12:31 +080050
Kevin Peng9280ae92021-01-13 14:42:10 +080051/* FLIH return types */
52#define PSA_FLIH_NO_SIGNAL ((psa_flih_result_t) 0)
53#define PSA_FLIH_SIGNAL ((psa_flih_result_t) 1)
54
Edison Aib3e56962018-09-04 19:12:31 +080055/* Store a set of one or more Secure Partition signals */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020056typedef uint32_t psa_signal_t;
57
Kevin Pengf9a0eb02021-01-05 15:06:05 +080058/* A type used to temporarily store a previous interrupt state. */
59typedef uint32_t psa_irq_status_t;
60
Kevin Peng9280ae92021-01-13 14:42:10 +080061/* The type of the return value from an FLIH function */
62typedef uint32_t psa_flih_result_t;
63
Miklos Balint9ecb24c2018-03-29 15:30:28 +020064/**
Edison Aib3e56962018-09-04 19:12:31 +080065 * Describe a message received by an RoT Service after calling \ref psa_get().
Miklos Balint9ecb24c2018-03-29 15:30:28 +020066 */
67typedef struct psa_msg_t {
Summer Qin4b1d03b2019-07-02 14:56:08 +080068 int32_t type; /* One of the following values:
Edison Aib3e56962018-09-04 19:12:31 +080069 * \ref PSA_IPC_CONNECT
Summer Qin4b1d03b2019-07-02 14:56:08 +080070 * >= 0
Edison Aib3e56962018-09-04 19:12:31 +080071 * \ref PSA_IPC_DISCONNECT
72 */
73 psa_handle_t handle; /* A reference generated by the SPM to the
74 * message returned by psa_get().
75 */
Kevin Penge61e7052022-01-27 14:57:06 +080076 int32_t client_id; /*
77 * Partition ID of the sender of the
78 * message:
79 * - secure partition id;
80 * - non secure client endpoint id.
81 */
Sherry Zhang6b6cb282023-03-02 13:26:45 +080082#if CONFIG_TFM_CONNECTION_BASED_SERVICE_API == 1
Edison Aib3e56962018-09-04 19:12:31 +080083 void *rhandle; /* Be useful for binding a connection to some
84 * application-specific data or function
85 * pointer within the RoT Service
86 * implementation.
87 */
Sherry Zhang6b6cb282023-03-02 13:26:45 +080088#endif
Edison Aib3e56962018-09-04 19:12:31 +080089 size_t in_size[PSA_MAX_IOVEC]; /* Provide the size of each client input
90 * vector in bytes.
91 */
92 size_t out_size[PSA_MAX_IOVEC];/* Provide the size of each client output
93 * vector in bytes.
94 */
Miklos Balint9ecb24c2018-03-29 15:30:28 +020095} psa_msg_t;
96
Edison Aib3e56962018-09-04 19:12:31 +080097/************************* PSA Secure Partition API **************************/
Miklos Balint9ecb24c2018-03-29 15:30:28 +020098
99/**
Edison Aib3e56962018-09-04 19:12:31 +0800100 * \brief Return the Secure Partition interrupt signals that have been asserted
101 * from a subset of signals provided by the caller.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200102 *
Edison Aib3e56962018-09-04 19:12:31 +0800103 * \param[in] signal_mask A set of signals to query. Signals that are not
104 * in this set will be ignored.
105 * \param[in] timeout Specify either blocking \ref PSA_BLOCK or
106 * polling \ref PSA_POLL operation.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200107 *
Edison Aib3e56962018-09-04 19:12:31 +0800108 * \retval >0 At least one signal is asserted.
109 * \retval 0 No signals are asserted. This is only seen when
110 * a polling timeout is used.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200111 */
Edison Aib3e56962018-09-04 19:12:31 +0800112psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200113
114/**
Edison Aib3e56962018-09-04 19:12:31 +0800115 * \brief Retrieve the message which corresponds to a given RoT Service signal
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200116 * and remove the message from the RoT Service queue.
117 *
Edison Aib3e56962018-09-04 19:12:31 +0800118 * \param[in] signal The signal value for an asserted RoT Service.
119 * \param[out] msg Pointer to \ref psa_msg_t object for receiving
120 * the message.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200121 *
Edison Aib3e56962018-09-04 19:12:31 +0800122 * \retval PSA_SUCCESS Success, *msg will contain the delivered
123 * message.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800124 * \retval PSA_ERROR_DOES_NOT_EXIST Message could not be delivered.
125 * \retval "PROGRAMMER ERROR" The call is invalid because one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800126 * following are true:
127 * \arg signal has more than a single bit set.
128 * \arg signal does not correspond to an RoT Service.
129 * \arg The RoT Service signal is not currently
130 * asserted.
131 * \arg The msg pointer provided is not a valid memory
132 * reference.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200133 */
Edison Aib3e56962018-09-04 19:12:31 +0800134psa_status_t psa_get(psa_signal_t signal, psa_msg_t *msg);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200135
136/**
Edison Aib3e56962018-09-04 19:12:31 +0800137 * \brief Associate some RoT Service private data with a client connection.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200138 *
Edison Aib3e56962018-09-04 19:12:31 +0800139 * \param[in] msg_handle Handle for the client's message.
140 * \param[in] rhandle Reverse handle allocated by the RoT Service.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200141 *
Edison Aib3e56962018-09-04 19:12:31 +0800142 * \retval void Success, rhandle will be provided with all
143 * subsequent messages delivered on this
144 * connection.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800145 * \retval "PROGRAMMER ERROR" msg_handle is invalid.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200146 */
147void psa_set_rhandle(psa_handle_t msg_handle, void *rhandle);
148
149/**
Edison Aib3e56962018-09-04 19:12:31 +0800150 * \brief Read a message parameter or part of a message parameter from a client
151 * input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200152 *
Edison Aib3e56962018-09-04 19:12:31 +0800153 * \param[in] msg_handle Handle for the client's message.
154 * \param[in] invec_idx Index of the input vector to read from. Must be
155 * less than \ref PSA_MAX_IOVEC.
156 * \param[out] buffer Buffer in the Secure Partition to copy the
157 * requested data to.
158 * \param[in] num_bytes Maximum number of bytes to be read from the
159 * client input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200160 *
Edison Aib3e56962018-09-04 19:12:31 +0800161 * \retval >0 Number of bytes copied.
162 * \retval 0 There was no remaining data in this input
163 * vector.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800164 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800165 * following are true:
166 * \arg msg_handle is invalid.
167 * \arg msg_handle does not refer to a
168 * \ref PSA_IPC_CALL message.
169 * \arg invec_idx is equal to or greater than
170 * \ref PSA_MAX_IOVEC.
171 * \arg the memory reference for buffer is invalid or
172 * not writable.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200173 */
174size_t psa_read(psa_handle_t msg_handle, uint32_t invec_idx,
Edison Aib3e56962018-09-04 19:12:31 +0800175 void *buffer, size_t num_bytes);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200176
177/**
Edison Aib3e56962018-09-04 19:12:31 +0800178 * \brief Skip over part of a client input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200179 *
Edison Aib3e56962018-09-04 19:12:31 +0800180 * \param[in] msg_handle Handle for the client's message.
181 * \param[in] invec_idx Index of input vector to skip from. Must be
182 * less than \ref PSA_MAX_IOVEC.
183 * \param[in] num_bytes Maximum number of bytes to skip in the client
184 * input vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200185 *
Edison Aib3e56962018-09-04 19:12:31 +0800186 * \retval >0 Number of bytes skipped.
187 * \retval 0 There was no remaining data in this input
188 * vector.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800189 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800190 * following are true:
191 * \arg msg_handle is invalid.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800192 * \arg msg_handle does not refer to a request
193 * message.
Edison Aib3e56962018-09-04 19:12:31 +0800194 * \arg invec_idx is equal to or greater than
195 * \ref PSA_MAX_IOVEC.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200196 */
197size_t psa_skip(psa_handle_t msg_handle, uint32_t invec_idx, size_t num_bytes);
198
199/**
Edison Aib3e56962018-09-04 19:12:31 +0800200 * \brief Write a message response to a client output vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200201 *
Edison Aib3e56962018-09-04 19:12:31 +0800202 * \param[in] msg_handle Handle for the client's message.
203 * \param[out] outvec_idx Index of output vector in message to write to.
204 * Must be less than \ref PSA_MAX_IOVEC.
205 * \param[in] buffer Buffer with the data to write.
206 * \param[in] num_bytes Number of bytes to write to the client output
207 * vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200208 *
Edison Aib3e56962018-09-04 19:12:31 +0800209 * \retval void Success
Summer Qin4b1d03b2019-07-02 14:56:08 +0800210 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800211 * following are true:
212 * \arg msg_handle is invalid.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800213 * \arg msg_handle does not refer to a request
214 * message.
Edison Aib3e56962018-09-04 19:12:31 +0800215 * \arg outvec_idx is equal to or greater than
216 * \ref PSA_MAX_IOVEC.
217 * \arg The memory reference for buffer is invalid.
218 * \arg The call attempts to write data past the end
219 * of the client output vector.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200220 */
221void psa_write(psa_handle_t msg_handle, uint32_t outvec_idx,
Edison Aib3e56962018-09-04 19:12:31 +0800222 const void *buffer, size_t num_bytes);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200223
224/**
Edison Aib3e56962018-09-04 19:12:31 +0800225 * \brief Complete handling of a specific message and unblock the client.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200226 *
Edison Aib3e56962018-09-04 19:12:31 +0800227 * \param[in] msg_handle Handle for the client's message.
228 * \param[in] status Message result value to be reported to the
229 * client.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200230 *
Edison Aib3e56962018-09-04 19:12:31 +0800231 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800232 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800233 * following are true:
234 * \arg msg_handle is invalid.
235 * \arg An invalid status code is specified for the
236 * type of message.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200237 */
Edison Aib3e56962018-09-04 19:12:31 +0800238void psa_reply(psa_handle_t msg_handle, psa_status_t status);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200239
240/**
Edison Aib3e56962018-09-04 19:12:31 +0800241 * \brief Send a PSA_DOORBELL signal to a specific Secure Partition.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200242 *
Edison Aib3e56962018-09-04 19:12:31 +0800243 * \param[in] partition_id Secure Partition ID of the target partition.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200244 *
Edison Aib3e56962018-09-04 19:12:31 +0800245 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800246 * \retval "PROGRAMMER ERROR" partition_id does not correspond to a Secure
Edison Aib3e56962018-09-04 19:12:31 +0800247 * Partition.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200248 */
249void psa_notify(int32_t partition_id);
250
251/**
Edison Aib3e56962018-09-04 19:12:31 +0800252 * \brief Clear the PSA_DOORBELL signal.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200253 *
Edison Aib3e56962018-09-04 19:12:31 +0800254 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800255 * \retval "PROGRAMMER ERROR" The Secure Partition's doorbell signal is not
Edison Aib3e56962018-09-04 19:12:31 +0800256 * currently asserted.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200257 */
258void psa_clear(void);
259
260/**
Edison Aib3e56962018-09-04 19:12:31 +0800261 * \brief Inform the SPM that an interrupt has been handled (end of interrupt).
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200262 *
Edison Aib3e56962018-09-04 19:12:31 +0800263 * \param[in] irq_signal The interrupt signal that has been processed.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200264 *
Edison Aib3e56962018-09-04 19:12:31 +0800265 * \retval void Success.
Summer Qin4b1d03b2019-07-02 14:56:08 +0800266 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
Edison Aib3e56962018-09-04 19:12:31 +0800267 * following are true:
268 * \arg irq_signal is not an interrupt signal.
269 * \arg irq_signal indicates more than one signal.
270 * \arg irq_signal is not currently asserted.
Kevin Peng9280ae92021-01-13 14:42:10 +0800271 * \arg The interrupt is not using SLIH.
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200272 */
Edison Aib3e56962018-09-04 19:12:31 +0800273void psa_eoi(psa_signal_t irq_signal);
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200274
Summer Qin4b1d03b2019-07-02 14:56:08 +0800275/**
276 * \brief Terminate execution within the calling Secure Partition and will not
277 * return.
278 *
279 * \retval "Does not return"
280 */
281void psa_panic(void);
282
Kevin Pengf9a0eb02021-01-05 15:06:05 +0800283/**
284 * \brief Enable an interrupt.
285 *
286 * \param[in] irq_signal The signal for the interrupt to be enabled.
287 * This must have a single bit set, which must be the
288 * signal value for an interrupt in the calling Secure
289 * Partition.
290 *
291 * \retval void
292 * \retval "PROGRAMMER ERROR" If one or more of the following are true:
Kevin Peng9280ae92021-01-13 14:42:10 +0800293 * \arg \a irq_signal is not an interrupt signal.
294 * \arg \a irq_signal indicates more than one signal.
Kevin Pengf9a0eb02021-01-05 15:06:05 +0800295 */
296void psa_irq_enable(psa_signal_t irq_signal);
297
298/**
299 * \brief Disable an interrupt and return the status of the interrupt prior to
300 * being disabled by this call.
301 *
302 * \param[in] irq_signal The signal for the interrupt to be disabled.
303 * This must have a single bit set, which must be the
304 * signal value for an interrupt in the calling Secure
305 * Partition.
306 *
307 * \retval 0 The interrupt was disabled prior to this call.
308 * 1 The interrupt was enabled prior to this call.
309 * \retval "PROGRAMMER ERROR" If one or more of the following are true:
Kevin Peng9280ae92021-01-13 14:42:10 +0800310 * \arg \a irq_signal is not an interrupt signal.
311 * \arg \a irq_signal indicates more than one signal.
Kevin Pengf9a0eb02021-01-05 15:06:05 +0800312 *
313 * \note The current implementation always return 1. Do not use the return.
314 */
315psa_irq_status_t psa_irq_disable(psa_signal_t irq_signal);
316
Kevin Peng9280ae92021-01-13 14:42:10 +0800317/**
318 * \brief Reset the signal for an interrupt that is using FLIH handling.
319 *
320 * \param[in] irq_signal The interrupt signal to be reset.
321 * This must have a single bit set, corresponding to a
322 * currently asserted signal for an interrupt that is
323 * defined to use FLIH handling.
324 *
325 * \retval void
326 * \retval "Programmer Error" if one or more of the following are true:
327 * \arg \a irq_signal is not a signal for an interrupt
328 * that is specified with FLIH handling in the Secure
329 * Partition manifest.
330 * \arg \a irq_signal indicates more than one signal.
331 * \arg \a irq_signal is not currently asserted.
332 */
333void psa_reset_signal(psa_signal_t irq_signal);
334
Shawn Shan038348e2021-09-08 17:11:04 +0800335#if PSA_FRAMEWORK_HAS_MM_IOVEC
336
337/**
338 * \brief Map a client input vector for direct access by a Secure Partition RoT
339 * Service.
340 *
341 * \param[in] msg_handle Handle for the client's message.
342 * \param[in] invec_idx Index of input vector to map. Must be
343 * less than \ref PSA_MAX_IOVEC.
344 *
345 * \retval A pointer to the input vector data.
346 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
347 * following are true:
348 * \arg MM-IOVEC has not been enabled for the RoT
349 * Service that received the message.
350 * \arg msg_handle is invalid.
351 * \arg msg_handle does not refer to a request
352 * message.
353 * \arg invec_idx is equal to or greater than
354 * \ref PSA_MAX_IOVEC.
355 * \arg The input vector has length zero.
356 * \arg The input vector has already been mapped using
357 * psa_map_invec().
358 * \arg The input vector has already been accessed
359 * using psa_read() or psa_skip().
360 */
361const void *psa_map_invec(psa_handle_t msg_handle, uint32_t invec_idx);
362
363/**
364 * \brief Unmap a previously mapped client input vector from a Secure Partition
365 * RoT Service.
366 *
367 * \param[in] msg_handle Handle for the client's message.
368 * \param[in] invec_idx Index of input vector to map. Must be
369 * less than \ref PSA_MAX_IOVEC.
370 *
371 * \retval void
372 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
373 * following are true:
374 * \arg msg_handle is invalid.
375 * \arg msg_handle does not refer to a request
376 * message.
377 * \arg invec_idx is equal to or greater than
378 * \ref PSA_MAX_IOVEC.
379 * \arg The input vector has not been mapped by a call
380 * to psa_map_invec().
381 * \arg The input vector has already been unmapped by
382 * a call to psa_unmap_invec().
383 */
384void psa_unmap_invec(psa_handle_t msg_handle, uint32_t invec_idx);
385
386/**
387 * \brief Map a client output vector for direct access by a Secure Partition RoT
388 * Service.
389 *
390 * \param[in] msg_handle Handle for the client's message.
391 * \param[in] outvec_idx Index of output vector to map. Must be
392 * less than \ref PSA_MAX_IOVEC.
393 *
394 * \retval A pointer to the output vector data.
395 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
396 * following are true:
397 * \arg MM-IOVEC has not been enabled for the RoT
398 * Service that received the message.
399 * \arg msg_handle is invalid.
400 * \arg msg_handle does not refer to a request
401 * message.
402 * \arg outvec_idx is equal to or greater than
403 * \ref PSA_MAX_IOVEC.
404 * \arg The output vector has length zero.
405 * \arg The output vector has already been mapped
406 * using psa_map_outvec().
407 * \arg The output vector has already been accessed
408 * using psa_write().
409 */
410void *psa_map_outvec(psa_handle_t msg_handle, uint32_t outvec_idx);
411
412/**
413 * \brief Unmap a previously mapped client output vector from a Secure Partition
414 * RoT Service.
415 *
416 * \param[in] msg_handle Handle for the client's message.
417 * \param[in] outvec_idx Index of output vector to map. Must be
418 * less than \ref PSA_MAX_IOVEC.
419 * \param[in] len The number of bytes written to the output
420 * vector. This must be less than or equal to the
421 * size of the output vector.
422 *
423 * \retval void
424 * \retval "PROGRAMMER ERROR" The call is invalid, one or more of the
425 * following are true:
426 * \arg msg_handle is invalid.
427 * \arg msg_handle does not refer to a request
428 * message.
429 * \arg outvec_idx is equal to or greater than
430 * \ref PSA_MAX_IOVEC.
431 * \arg The output vector has not been mapped by a
432 * call to psa_map_outvec().
433 * \arg The output vector has already been unmapped by
434 * a call to psa_unmap_outvec().
435 */
436void psa_unmap_outvec(psa_handle_t msg_handle, uint32_t outvec_idx, size_t len);
437
438#endif /* PSA_FRAMEWORK_HAS_MM_IOVEC */
439
Miklos Balint9ecb24c2018-03-29 15:30:28 +0200440#ifdef __cplusplus
441}
442#endif
443
444#endif /* __PSA_SERVICE_H__ */