1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright (c) 2014, STMicroelectronics International N.V. 4 */ 5 #ifndef TEE_SVC_H 6 #define TEE_SVC_H 7 8 #include <assert.h> 9 #include <stdint.h> 10 #include <types_ext.h> 11 #include <tee_api_types.h> 12 #include <utee_types.h> 13 14 extern vaddr_t tee_svc_uref_base; 15 16 struct tee_ta_session; 17 18 /* TA Properties */ 19 struct tee_props { 20 const char *name; 21 22 /* prop_type is of type enum user_ta_prop_type*/ 23 const uint32_t prop_type; 24 25 /* either get_prop_func or both data and len */ 26 TEE_Result (*get_prop_func)(struct tee_ta_session *sess, 27 void *buf, size_t *blen); 28 const void *data; 29 const size_t len; 30 }; 31 32 struct tee_vendor_props { 33 const struct tee_props *props; 34 size_t len; 35 }; 36 void syscall_sys_return(unsigned long ret); 37 38 void syscall_log(const void *buf, size_t len); 39 40 void syscall_panic(unsigned long code); 41 42 TEE_Result syscall_not_supported(void); 43 44 /* prop_set defined by enum utee_property */ 45 TEE_Result syscall_get_property(unsigned long prop_set, 46 unsigned long index, 47 void *name, uint32_t *name_len, 48 void *buf, uint32_t *blen, 49 uint32_t *prop_type); 50 TEE_Result syscall_get_property_name_to_index(unsigned long prop_set, 51 void *name, 52 unsigned long name_len, 53 uint32_t *index); 54 55 TEE_Result syscall_open_ta_session(const TEE_UUID *dest, 56 unsigned long cancel_req_to, struct utee_params *params, 57 uint32_t *sess, uint32_t *ret_orig); 58 59 TEE_Result syscall_close_ta_session(unsigned long sess); 60 61 TEE_Result syscall_invoke_ta_command(unsigned long sess, 62 unsigned long cancel_req_to, unsigned long cmd_id, 63 struct utee_params *params, uint32_t *ret_orig); 64 65 TEE_Result syscall_check_access_rights(unsigned long flags, const void *buf, 66 size_t len); 67 68 #ifdef CFG_WITH_USER_TA 69 TEE_Result tee_svc_copy_from_user(void *kaddr, const void *uaddr, size_t len); 70 #else 71 static inline TEE_Result tee_svc_copy_from_user(void *kaddr __unused, 72 const void *uaddr __unused, 73 size_t len __unused) 74 { 75 return TEE_ERROR_NOT_SUPPORTED; 76 } 77 #endif 78 79 TEE_Result tee_svc_copy_to_user(void *uaddr, const void *kaddr, size_t len); 80 81 TEE_Result tee_svc_copy_kaddr_to_uref(uint32_t *uref, void *kaddr); 82 83 static inline uint32_t tee_svc_kaddr_to_uref(void *kaddr) 84 { 85 assert(((vaddr_t)kaddr - tee_svc_uref_base) < UINT32_MAX); 86 return (vaddr_t)kaddr - tee_svc_uref_base; 87 } 88 89 static inline vaddr_t tee_svc_uref_to_vaddr(uint32_t uref) 90 { 91 return tee_svc_uref_base + uref; 92 } 93 94 static inline void *tee_svc_uref_to_kaddr(uint32_t uref) 95 { 96 return (void *)tee_svc_uref_to_vaddr(uref); 97 } 98 99 TEE_Result syscall_get_cancellation_flag(uint32_t *cancel); 100 101 TEE_Result syscall_unmask_cancellation(uint32_t *old_mask); 102 103 TEE_Result syscall_mask_cancellation(uint32_t *old_mask); 104 105 TEE_Result syscall_wait(unsigned long timeout); 106 107 TEE_Result syscall_get_time(unsigned long cat, TEE_Time *time); 108 TEE_Result syscall_set_ta_time(const TEE_Time *time); 109 110 #endif /* TEE_SVC_H */ 111