xref: /optee_os/core/include/tee/tee_svc.h (revision b8bb0afa738e6038bbd92b57742aa2526df9f20a)
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