xref: /optee_os/core/arch/arm/tee/entry_fast.c (revision 003383344c26be3589383acc87c1ebb2860e9317)
11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
25c781c55SJens Wiklander /*
3a94111b9SJens Wiklander  * Copyright (c) 2015-2021, Linaro Limited
45c781c55SJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
55c781c55SJens Wiklander  */
65c781c55SJens Wiklander 
7a94111b9SJens Wiklander #include <config.h>
87d3ac186SLionel Debieve #include <drivers/wdt.h>
965401337SJens Wiklander #include <kernel/boot.h>
10c2d44948SJens Wiklander #include <kernel/notif.h>
115c781c55SJens Wiklander #include <kernel/tee_l2cc_mutex.h>
1234c1c806SVolodymyr Babchuk #include <kernel/virtualization.h>
135c781c55SJens Wiklander #include <mm/core_mmu.h>
14a94111b9SJens Wiklander #include <optee_msg.h>
15a94111b9SJens Wiklander #include <sm/optee_smc.h>
16a94111b9SJens Wiklander #include <tee/entry_fast.h>
175c781c55SJens Wiklander 
188aeb6c94SJens Wiklander #ifdef CFG_CORE_RESERVED_SHM
tee_entry_get_shm_config(struct thread_smc_args * args)195c781c55SJens Wiklander static void tee_entry_get_shm_config(struct thread_smc_args *args)
205c781c55SJens Wiklander {
21e43888b8SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_OK;
225c781c55SJens Wiklander 	args->a1 = default_nsec_shm_paddr;
235c781c55SJens Wiklander 	args->a2 = default_nsec_shm_size;
245c781c55SJens Wiklander 	/* Should this be TEESMC cache attributes instead? */
255c781c55SJens Wiklander 	args->a3 = core_mmu_is_shm_cached();
265c781c55SJens Wiklander }
278aeb6c94SJens Wiklander #endif
285c781c55SJens Wiklander 
29*00338334SJens Wiklander #if defined(CFG_SECURE_DATA_PATH) && !defined(CFG_CORE_DYN_PROTMEM)
tee_entry_get_protmem_config(struct thread_smc_args * args)3089f492f5SJens Wiklander static void tee_entry_get_protmem_config(struct thread_smc_args *args)
3189f492f5SJens Wiklander {
3289f492f5SJens Wiklander #if defined(CFG_TEE_SDP_MEM_BASE)
3389f492f5SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_OK;
3489f492f5SJens Wiklander 	args->a1 = CFG_TEE_SDP_MEM_BASE;
3589f492f5SJens Wiklander 	args->a2 = CFG_TEE_SDP_MEM_SIZE;
3689f492f5SJens Wiklander #elif defined(TEE_SDP_TEST_MEM_BASE)
3789f492f5SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_OK;
3889f492f5SJens Wiklander 	args->a1 = TEE_SDP_TEST_MEM_BASE;
3989f492f5SJens Wiklander 	args->a2 = TEE_SDP_TEST_MEM_SIZE;
4089f492f5SJens Wiklander #else
4189f492f5SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
4289f492f5SJens Wiklander 	args->a1 = 0;
4389f492f5SJens Wiklander 	args->a2 = 0;
4489f492f5SJens Wiklander #endif
4589f492f5SJens Wiklander 	args->a3 = sizeof(long) * 8;
4689f492f5SJens Wiklander }
4789f492f5SJens Wiklander #endif
4889f492f5SJens Wiklander 
tee_entry_fastcall_l2cc_mutex(struct thread_smc_args * args)495c781c55SJens Wiklander static void tee_entry_fastcall_l2cc_mutex(struct thread_smc_args *args)
505c781c55SJens Wiklander {
515c781c55SJens Wiklander #ifdef ARM32
52b51aaa62SClement Faure 	TEE_Result ret = TEE_ERROR_NOT_SUPPORTED;
53e43888b8SJens Wiklander 	paddr_t pa = 0;
54e43888b8SJens Wiklander 
555c781c55SJens Wiklander 	switch (args->a1) {
56e43888b8SJens Wiklander 	case OPTEE_SMC_L2CC_MUTEX_GET_ADDR:
57e43888b8SJens Wiklander 		ret = tee_get_l2cc_mutex(&pa);
58e43888b8SJens Wiklander 		reg_pair_from_64(pa, &args->a2, &args->a3);
595c781c55SJens Wiklander 		break;
60e43888b8SJens Wiklander 	case OPTEE_SMC_L2CC_MUTEX_SET_ADDR:
61e43888b8SJens Wiklander 		pa = reg_pair_to_64(args->a2, args->a3);
62e43888b8SJens Wiklander 		ret = tee_set_l2cc_mutex(&pa);
635c781c55SJens Wiklander 		break;
64e43888b8SJens Wiklander 	case OPTEE_SMC_L2CC_MUTEX_ENABLE:
655c781c55SJens Wiklander 		ret = tee_enable_l2cc_mutex();
665c781c55SJens Wiklander 		break;
67e43888b8SJens Wiklander 	case OPTEE_SMC_L2CC_MUTEX_DISABLE:
685c781c55SJens Wiklander 		ret = tee_disable_l2cc_mutex();
695c781c55SJens Wiklander 		break;
705c781c55SJens Wiklander 	default:
71e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_EBADCMD;
725c781c55SJens Wiklander 		return;
735c781c55SJens Wiklander 	}
74b51aaa62SClement Faure 
755c781c55SJens Wiklander 	if (ret == TEE_ERROR_NOT_SUPPORTED)
76e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
775c781c55SJens Wiklander 	else if (ret)
78e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_EBADADDR;
795c781c55SJens Wiklander 	else
80e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_OK;
81b51aaa62SClement Faure #else
82b51aaa62SClement Faure 	args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
83b51aaa62SClement Faure #endif
84e43888b8SJens Wiklander }
85e43888b8SJens Wiklander 
tee_entry_exchange_capabilities(struct thread_smc_args * args)86e43888b8SJens Wiklander static void tee_entry_exchange_capabilities(struct thread_smc_args *args)
87e43888b8SJens Wiklander {
88d8f7685aSJerome Forissier 	bool res_shm_en = IS_ENABLED(CFG_CORE_RESERVED_SHM);
89b8889ee9SJerome Forissier 	bool dyn_shm_en __maybe_unused = false;
9055d6853cSVolodymyr Babchuk 
91e43888b8SJens Wiklander 	/*
928d22aebbSJens Wiklander 	 * Currently we ignore OPTEE_SMC_NSEC_CAP_UNIPROCESSOR.
93e43888b8SJens Wiklander 	 *
94e43888b8SJens Wiklander 	 * The memory mapping of shared memory is defined as normal
95e43888b8SJens Wiklander 	 * shared memory for SMP systems and normal memory for UP
96e43888b8SJens Wiklander 	 * systems. Currently we map all memory as shared in secure
97e43888b8SJens Wiklander 	 * world.
988d22aebbSJens Wiklander 	 *
998d22aebbSJens Wiklander 	 * When translation tables are created with shared bit cleared for
1008d22aebbSJens Wiklander 	 * uniprocessor systems we'll need to check
1018d22aebbSJens Wiklander 	 * OPTEE_SMC_NSEC_CAP_UNIPROCESSOR.
102e43888b8SJens Wiklander 	 */
1038d22aebbSJens Wiklander 
1048d22aebbSJens Wiklander 	if (args->a1 & ~OPTEE_SMC_NSEC_CAP_UNIPROCESSOR) {
1058d22aebbSJens Wiklander 		/* Unknown capability. */
106e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
107e43888b8SJens Wiklander 		return;
108e43888b8SJens Wiklander 	}
109e43888b8SJens Wiklander 
110e43888b8SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_OK;
1118aeb6c94SJens Wiklander 	args->a1 = 0;
112d8f7685aSJerome Forissier 
113d8f7685aSJerome Forissier 	if (res_shm_en)
1148aeb6c94SJens Wiklander 		args->a1 |= OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM;
115d8f7685aSJerome Forissier 	IMSG("Reserved shared memory is %sabled", res_shm_en ? "en" : "dis");
11655d6853cSVolodymyr Babchuk 
1175c151b7eSJens Wiklander #if defined(CFG_CORE_DYN_SHM)
11855d6853cSVolodymyr Babchuk 	dyn_shm_en = core_mmu_nsec_ddr_is_defined();
11955d6853cSVolodymyr Babchuk 	if (dyn_shm_en)
12055d6853cSVolodymyr Babchuk 		args->a1 |= OPTEE_SMC_SEC_CAP_DYNAMIC_SHM;
121d81f93a7SVolodymyr Babchuk #endif
122d8f7685aSJerome Forissier 	IMSG("Dynamic shared memory is %sabled", dyn_shm_en ? "en" : "dis");
12355d6853cSVolodymyr Babchuk 
124b76b2296SJerome Forissier 	if (IS_ENABLED(CFG_NS_VIRTUALIZATION))
125d8f7685aSJerome Forissier 		args->a1 |= OPTEE_SMC_SEC_CAP_VIRTUALIZATION;
126d8f7685aSJerome Forissier 	IMSG("Normal World virtualization support is %sabled",
127b76b2296SJerome Forissier 	     IS_ENABLED(CFG_NS_VIRTUALIZATION) ? "en" : "dis");
128d8f7685aSJerome Forissier 
129d8f7685aSJerome Forissier 	args->a1 |= OPTEE_SMC_SEC_CAP_MEMREF_NULL;
130d8f7685aSJerome Forissier 
131d8f7685aSJerome Forissier 	if (IS_ENABLED(CFG_CORE_ASYNC_NOTIF)) {
132d8f7685aSJerome Forissier 		args->a1 |= OPTEE_SMC_SEC_CAP_ASYNC_NOTIF;
133d8f7685aSJerome Forissier 		args->a2 = NOTIF_VALUE_MAX;
134d8f7685aSJerome Forissier 	}
135d8f7685aSJerome Forissier 	IMSG("Asynchronous notifications are %sabled",
136d8f7685aSJerome Forissier 	     IS_ENABLED(CFG_CORE_ASYNC_NOTIF) ? "en" : "dis");
137feb290a5SJens Wiklander 
138*00338334SJens Wiklander 	if (IS_ENABLED(CFG_SECURE_DATA_PATH)) {
139*00338334SJens Wiklander 		if (IS_ENABLED(CFG_CORE_DYN_PROTMEM))
140*00338334SJens Wiklander 			args->a1 |= OPTEE_SMC_SEC_CAP_DYNAMIC_PROTMEM;
141*00338334SJens Wiklander 		else
14289f492f5SJens Wiklander 			args->a1 |= OPTEE_SMC_SEC_CAP_PROTMEM;
143*00338334SJens Wiklander 	}
14489f492f5SJens Wiklander 
145feb290a5SJens Wiklander 	args->a1 |= OPTEE_SMC_SEC_CAP_RPC_ARG;
146feb290a5SJens Wiklander 	args->a3 = THREAD_RPC_MAX_NUM_PARAMS;
1478dfdf392SJens Wiklander 
148b78dd3f2SJens Wiklander 	if (IS_ENABLED(CFG_RPMB_ANNOUNCE_PROBE_CAP))
1498dfdf392SJens Wiklander 		args->a1 |= OPTEE_SMC_SEC_CAP_RPMB_PROBE;
150e43888b8SJens Wiklander }
151e43888b8SJens Wiklander 
tee_entry_disable_shm_cache(struct thread_smc_args * args)152e43888b8SJens Wiklander static void tee_entry_disable_shm_cache(struct thread_smc_args *args)
153e43888b8SJens Wiklander {
154e43888b8SJens Wiklander 	uint64_t cookie;
155e43888b8SJens Wiklander 
156e43888b8SJens Wiklander 	if (!thread_disable_prealloc_rpc_cache(&cookie)) {
157e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_EBUSY;
158e43888b8SJens Wiklander 		return;
159e43888b8SJens Wiklander 	}
160e43888b8SJens Wiklander 
161e43888b8SJens Wiklander 	if (!cookie) {
162e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
163e43888b8SJens Wiklander 		return;
164e43888b8SJens Wiklander 	}
165e43888b8SJens Wiklander 
166e43888b8SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_OK;
167e43888b8SJens Wiklander 	args->a1 = cookie >> 32;
168e43888b8SJens Wiklander 	args->a2 = cookie;
169e43888b8SJens Wiklander }
170e43888b8SJens Wiklander 
tee_entry_enable_shm_cache(struct thread_smc_args * args)171e43888b8SJens Wiklander static void tee_entry_enable_shm_cache(struct thread_smc_args *args)
172e43888b8SJens Wiklander {
173e43888b8SJens Wiklander 	if (thread_enable_prealloc_rpc_cache())
174e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_OK;
175e43888b8SJens Wiklander 	else
176e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_EBUSY;
1775c781c55SJens Wiklander }
1785c781c55SJens Wiklander 
tee_entry_boot_secondary(struct thread_smc_args * args)179cee96842Syanyan-wrs static void tee_entry_boot_secondary(struct thread_smc_args *args)
180cee96842Syanyan-wrs {
181cee96842Syanyan-wrs #if defined(CFG_BOOT_SECONDARY_REQUEST)
18265401337SJens Wiklander 	if (!boot_core_release(args->a1, (paddr_t)(args->a3)))
183cee96842Syanyan-wrs 		args->a0 = OPTEE_SMC_RETURN_OK;
184cee96842Syanyan-wrs 	else
185cee96842Syanyan-wrs 		args->a0 = OPTEE_SMC_RETURN_EBADCMD;
186cee96842Syanyan-wrs #else
187cee96842Syanyan-wrs 	args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
188cee96842Syanyan-wrs #endif
189cee96842Syanyan-wrs }
190cee96842Syanyan-wrs 
tee_entry_get_thread_count(struct thread_smc_args * args)19127b5e34bSVolodymyr Babchuk static void tee_entry_get_thread_count(struct thread_smc_args *args)
19227b5e34bSVolodymyr Babchuk {
19327b5e34bSVolodymyr Babchuk 	args->a0 = OPTEE_SMC_RETURN_OK;
19427b5e34bSVolodymyr Babchuk 	args->a1 = CFG_NUM_THREADS;
19527b5e34bSVolodymyr Babchuk }
19627b5e34bSVolodymyr Babchuk 
197b76b2296SJerome Forissier #if defined(CFG_NS_VIRTUALIZATION)
tee_entry_vm_created(struct thread_smc_args * args)19834c1c806SVolodymyr Babchuk static void tee_entry_vm_created(struct thread_smc_args *args)
19934c1c806SVolodymyr Babchuk {
20034c1c806SVolodymyr Babchuk 	uint16_t guest_id = args->a1;
20134c1c806SVolodymyr Babchuk 
20234c1c806SVolodymyr Babchuk 	/* Only hypervisor can issue this request */
20334c1c806SVolodymyr Babchuk 	if (args->a7 != HYP_CLNT_ID) {
20434c1c806SVolodymyr Babchuk 		args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
20534c1c806SVolodymyr Babchuk 		return;
20634c1c806SVolodymyr Babchuk 	}
20734c1c806SVolodymyr Babchuk 
208bddb2f89SJens Wiklander 	if (virt_guest_created(guest_id))
209bddb2f89SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
210bddb2f89SJens Wiklander 	else
211bddb2f89SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_OK;
21234c1c806SVolodymyr Babchuk }
21334c1c806SVolodymyr Babchuk 
tee_entry_vm_destroyed(struct thread_smc_args * args)21434c1c806SVolodymyr Babchuk static void tee_entry_vm_destroyed(struct thread_smc_args *args)
21534c1c806SVolodymyr Babchuk {
21634c1c806SVolodymyr Babchuk 	uint16_t guest_id = args->a1;
21734c1c806SVolodymyr Babchuk 
21834c1c806SVolodymyr Babchuk 	/* Only hypervisor can issue this request */
21934c1c806SVolodymyr Babchuk 	if (args->a7 != HYP_CLNT_ID) {
22034c1c806SVolodymyr Babchuk 		args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
22134c1c806SVolodymyr Babchuk 		return;
22234c1c806SVolodymyr Babchuk 	}
22334c1c806SVolodymyr Babchuk 
224bddb2f89SJens Wiklander 	if (virt_guest_destroyed(guest_id))
225bddb2f89SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
226bddb2f89SJens Wiklander 	else
227bddb2f89SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_OK;
22834c1c806SVolodymyr Babchuk }
22934c1c806SVolodymyr Babchuk #endif
23034c1c806SVolodymyr Babchuk 
231612791d0SJens Wiklander /* Note: this function is weak to let platforms add special handling */
tee_entry_fast(struct thread_smc_args * args)232612791d0SJens Wiklander void __weak tee_entry_fast(struct thread_smc_args *args)
233612791d0SJens Wiklander {
234612791d0SJens Wiklander 	__tee_entry_fast(args);
235612791d0SJens Wiklander }
236612791d0SJens Wiklander 
get_async_notif_value(struct thread_smc_args * args)237c2d44948SJens Wiklander static void get_async_notif_value(struct thread_smc_args *args)
238c2d44948SJens Wiklander {
239c2d44948SJens Wiklander 	bool value_valid = false;
240c2d44948SJens Wiklander 	bool value_pending = false;
241c2d44948SJens Wiklander 
242c2d44948SJens Wiklander 	args->a0 = OPTEE_SMC_RETURN_OK;
243c2d44948SJens Wiklander 	args->a1 = notif_get_value(&value_valid, &value_pending);
244c2d44948SJens Wiklander 	args->a2 = 0;
245c2d44948SJens Wiklander 	if (value_valid)
246c2d44948SJens Wiklander 		args->a2 |= OPTEE_SMC_ASYNC_NOTIF_VALID;
247c2d44948SJens Wiklander 	if (value_pending)
248c2d44948SJens Wiklander 		args->a2 |= OPTEE_SMC_ASYNC_NOTIF_PENDING;
249c2d44948SJens Wiklander }
250c2d44948SJens Wiklander 
tee_entry_watchdog(struct thread_smc_args * args)2517d3ac186SLionel Debieve static void tee_entry_watchdog(struct thread_smc_args *args)
2527d3ac186SLionel Debieve {
2537d3ac186SLionel Debieve #if defined(CFG_WDT_SM_HANDLER)
2547d3ac186SLionel Debieve 	__wdt_sm_handler(args);
2557d3ac186SLionel Debieve #else
2567d3ac186SLionel Debieve 	args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
2577d3ac186SLionel Debieve #endif
2587d3ac186SLionel Debieve }
2597d3ac186SLionel Debieve 
260612791d0SJens Wiklander /*
261612791d0SJens Wiklander  * If tee_entry_fast() is overridden, it's still supposed to call this
262612791d0SJens Wiklander  * function.
263612791d0SJens Wiklander  */
__tee_entry_fast(struct thread_smc_args * args)264612791d0SJens Wiklander void __tee_entry_fast(struct thread_smc_args *args)
2655c781c55SJens Wiklander {
2665c781c55SJens Wiklander 	switch (args->a0) {
2675c781c55SJens Wiklander 
2685c781c55SJens Wiklander 	/* Generic functions */
269e43888b8SJens Wiklander 	case OPTEE_SMC_CALLS_COUNT:
2705c781c55SJens Wiklander 		tee_entry_get_api_call_count(args);
2715c781c55SJens Wiklander 		break;
272e43888b8SJens Wiklander 	case OPTEE_SMC_CALLS_UID:
2735c781c55SJens Wiklander 		tee_entry_get_api_uuid(args);
2745c781c55SJens Wiklander 		break;
275e43888b8SJens Wiklander 	case OPTEE_SMC_CALLS_REVISION:
2765c781c55SJens Wiklander 		tee_entry_get_api_revision(args);
2775c781c55SJens Wiklander 		break;
278e43888b8SJens Wiklander 	case OPTEE_SMC_CALL_GET_OS_UUID:
2795c781c55SJens Wiklander 		tee_entry_get_os_uuid(args);
2805c781c55SJens Wiklander 		break;
281e43888b8SJens Wiklander 	case OPTEE_SMC_CALL_GET_OS_REVISION:
2825c781c55SJens Wiklander 		tee_entry_get_os_revision(args);
2835c781c55SJens Wiklander 		break;
2845c781c55SJens Wiklander 
2855c781c55SJens Wiklander 	/* OP-TEE specific SMC functions */
2868aeb6c94SJens Wiklander #ifdef CFG_CORE_RESERVED_SHM
287e43888b8SJens Wiklander 	case OPTEE_SMC_GET_SHM_CONFIG:
2885c781c55SJens Wiklander 		tee_entry_get_shm_config(args);
2895c781c55SJens Wiklander 		break;
2908aeb6c94SJens Wiklander #endif
291*00338334SJens Wiklander #if defined(CFG_SECURE_DATA_PATH) && !defined(CFG_CORE_DYN_PROTMEM)
29289f492f5SJens Wiklander 	case OPTEE_SMC_GET_PROTMEM_CONFIG:
29389f492f5SJens Wiklander 		tee_entry_get_protmem_config(args);
29489f492f5SJens Wiklander 		break;
29589f492f5SJens Wiklander #endif
296e43888b8SJens Wiklander 	case OPTEE_SMC_L2CC_MUTEX:
2975c781c55SJens Wiklander 		tee_entry_fastcall_l2cc_mutex(args);
2985c781c55SJens Wiklander 		break;
299e43888b8SJens Wiklander 	case OPTEE_SMC_EXCHANGE_CAPABILITIES:
300e43888b8SJens Wiklander 		tee_entry_exchange_capabilities(args);
301e43888b8SJens Wiklander 		break;
302e43888b8SJens Wiklander 	case OPTEE_SMC_DISABLE_SHM_CACHE:
303e43888b8SJens Wiklander 		tee_entry_disable_shm_cache(args);
304e43888b8SJens Wiklander 		break;
305e43888b8SJens Wiklander 	case OPTEE_SMC_ENABLE_SHM_CACHE:
306e43888b8SJens Wiklander 		tee_entry_enable_shm_cache(args);
307e43888b8SJens Wiklander 		break;
308cee96842Syanyan-wrs 	case OPTEE_SMC_BOOT_SECONDARY:
309cee96842Syanyan-wrs 		tee_entry_boot_secondary(args);
310cee96842Syanyan-wrs 		break;
31127b5e34bSVolodymyr Babchuk 	case OPTEE_SMC_GET_THREAD_COUNT:
31227b5e34bSVolodymyr Babchuk 		tee_entry_get_thread_count(args);
31327b5e34bSVolodymyr Babchuk 		break;
314e43888b8SJens Wiklander 
315b76b2296SJerome Forissier #if defined(CFG_NS_VIRTUALIZATION)
31634c1c806SVolodymyr Babchuk 	case OPTEE_SMC_VM_CREATED:
31734c1c806SVolodymyr Babchuk 		tee_entry_vm_created(args);
31834c1c806SVolodymyr Babchuk 		break;
31934c1c806SVolodymyr Babchuk 	case OPTEE_SMC_VM_DESTROYED:
32034c1c806SVolodymyr Babchuk 		tee_entry_vm_destroyed(args);
32134c1c806SVolodymyr Babchuk 		break;
32234c1c806SVolodymyr Babchuk #endif
32334c1c806SVolodymyr Babchuk 
324c2d44948SJens Wiklander 	case OPTEE_SMC_ENABLE_ASYNC_NOTIF:
325c2d44948SJens Wiklander 		if (IS_ENABLED(CFG_CORE_ASYNC_NOTIF)) {
3263399e5c1SYuvraj Sakshith 			uint16_t g_id = 0;
3273399e5c1SYuvraj Sakshith 
3283399e5c1SYuvraj Sakshith 			if (IS_ENABLED(CFG_NS_VIRTUALIZATION))
3293399e5c1SYuvraj Sakshith 				g_id = args->a7;
3303399e5c1SYuvraj Sakshith 
3313399e5c1SYuvraj Sakshith 			notif_deliver_atomic_event(NOTIF_EVENT_STARTED, g_id);
3323399e5c1SYuvraj Sakshith 
333c2d44948SJens Wiklander 			args->a0 = OPTEE_SMC_RETURN_OK;
334c2d44948SJens Wiklander 		} else {
335c2d44948SJens Wiklander 			args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
336c2d44948SJens Wiklander 		}
337c2d44948SJens Wiklander 		break;
338c2d44948SJens Wiklander 	case OPTEE_SMC_GET_ASYNC_NOTIF_VALUE:
339c2d44948SJens Wiklander 		if (IS_ENABLED(CFG_CORE_ASYNC_NOTIF))
340c2d44948SJens Wiklander 			get_async_notif_value(args);
341c2d44948SJens Wiklander 		else
342c2d44948SJens Wiklander 			args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
343c2d44948SJens Wiklander 		break;
344c2d44948SJens Wiklander 
3457d3ac186SLionel Debieve 	/* Watchdog entry if handler ID is defined in TOS range */
3467d3ac186SLionel Debieve 	case CFG_WDT_SM_HANDLER_ID:
3477d3ac186SLionel Debieve 		tee_entry_watchdog(args);
3487d3ac186SLionel Debieve 		break;
3497d3ac186SLionel Debieve 
3505c781c55SJens Wiklander 	default:
351e43888b8SJens Wiklander 		args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
3525c781c55SJens Wiklander 		break;
3535c781c55SJens Wiklander 	}
3545c781c55SJens Wiklander }
3555c781c55SJens Wiklander 
tee_entry_generic_get_api_call_count(void)3565c781c55SJens Wiklander size_t tee_entry_generic_get_api_call_count(void)
3575c781c55SJens Wiklander {
3585c781c55SJens Wiklander 	/*
3595c781c55SJens Wiklander 	 * All the different calls handled in this file. If the specific
3605c781c55SJens Wiklander 	 * target has additional calls it will call this function and
3615c781c55SJens Wiklander 	 * add the number of calls the target has added.
3625c781c55SJens Wiklander 	 */
36327b5e34bSVolodymyr Babchuk 	size_t ret = 12;
36434c1c806SVolodymyr Babchuk 
365b76b2296SJerome Forissier 	if (IS_ENABLED(CFG_NS_VIRTUALIZATION))
36634c1c806SVolodymyr Babchuk 		ret += 2;
36734c1c806SVolodymyr Babchuk 
36834c1c806SVolodymyr Babchuk 	return ret;
3695c781c55SJens Wiklander }
3705c781c55SJens Wiklander 
tee_entry_get_api_call_count(struct thread_smc_args * args)3715c781c55SJens Wiklander void __weak tee_entry_get_api_call_count(struct thread_smc_args *args)
3725c781c55SJens Wiklander {
3735c781c55SJens Wiklander 	args->a0 = tee_entry_generic_get_api_call_count();
3745c781c55SJens Wiklander }
3755c781c55SJens Wiklander 
tee_entry_get_api_uuid(struct thread_smc_args * args)3765c781c55SJens Wiklander void __weak tee_entry_get_api_uuid(struct thread_smc_args *args)
3775c781c55SJens Wiklander {
378e43888b8SJens Wiklander 	args->a0 = OPTEE_MSG_UID_0;
379e43888b8SJens Wiklander 	args->a1 = OPTEE_MSG_UID_1;
380e43888b8SJens Wiklander 	args->a2 = OPTEE_MSG_UID_2;
381e43888b8SJens Wiklander 	args->a3 = OPTEE_MSG_UID_3;
3825c781c55SJens Wiklander }
3835c781c55SJens Wiklander 
tee_entry_get_api_revision(struct thread_smc_args * args)3845c781c55SJens Wiklander void __weak tee_entry_get_api_revision(struct thread_smc_args *args)
3855c781c55SJens Wiklander {
386e43888b8SJens Wiklander 	args->a0 = OPTEE_MSG_REVISION_MAJOR;
387e43888b8SJens Wiklander 	args->a1 = OPTEE_MSG_REVISION_MINOR;
3885c781c55SJens Wiklander }
3895c781c55SJens Wiklander 
tee_entry_get_os_uuid(struct thread_smc_args * args)3905c781c55SJens Wiklander void __weak tee_entry_get_os_uuid(struct thread_smc_args *args)
3915c781c55SJens Wiklander {
392e43888b8SJens Wiklander 	args->a0 = OPTEE_MSG_OS_OPTEE_UUID_0;
393e43888b8SJens Wiklander 	args->a1 = OPTEE_MSG_OS_OPTEE_UUID_1;
394e43888b8SJens Wiklander 	args->a2 = OPTEE_MSG_OS_OPTEE_UUID_2;
395e43888b8SJens Wiklander 	args->a3 = OPTEE_MSG_OS_OPTEE_UUID_3;
3965c781c55SJens Wiklander }
3975c781c55SJens Wiklander 
tee_entry_get_os_revision(struct thread_smc_args * args)3985c781c55SJens Wiklander void __weak tee_entry_get_os_revision(struct thread_smc_args *args)
3995c781c55SJens Wiklander {
400e43888b8SJens Wiklander 	args->a0 = CFG_OPTEE_REVISION_MAJOR;
401e43888b8SJens Wiklander 	args->a1 = CFG_OPTEE_REVISION_MINOR;
40229cff5cfSJerome Forissier 	args->a2 = TEE_IMPL_GIT_SHA1;
4035c781c55SJens Wiklander }
404