blob: 36d1be04c751a6c3e264bbee7006ef6fd3cf0b03 [file] [log] [blame]
Miklos Balint386b8b52017-11-29 13:12:32 +00001/*
Kevin Peng1de1e7a2022-06-07 17:38:01 +08002 * Copyright (c) 2017-2022, Arm Limited. All rights reserved.
Chris Brandde8a13e2022-05-25 09:45:26 -07003 * Copyright (c) 2022 Cypress Semiconductor Corporation (an Infineon company)
4 * or an affiliate of Cypress Semiconductor Corporation. All rights reserved.
Miklos Balint386b8b52017-11-29 13:12:32 +00005 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 *
8 */
9
10#ifndef __TFM_SECURE_API_H__
11#define __TFM_SECURE_API_H__
12
David Hud0d21952019-09-23 20:35:43 +080013#ifndef TFM_MULTI_CORE_TOPOLOGY
Hugues de Valon4bf875b2019-02-19 14:53:49 +000014#include <arm_cmse.h>
David Hud0d21952019-09-23 20:35:43 +080015#endif
David Hu50711e32019-06-12 18:32:30 +080016#include "tfm_arch.h"
Miklos Balintace4c3f2018-07-30 12:31:15 +020017#include "tfm_api.h"
Summer Qin5fdcf632020-06-22 16:49:24 +080018#include "utilities.h"
Mingyang Sun67a1c0e2020-06-04 17:18:16 +080019#include "tfm_boot_status.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000020#include "psa/service.h"
Kevin Pengfc7b7712021-05-08 13:42:56 +080021#ifdef TFM_PSA_API
22#include "svc_num.h"
23#else
24#include "tfm_core_svc.h"
25#endif /* TFM_PSA_API */
Miklos Balint386b8b52017-11-29 13:12:32 +000026
Miklos Balint386b8b52017-11-29 13:12:32 +000027/* Hide specific errors if not debugging */
28#ifdef TFM_CORE_DEBUG
29#define TFM_ERROR_STATUS(status) (status)
30#else
Mate Toth-Pal7de74b52018-02-23 15:46:47 +010031#define TFM_ERROR_STATUS(status) (TFM_PARTITION_BUSY)
Miklos Balint386b8b52017-11-29 13:12:32 +000032#endif
33
34#ifndef TFM_LVL
Miklos Balint386b8b52017-11-29 13:12:32 +000035#error TFM_LVL is not defined!
36#endif
Miklos Balint386b8b52017-11-29 13:12:32 +000037
Summer Qin5fdcf632020-06-22 16:49:24 +080038#ifndef TFM_PSA_API
Miklos Balint386b8b52017-11-29 13:12:32 +000039extern void tfm_secure_api_error_handler(void);
40
Miklos Balint6a139ae2018-04-04 19:44:37 +020041typedef int32_t(*sfn_t)(int32_t, int32_t, int32_t, int32_t);
42
Miklos Balint386b8b52017-11-29 13:12:32 +000043struct tfm_sfn_req_s {
Miklos Balint6a139ae2018-04-04 19:44:37 +020044 uint32_t sp_id;
45 sfn_t sfn;
46 int32_t *args;
Miklos Balint1fdb12f2018-09-11 11:30:30 +020047 uint32_t caller_part_idx;
Summer Qin43c185d2019-10-10 15:44:42 +080048 bool ns_caller;
Miklos Balint386b8b52017-11-29 13:12:32 +000049};
50
Antonio de Angelis5b64bb72021-04-27 08:37:14 +010051enum tfm_status_e tfm_core_get_caller_client_id(int32_t *caller_client_id);
Mate Toth-Pal21a74c92018-04-13 14:05:41 +020052
Hugues de Valon4bf875b2019-02-19 14:53:49 +000053int32_t tfm_core_sfn_request(const struct tfm_sfn_req_s *desc_ptr);
Miklos Balintace4c3f2018-07-30 12:31:15 +020054
Mingyang Sunabb1aab2020-02-18 13:49:08 +080055int32_t tfm_spm_sfn_request_thread_mode(struct tfm_sfn_req_s *desc_ptr);
Miklos Balintace4c3f2018-07-30 12:31:15 +020056
David Hu8d1f1072020-04-30 12:52:14 +080057#define TFM_CORE_IOVEC_SFN_REQUEST(id, is_ns, fn, a, b, c, d) \
58 return tfm_core_partition_request(id, is_ns, fn, \
Mate Toth-Palb8ce0dd2018-07-25 10:18:34 +020059 (int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d)
Miklos Balint386b8b52017-11-29 13:12:32 +000060
David Hu8d1f1072020-04-30 12:52:14 +080061int32_t tfm_core_partition_request(uint32_t id, bool is_ns, void *fn,
62 int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4);
Miklos Balint386b8b52017-11-29 13:12:32 +000063
David Hu8d1f1072020-04-30 12:52:14 +080064__attribute__ ((always_inline)) __STATIC_INLINE
65bool tfm_core_is_ns_client(void)
66{
Hugues de Valon4bf875b2019-02-19 14:53:49 +000067 /*
68 * This preprocessor condition checks if a version of GCC smaller than
69 * 7.3.1 is being used to compile the code.
70 * These versions are affected by a bug on the cmse_nonsecure_caller
71 * intrinsic which returns incorrect results.
72 * Please check Bug 85203 on GCC Bugzilla for more information.
73 */
74#if defined(__GNUC__) && !defined(__ARMCC_VERSION) && \
75 (__GNUC__ < 7 || \
76 (__GNUC__ == 7 && (__GNUC_MINOR__ < 3 || \
77 (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ < 1))))
78 /*
79 * Use the fact that, if called from Non-Secure, the LSB of the return
80 * address is set to 0.
81 */
David Hu8d1f1072020-04-30 12:52:14 +080082 return !(
83 (uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0U))
84 & 0x1);
Hugues de Valon4bf875b2019-02-19 14:53:49 +000085#else
86 /*
Summer Qin43c185d2019-10-10 15:44:42 +080087 * Convert the result of cmse_nonsecure_caller from an int to a bool
Hugues de Valon4bf875b2019-02-19 14:53:49 +000088 * to prevent using an int in the tfm_sfn_req_s structure.
89 */
David Hu8d1f1072020-04-30 12:52:14 +080090 return (cmse_nonsecure_caller() != 0) ? true : false;
Hugues de Valon4bf875b2019-02-19 14:53:49 +000091#endif /* Check for GCC compiler version smaller than 7.3.1 */
Miklos Balint386b8b52017-11-29 13:12:32 +000092}
Miklos Balintdd02bb32019-05-26 21:13:12 +020093#endif
Miklos Balint386b8b52017-11-29 13:12:32 +000094
95#endif /* __TFM_SECURE_API_H__ */