mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * SPDX-License-Identifier: BSD-3-Clause
kenjiArai 0:5b88d5760320 5 *
kenjiArai 0:5b88d5760320 6 */
kenjiArai 0:5b88d5760320 7
kenjiArai 0:5b88d5760320 8 #ifndef __TFM_SECURE_API_H__
kenjiArai 0:5b88d5760320 9 #define __TFM_SECURE_API_H__
kenjiArai 0:5b88d5760320 10
kenjiArai 0:5b88d5760320 11 #include <arm_cmse.h>
kenjiArai 0:5b88d5760320 12 #include "tfm_svc.h"
kenjiArai 0:5b88d5760320 13 #include "secure_utilities.h"
kenjiArai 0:5b88d5760320 14 #include "tfm_core.h"
kenjiArai 0:5b88d5760320 15 #include "tfm_api.h"
kenjiArai 0:5b88d5760320 16 #include "bl2/include/tfm_boot_status.h"
kenjiArai 0:5b88d5760320 17
kenjiArai 0:5b88d5760320 18 /*!
kenjiArai 0:5b88d5760320 19 * \def __tfm_secure_gateway_attributes__
kenjiArai 0:5b88d5760320 20 *
kenjiArai 0:5b88d5760320 21 * \brief Attributes for secure gateway functions
kenjiArai 0:5b88d5760320 22 */
kenjiArai 0:5b88d5760320 23 #define __tfm_secure_gateway_attributes__ \
kenjiArai 0:5b88d5760320 24 __attribute__((cmse_nonsecure_entry, noinline, section("SFN")))
kenjiArai 0:5b88d5760320 25
kenjiArai 0:5b88d5760320 26 /* Hide specific errors if not debugging */
kenjiArai 0:5b88d5760320 27 #ifdef TFM_CORE_DEBUG
kenjiArai 0:5b88d5760320 28 #define TFM_ERROR_STATUS(status) (status)
kenjiArai 0:5b88d5760320 29 #else
kenjiArai 0:5b88d5760320 30 #define TFM_ERROR_STATUS(status) (TFM_PARTITION_BUSY)
kenjiArai 0:5b88d5760320 31 #endif
kenjiArai 0:5b88d5760320 32
kenjiArai 0:5b88d5760320 33 #define TFM_SFN_API_LEGACY 0
kenjiArai 0:5b88d5760320 34 #define TFM_SFN_API_IOVEC 1
kenjiArai 0:5b88d5760320 35
kenjiArai 0:5b88d5760320 36 #ifndef TFM_LVL
kenjiArai 0:5b88d5760320 37 #error TFM_LVL is not defined!
kenjiArai 0:5b88d5760320 38 #endif
kenjiArai 0:5b88d5760320 39
kenjiArai 0:5b88d5760320 40 extern void tfm_secure_api_error_handler(void);
kenjiArai 0:5b88d5760320 41
kenjiArai 0:5b88d5760320 42 typedef int32_t(*sfn_t)(int32_t, int32_t, int32_t, int32_t);
kenjiArai 0:5b88d5760320 43
kenjiArai 0:5b88d5760320 44 struct tfm_sfn_req_s {
kenjiArai 0:5b88d5760320 45 uint32_t sp_id;
kenjiArai 0:5b88d5760320 46 sfn_t sfn;
kenjiArai 0:5b88d5760320 47 int32_t *args;
kenjiArai 0:5b88d5760320 48 uint32_t caller_part_idx;
kenjiArai 0:5b88d5760320 49 int32_t iovec_api;
kenjiArai 0:5b88d5760320 50 uint32_t ns_caller;
kenjiArai 0:5b88d5760320 51 };
kenjiArai 0:5b88d5760320 52
kenjiArai 0:5b88d5760320 53 enum tfm_buffer_share_region_e {
kenjiArai 0:5b88d5760320 54 TFM_BUFFER_SHARE_DISABLE,
kenjiArai 0:5b88d5760320 55 TFM_BUFFER_SHARE_NS_CODE,
kenjiArai 0:5b88d5760320 56 TFM_BUFFER_SHARE_SCRATCH,
kenjiArai 0:5b88d5760320 57 TFM_BUFFER_SHARE_PRIV, /* only for TCB in level 2, all in level 1 */
kenjiArai 0:5b88d5760320 58 TFM_BUFFER_SHARE_DEFAULT,
kenjiArai 0:5b88d5760320 59 };
kenjiArai 0:5b88d5760320 60
kenjiArai 0:5b88d5760320 61 enum tfm_ns_region_e {
kenjiArai 0:5b88d5760320 62 TFM_NS_REGION_CODE = 0,
kenjiArai 0:5b88d5760320 63 TFM_NS_REGION_DATA,
kenjiArai 0:5b88d5760320 64 TFM_NS_REGION_VENEER,
kenjiArai 0:5b88d5760320 65 TFM_NS_REGION_PERIPH_1,
kenjiArai 0:5b88d5760320 66 TFM_NS_REGION_PERIPH_2,
kenjiArai 0:5b88d5760320 67 TFM_NS_SECONDARY_IMAGE_REGION,
kenjiArai 0:5b88d5760320 68 };
kenjiArai 0:5b88d5760320 69
kenjiArai 0:5b88d5760320 70 enum tfm_memory_access_e {
kenjiArai 0:5b88d5760320 71 TFM_MEMORY_ACCESS_RO = 1,
kenjiArai 0:5b88d5760320 72 TFM_MEMORY_ACCESS_RW = 2,
kenjiArai 0:5b88d5760320 73 };
kenjiArai 0:5b88d5760320 74
kenjiArai 0:5b88d5760320 75 extern int32_t tfm_core_set_buffer_area(enum tfm_buffer_share_region_e share);
kenjiArai 0:5b88d5760320 76
kenjiArai 0:5b88d5760320 77 extern int32_t tfm_core_validate_secure_caller(void);
kenjiArai 0:5b88d5760320 78
kenjiArai 0:5b88d5760320 79 extern int32_t tfm_core_get_caller_client_id(int32_t *caller_client_id);
kenjiArai 0:5b88d5760320 80
kenjiArai 0:5b88d5760320 81 extern int32_t tfm_core_memory_permission_check(const void *ptr,
kenjiArai 0:5b88d5760320 82 uint32_t size,
kenjiArai 0:5b88d5760320 83 int32_t access);
kenjiArai 0:5b88d5760320 84
kenjiArai 0:5b88d5760320 85 extern int32_t tfm_core_get_boot_data(uint8_t major_type,
kenjiArai 0:5b88d5760320 86 struct tfm_boot_data *boot_data,
kenjiArai 0:5b88d5760320 87 uint32_t len);
kenjiArai 0:5b88d5760320 88
kenjiArai 0:5b88d5760320 89 int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr);
kenjiArai 0:5b88d5760320 90
kenjiArai 0:5b88d5760320 91 int32_t tfm_core_sfn_request_thread_mode(struct tfm_sfn_req_s *desc_ptr);
kenjiArai 0:5b88d5760320 92
kenjiArai 0:5b88d5760320 93 /**
kenjiArai 0:5b88d5760320 94 * \brief Check whether the current partition has read access to a memory range
kenjiArai 0:5b88d5760320 95 *
kenjiArai 0:5b88d5760320 96 * This function assumes, that the current MPU configuration is set for the
kenjiArai 0:5b88d5760320 97 * partition to be checked.
kenjiArai 0:5b88d5760320 98 *
kenjiArai 0:5b88d5760320 99 * \param[in] p The start address of the range to check
kenjiArai 0:5b88d5760320 100 * \param[in] s The size of the range to check
kenjiArai 0:5b88d5760320 101 * \param[in] ns_caller Whether the current partition is a non-secure one
kenjiArai 0:5b88d5760320 102 * \param[in] privileged Privileged mode or unprivileged mode:
kenjiArai 0:5b88d5760320 103 * \ref TFM_PARTITION_UNPRIVILEGED_MODE
kenjiArai 0:5b88d5760320 104 * \ref TFM_PARTITION_PRIVILEGED_MODE
kenjiArai 0:5b88d5760320 105 *
kenjiArai 0:5b88d5760320 106 * \return TFM_SUCCESS if the partition has access to the memory range,
kenjiArai 0:5b88d5760320 107 * TFM_ERROR_GENERIC otherwise.
kenjiArai 0:5b88d5760320 108 */
kenjiArai 0:5b88d5760320 109 int32_t tfm_core_has_read_access_to_region(const void *p, size_t s,
kenjiArai 0:5b88d5760320 110 uint32_t ns_caller,
kenjiArai 0:5b88d5760320 111 uint32_t privileged);
kenjiArai 0:5b88d5760320 112
kenjiArai 0:5b88d5760320 113 /**
kenjiArai 0:5b88d5760320 114 * \brief Check whether the current partition has write access to a memory range
kenjiArai 0:5b88d5760320 115 *
kenjiArai 0:5b88d5760320 116 * This function assumes, that the current MPU configuration is set for the
kenjiArai 0:5b88d5760320 117 * partition to be checked.
kenjiArai 0:5b88d5760320 118 *
kenjiArai 0:5b88d5760320 119 * \param[in] p The start address of the range to check
kenjiArai 0:5b88d5760320 120 * \param[in] s The size of the range to check
kenjiArai 0:5b88d5760320 121 * \param[in] ns_caller Whether the current partition is a non-secure one
kenjiArai 0:5b88d5760320 122 * \param[in] privileged Privileged mode or unprivileged mode:
kenjiArai 0:5b88d5760320 123 * \ref TFM_PARTITION_UNPRIVILEGED_MODE
kenjiArai 0:5b88d5760320 124 * \ref TFM_PARTITION_PRIVILEGED_MODE
kenjiArai 0:5b88d5760320 125 *
kenjiArai 0:5b88d5760320 126 * \return TFM_SUCCESS if the partition has access to the memory range,
kenjiArai 0:5b88d5760320 127 * TFM_ERROR_GENERIC otherwise.
kenjiArai 0:5b88d5760320 128 */
kenjiArai 0:5b88d5760320 129 int32_t tfm_core_has_write_access_to_region(void *p, size_t s,
kenjiArai 0:5b88d5760320 130 uint32_t ns_caller,
kenjiArai 0:5b88d5760320 131 uint32_t privileged);
kenjiArai 0:5b88d5760320 132
kenjiArai 0:5b88d5760320 133 #ifdef TFM_PSA_API
kenjiArai 0:5b88d5760320 134 /* The following macros are only valid if secure services can be called
kenjiArai 0:5b88d5760320 135 * using veneer functions. This is not the case if IPC messaging is enabled
kenjiArai 0:5b88d5760320 136 */
kenjiArai 0:5b88d5760320 137 #define TFM_CORE_IOVEC_SFN_REQUEST(id, fn, a, b, c, d) \
kenjiArai 0:5b88d5760320 138 do { \
kenjiArai 0:5b88d5760320 139 ERROR_MSG("Invalid TF-M configuration detected"); \
kenjiArai 0:5b88d5760320 140 tfm_secure_api_error_handler(); \
kenjiArai 0:5b88d5760320 141 /* This point never reached */ \
kenjiArai 0:5b88d5760320 142 return (int32_t)TFM_ERROR_GENERIC; \
kenjiArai 0:5b88d5760320 143 } while (0)
kenjiArai 0:5b88d5760320 144 #define TFM_CORE_SFN_REQUEST(id, fn, a, b, c, d) \
kenjiArai 0:5b88d5760320 145 do { \
kenjiArai 0:5b88d5760320 146 ERROR_MSG("Invalid TF-M configuration detected"); \
kenjiArai 0:5b88d5760320 147 tfm_secure_api_error_handler(); \
kenjiArai 0:5b88d5760320 148 /* This point never reached */ \
kenjiArai 0:5b88d5760320 149 return (int32_t)TFM_ERROR_GENERIC; \
kenjiArai 0:5b88d5760320 150 } while (0)
kenjiArai 0:5b88d5760320 151 #else
kenjiArai 0:5b88d5760320 152 #define TFM_CORE_IOVEC_SFN_REQUEST(id, fn, a, b, c, d) \
kenjiArai 0:5b88d5760320 153 return tfm_core_partition_request(id, fn, TFM_SFN_API_IOVEC, \
kenjiArai 0:5b88d5760320 154 (int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d)
kenjiArai 0:5b88d5760320 155
kenjiArai 0:5b88d5760320 156 #define TFM_CORE_SFN_REQUEST(id, fn, a, b, c, d) \
kenjiArai 0:5b88d5760320 157 return tfm_core_partition_request(id, fn, TFM_SFN_API_LEGACY, \
kenjiArai 0:5b88d5760320 158 (int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d)
kenjiArai 0:5b88d5760320 159
kenjiArai 0:5b88d5760320 160 __attribute__ ((always_inline)) __STATIC_INLINE
kenjiArai 0:5b88d5760320 161 int32_t tfm_core_partition_request(uint32_t id, void *fn, int32_t iovec_api,
kenjiArai 0:5b88d5760320 162 int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4)
kenjiArai 0:5b88d5760320 163 {
kenjiArai 0:5b88d5760320 164 int32_t args[4] = {arg1, arg2, arg3, arg4};
kenjiArai 0:5b88d5760320 165 struct tfm_sfn_req_s desc, *desc_ptr = &desc;
kenjiArai 0:5b88d5760320 166
kenjiArai 0:5b88d5760320 167 desc.sp_id = id;
kenjiArai 0:5b88d5760320 168 desc.sfn = (sfn_t) fn;
kenjiArai 0:5b88d5760320 169 desc.args = args;
kenjiArai 0:5b88d5760320 170 /*
kenjiArai 0:5b88d5760320 171 * This preprocessor condition checks if a version of GCC smaller than
kenjiArai 0:5b88d5760320 172 * 7.3.1 is being used to compile the code.
kenjiArai 0:5b88d5760320 173 * These versions are affected by a bug on the cmse_nonsecure_caller
kenjiArai 0:5b88d5760320 174 * intrinsic which returns incorrect results.
kenjiArai 0:5b88d5760320 175 * Please check Bug 85203 on GCC Bugzilla for more information.
kenjiArai 0:5b88d5760320 176 */
kenjiArai 0:5b88d5760320 177 #if defined(__GNUC__) && !defined(__ARMCC_VERSION) && \
kenjiArai 0:5b88d5760320 178 (__GNUC__ < 7 || \
kenjiArai 0:5b88d5760320 179 (__GNUC__ == 7 && (__GNUC_MINOR__ < 3 || \
kenjiArai 0:5b88d5760320 180 (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ < 1))))
kenjiArai 0:5b88d5760320 181 /*
kenjiArai 0:5b88d5760320 182 * Use the fact that, if called from Non-Secure, the LSB of the return
kenjiArai 0:5b88d5760320 183 * address is set to 0.
kenjiArai 0:5b88d5760320 184 */
kenjiArai 0:5b88d5760320 185 desc.ns_caller = (uint32_t)!(
kenjiArai 0:5b88d5760320 186 (intptr_t)__builtin_extract_return_addr(__builtin_return_address(0U))
kenjiArai 0:5b88d5760320 187 & 1);
kenjiArai 0:5b88d5760320 188 #else
kenjiArai 0:5b88d5760320 189 /*
kenjiArai 0:5b88d5760320 190 * Convert the result of cmse_nonsecure_caller from an int to a uint32_t
kenjiArai 0:5b88d5760320 191 * to prevent using an int in the tfm_sfn_req_s structure.
kenjiArai 0:5b88d5760320 192 */
kenjiArai 0:5b88d5760320 193 desc.ns_caller = (cmse_nonsecure_caller() != 0) ? 1U : 0U;
kenjiArai 0:5b88d5760320 194 #endif /* Check for GCC compiler version smaller than 7.3.1 */
kenjiArai 0:5b88d5760320 195 desc.iovec_api = iovec_api;
kenjiArai 0:5b88d5760320 196 if (__get_active_exc_num() != EXC_NUM_THREAD_MODE) {
kenjiArai 0:5b88d5760320 197 /* FixMe: Error severity TBD */
kenjiArai 0:5b88d5760320 198 return TFM_ERROR_GENERIC;
kenjiArai 0:5b88d5760320 199 } else {
kenjiArai 0:5b88d5760320 200 #if TFM_LVL == 1
kenjiArai 0:5b88d5760320 201 if (desc.ns_caller) {
kenjiArai 0:5b88d5760320 202 return tfm_core_sfn_request(desc_ptr);
kenjiArai 0:5b88d5760320 203 } else {
kenjiArai 0:5b88d5760320 204 return tfm_core_sfn_request_thread_mode(desc_ptr);
kenjiArai 0:5b88d5760320 205 }
kenjiArai 0:5b88d5760320 206 #else
kenjiArai 0:5b88d5760320 207 return tfm_core_sfn_request(desc_ptr);
kenjiArai 0:5b88d5760320 208 #endif
kenjiArai 0:5b88d5760320 209
kenjiArai 0:5b88d5760320 210 }
kenjiArai 0:5b88d5760320 211 }
kenjiArai 0:5b88d5760320 212 #endif
kenjiArai 0:5b88d5760320 213
kenjiArai 0:5b88d5760320 214 #endif /* __TFM_SECURE_API_H__ */