blob: 2d921825c21fc1beb1be7e2c0502a0ade7e77e2c [file] [log] [blame]
Edison Aif09acd42018-09-20 14:00:07 +08001/*
Xinyu Zhang99b069f2021-04-09 14:36:42 +08002 * Copyright (c) 2018-2021, Arm Limited. All rights reserved.
Edison Aif09acd42018-09-20 14:00:07 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <inttypes.h>
Ken Liu1f345b02020-05-30 21:11:05 +08009#include "tfm/tfm_core_svc.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000010#include "psa/client.h"
Summer Qin806af742019-10-18 14:44:43 +080011#include "tfm_api.h"
Xinyu Zhang99b069f2021-04-09 14:36:42 +080012#include "tfm_psa_call_param.h"
Edison Aif09acd42018-09-20 14:00:07 +080013
Summer Qin254ee972019-10-18 17:36:04 +080014__attribute__((naked))
Edison Aif09acd42018-09-20 14:00:07 +080015uint32_t psa_framework_version(void)
16{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010017 __ASM volatile("SVC %0 \n"
18 "BX LR \n"
19 : : "I" (TFM_SVC_PSA_FRAMEWORK_VERSION));
Edison Aif09acd42018-09-20 14:00:07 +080020}
21
Summer Qin254ee972019-10-18 17:36:04 +080022__attribute__((naked))
Edison Aif09acd42018-09-20 14:00:07 +080023uint32_t psa_version(uint32_t sid)
24{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010025 __ASM volatile("SVC %0 \n"
26 "BX LR \n"
27 : : "I" (TFM_SVC_PSA_VERSION));
Edison Aif09acd42018-09-20 14:00:07 +080028}
29
Summer Qin254ee972019-10-18 17:36:04 +080030__attribute__((naked))
Summer Qin4b1d03b2019-07-02 14:56:08 +080031psa_handle_t psa_connect(uint32_t sid, uint32_t version)
Edison Aif09acd42018-09-20 14:00:07 +080032{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010033 __ASM volatile("SVC %0 \n"
34 "BX LR \n"
35 : : "I" (TFM_SVC_PSA_CONNECT));
Edison Aif09acd42018-09-20 14:00:07 +080036}
37
Summer Qin254ee972019-10-18 17:36:04 +080038__attribute__((naked))
Summer Qin806af742019-10-18 14:44:43 +080039static psa_status_t psa_call_param_pack(psa_handle_t handle,
Xinyu Zhang99b069f2021-04-09 14:36:42 +080040 uint32_t ctrl_param,
41 const psa_invec *in_vec,
42 psa_outvec *out_vec)
Summer Qin806af742019-10-18 14:44:43 +080043{
44 __ASM volatile("SVC %0 \n"
45 "BX LR \n"
46 : : "I" (TFM_SVC_PSA_CALL));
47}
48
Edison Aif09acd42018-09-20 14:00:07 +080049psa_status_t psa_call(psa_handle_t handle,
Summer Qin4b1d03b2019-07-02 14:56:08 +080050 int32_t type,
Edison Aif09acd42018-09-20 14:00:07 +080051 const psa_invec *in_vec,
52 size_t in_len,
53 psa_outvec *out_vec,
54 size_t out_len)
55{
Xinyu Zhang99b069f2021-04-09 14:36:42 +080056 if ((type > INT16_MAX) ||
57 (type < INT16_MIN) ||
58 (in_len > PSA_MAX_IOVEC) ||
59 (out_len > PSA_MAX_IOVEC) ||
60 ((in_len + out_len) > PSA_MAX_IOVEC)) {
61 return PSA_ERROR_INVALID_ARGUMENT;
62 }
Summer Qin806af742019-10-18 14:44:43 +080063
Xinyu Zhang99b069f2021-04-09 14:36:42 +080064 return psa_call_param_pack(handle,
65 PARAM_PACK(type, in_len, out_len),
66 in_vec,
67 out_vec);
Edison Aif09acd42018-09-20 14:00:07 +080068}
69
Summer Qin254ee972019-10-18 17:36:04 +080070__attribute__((naked))
Edison Aif09acd42018-09-20 14:00:07 +080071void psa_close(psa_handle_t handle)
72{
Antonio de Angelisf2dea5b2019-04-16 14:50:50 +010073 __ASM volatile("SVC %0 \n"
74 "BX LR \n"
75 : : "I" (TFM_SVC_PSA_CLOSE));
Edison Aif09acd42018-09-20 14:00:07 +080076}