blob: 8ed7a799b4d57bc8f7ad0ce1b631a70d1ac73069 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Jamie Foxd4c3c742020-02-17 16:08:40 +00002 * 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
8#ifndef __TFM_SECURE_API_H__
9#define __TFM_SECURE_API_H__
10
David Hud0d21952019-09-23 20:35:43 +080011#ifndef TFM_MULTI_CORE_TOPOLOGY
Hugues de Valon4bf875b2019-02-19 14:53:49 +000012#include <arm_cmse.h>
David Hud0d21952019-09-23 20:35:43 +080013#endif
David Hu50711e32019-06-12 18:32:30 +080014#include "tfm_arch.h"
Ken Liu1f345b02020-05-30 21:11:05 +080015#include "tfm/tfm_core_svc.h"
Miklos Balintace4c3f2018-07-30 12:31:15 +020016#include "tfm_api.h"
Summer Qin5fdcf632020-06-22 16:49:24 +080017#include "utilities.h"
Mingyang Sun67a1c0e2020-06-04 17:18:16 +080018#include "tfm_boot_status.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000019#include "psa/service.h"
Miklos Balint386b8b52017-11-29 13:12:32 +000020
David Hud0d21952019-09-23 20:35:43 +080021#ifndef TFM_MULTI_CORE_TOPOLOGY
Summer Qin5fdcf632020-06-22 16:49:24 +080022#ifndef TFM_PSA_API
Antonio de Angeliseba14e12018-03-27 11:03:20 +010023/*!
24 * \def __tfm_secure_gateway_attributes__
25 *
26 * \brief Attributes for secure gateway functions
27 */
David Hu94d424a2020-04-29 15:49:24 +080028#if defined(__GNUC__) && !defined(__ARMCC_VERSION)
29/*
30 * GNUARM requires noclone attribute to protect gateway function symbol from
31 * being renamed and cloned
32 */
Antonio de Angeliseba14e12018-03-27 11:03:20 +010033#define __tfm_secure_gateway_attributes__ \
David Hu94d424a2020-04-29 15:49:24 +080034 __attribute__((cmse_nonsecure_entry, noclone, section("SFN")))
35#else
36#define __tfm_secure_gateway_attributes__ \
37 __attribute__((cmse_nonsecure_entry, section("SFN")))
38#endif /* __GNUC__ && !__ARMCC_VERSION */
Summer Qin5fdcf632020-06-22 16:49:24 +080039#endif /* !TFM_PSA_API */
Summer Qin483da642019-09-25 17:57:41 +080040
Summer Qin5fdcf632020-06-22 16:49:24 +080041#ifdef TFM_PSA_API
Summer Qin483da642019-09-25 17:57:41 +080042/*!
43 * \def __tfm_psa_secure_gateway_attributes__
44 *
45 * \brief Attributes for psa api secure gateway functions
46 */
David Hu94d424a2020-04-29 15:49:24 +080047#if defined(__GNUC__) && !defined(__ARMCC_VERSION)
48/*
49 * GNUARM requires noclone attribute to protect gateway function symbol from
50 * being renamed and cloned
51 */
Summer Qin483da642019-09-25 17:57:41 +080052#define __tfm_psa_secure_gateway_attributes__ \
David Hu94d424a2020-04-29 15:49:24 +080053 __attribute__((cmse_nonsecure_entry, noclone, naked, section("SFN")))
54#else
55#define __tfm_psa_secure_gateway_attributes__ \
56 __attribute__((cmse_nonsecure_entry, naked, section("SFN")))
57#endif /* __GNUC__ && !__ARMCC_VERSION */
Summer Qin5fdcf632020-06-22 16:49:24 +080058#endif /* TFM_PSA_API */
David Hu94d424a2020-04-29 15:49:24 +080059#endif /* TFM_MULTI_CORE_TOPOLOGY */
Antonio de Angeliseba14e12018-03-27 11:03:20 +010060
Miklos Balint386b8b52017-11-29 13:12:32 +000061/* Hide specific errors if not debugging */
62#ifdef TFM_CORE_DEBUG
63#define TFM_ERROR_STATUS(status) (status)
64#else
Mate Toth-Pal7de74b52018-02-23 15:46:47 +010065#define TFM_ERROR_STATUS(status) (TFM_PARTITION_BUSY)
Miklos Balint386b8b52017-11-29 13:12:32 +000066#endif
67
68#ifndef TFM_LVL
Miklos Balint386b8b52017-11-29 13:12:32 +000069#error TFM_LVL is not defined!
70#endif
Miklos Balint386b8b52017-11-29 13:12:32 +000071
Summer Qin5fdcf632020-06-22 16:49:24 +080072#ifndef TFM_PSA_API
Miklos Balint386b8b52017-11-29 13:12:32 +000073extern void tfm_secure_api_error_handler(void);
74
Miklos Balint6a139ae2018-04-04 19:44:37 +020075typedef int32_t(*sfn_t)(int32_t, int32_t, int32_t, int32_t);
76
Miklos Balint386b8b52017-11-29 13:12:32 +000077struct tfm_sfn_req_s {
Miklos Balint6a139ae2018-04-04 19:44:37 +020078 uint32_t sp_id;
79 sfn_t sfn;
80 int32_t *args;
Miklos Balint1fdb12f2018-09-11 11:30:30 +020081 uint32_t caller_part_idx;
Summer Qin43c185d2019-10-10 15:44:42 +080082 bool ns_caller;
Miklos Balint386b8b52017-11-29 13:12:32 +000083};
84
Mate Toth-Pal21a74c92018-04-13 14:05:41 +020085extern int32_t tfm_core_get_caller_client_id(int32_t *caller_client_id);
86
Hugues de Valon4bf875b2019-02-19 14:53:49 +000087int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr);
Miklos Balintace4c3f2018-07-30 12:31:15 +020088
Mingyang Sunabb1aab2020-02-18 13:49:08 +080089int32_t tfm_spm_sfn_request_thread_mode(struct tfm_sfn_req_s *desc_ptr);
Miklos Balintace4c3f2018-07-30 12:31:15 +020090
David Hu8d1f1072020-04-30 12:52:14 +080091#define TFM_CORE_IOVEC_SFN_REQUEST(id, is_ns, fn, a, b, c, d) \
92 return tfm_core_partition_request(id, is_ns, fn, \
Mate Toth-Palb8ce0dd2018-07-25 10:18:34 +020093 (int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d)
Miklos Balint386b8b52017-11-29 13:12:32 +000094
David Hu8d1f1072020-04-30 12:52:14 +080095int32_t tfm_core_partition_request(uint32_t id, bool is_ns, void *fn,
96 int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4);
Miklos Balint386b8b52017-11-29 13:12:32 +000097
David Hu8d1f1072020-04-30 12:52:14 +080098__attribute__ ((always_inline)) __STATIC_INLINE
99bool tfm_core_is_ns_client(void)
100{
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000101 /*
102 * This preprocessor condition checks if a version of GCC smaller than
103 * 7.3.1 is being used to compile the code.
104 * These versions are affected by a bug on the cmse_nonsecure_caller
105 * intrinsic which returns incorrect results.
106 * Please check Bug 85203 on GCC Bugzilla for more information.
107 */
108#if defined(__GNUC__) && !defined(__ARMCC_VERSION) && \
109 (__GNUC__ < 7 || \
110 (__GNUC__ == 7 && (__GNUC_MINOR__ < 3 || \
111 (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ < 1))))
112 /*
113 * Use the fact that, if called from Non-Secure, the LSB of the return
114 * address is set to 0.
115 */
David Hu8d1f1072020-04-30 12:52:14 +0800116 return !(
117 (uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0U))
118 & 0x1);
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000119#else
120 /*
Summer Qin43c185d2019-10-10 15:44:42 +0800121 * Convert the result of cmse_nonsecure_caller from an int to a bool
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000122 * to prevent using an int in the tfm_sfn_req_s structure.
123 */
David Hu8d1f1072020-04-30 12:52:14 +0800124 return (cmse_nonsecure_caller() != 0) ? true : false;
Hugues de Valon4bf875b2019-02-19 14:53:49 +0000125#endif /* Check for GCC compiler version smaller than 7.3.1 */
Miklos Balint386b8b52017-11-29 13:12:32 +0000126}
Miklos Balintdd02bb32019-05-26 21:13:12 +0200127#endif
Miklos Balint386b8b52017-11-29 13:12:32 +0000128
129#endif /* __TFM_SECURE_API_H__ */