xref: /optee_os/core/pta/system.c (revision cbe7e1b87977e7dff91e859f5ff0c839b9387c4a)
15843bb75SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
25843bb75SJerome Forissier /*
35843bb75SJerome Forissier  * Copyright (c) 2018-2019, Linaro Limited
46cb02818SJelle Sels  * Copyright (c) 2020, Arm Limited.
55843bb75SJerome Forissier  */
65843bb75SJerome Forissier 
75843bb75SJerome Forissier #include <assert.h>
85843bb75SJerome Forissier #include <crypto/crypto.h>
95843bb75SJerome Forissier #include <kernel/handle.h>
105843bb75SJerome Forissier #include <kernel/huk_subkey.h>
11*cbe7e1b8SBalint Dobszay #include <kernel/ldelf_loader.h>
12*cbe7e1b8SBalint Dobszay #include <kernel/ldelf_syscalls.h>
135843bb75SJerome Forissier #include <kernel/misc.h>
145843bb75SJerome Forissier #include <kernel/msg_param.h>
155843bb75SJerome Forissier #include <kernel/pseudo_ta.h>
16a8e39e9cSJens Wiklander #include <kernel/tpm.h>
176cb02818SJelle Sels #include <kernel/ts_store.h>
189c34c0c7SBalint Dobszay #include <kernel/user_mode_ctx.h>
195843bb75SJerome Forissier #include <ldelf.h>
205843bb75SJerome Forissier #include <mm/file.h>
215843bb75SJerome Forissier #include <mm/fobj.h>
2289c9728dSJens Wiklander #include <mm/vm.h>
235843bb75SJerome Forissier #include <pta_system.h>
24a8e39e9cSJens Wiklander #include <stdlib_ext.h>
25a8e39e9cSJens Wiklander #include <stdlib.h>
265843bb75SJerome Forissier #include <string.h>
275843bb75SJerome Forissier #include <tee_api_defines_extensions.h>
285843bb75SJerome Forissier #include <tee_api_defines.h>
295843bb75SJerome Forissier #include <util.h>
305843bb75SJerome Forissier 
315843bb75SJerome Forissier static unsigned int system_pnum;
325843bb75SJerome Forissier 
339c34c0c7SBalint Dobszay static TEE_Result system_rng_reseed(uint32_t param_types,
345843bb75SJerome Forissier 				    TEE_Param params[TEE_NUM_PARAMS])
355843bb75SJerome Forissier {
3600b3b9a2SJens Wiklander 	size_t entropy_sz = 0;
3700b3b9a2SJens Wiklander 	uint8_t *entropy_input = NULL;
385843bb75SJerome Forissier 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
395843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE,
405843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE,
415843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE);
425843bb75SJerome Forissier 
435843bb75SJerome Forissier 	if (exp_pt != param_types)
445843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
455843bb75SJerome Forissier 	entropy_input = params[0].memref.buffer;
465843bb75SJerome Forissier 	entropy_sz = params[0].memref.size;
475843bb75SJerome Forissier 
48c2020b9dSJens Wiklander 	if (!entropy_sz || !entropy_input)
495843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
505843bb75SJerome Forissier 
515843bb75SJerome Forissier 	crypto_rng_add_event(CRYPTO_RNG_SRC_NONSECURE, &system_pnum,
525843bb75SJerome Forissier 			     entropy_input, entropy_sz);
535843bb75SJerome Forissier 	return TEE_SUCCESS;
545843bb75SJerome Forissier }
555843bb75SJerome Forissier 
569c34c0c7SBalint Dobszay static TEE_Result system_derive_ta_unique_key(struct user_mode_ctx *uctx,
575843bb75SJerome Forissier 					      uint32_t param_types,
585843bb75SJerome Forissier 					      TEE_Param params[TEE_NUM_PARAMS])
595843bb75SJerome Forissier {
605843bb75SJerome Forissier 	size_t data_len = sizeof(TEE_UUID);
615843bb75SJerome Forissier 	TEE_Result res = TEE_ERROR_GENERIC;
625843bb75SJerome Forissier 	uint8_t *data = NULL;
635843bb75SJerome Forissier 	uint32_t access_flags = 0;
645843bb75SJerome Forissier 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
655843bb75SJerome Forissier 					  TEE_PARAM_TYPE_MEMREF_OUTPUT,
665843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE,
675843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE);
685843bb75SJerome Forissier 
695843bb75SJerome Forissier 	if (exp_pt != param_types)
705843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
715843bb75SJerome Forissier 
725843bb75SJerome Forissier 	if (params[0].memref.size > TA_DERIVED_EXTRA_DATA_MAX_SIZE ||
735843bb75SJerome Forissier 	    params[1].memref.size < TA_DERIVED_KEY_MIN_SIZE ||
745843bb75SJerome Forissier 	    params[1].memref.size > TA_DERIVED_KEY_MAX_SIZE)
755843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
765843bb75SJerome Forissier 
775843bb75SJerome Forissier 	/*
785843bb75SJerome Forissier 	 * The derived key shall not end up in non-secure memory by
795843bb75SJerome Forissier 	 * mistake.
805843bb75SJerome Forissier 	 *
815843bb75SJerome Forissier 	 * Note that we're allowing shared memory as long as it's
825843bb75SJerome Forissier 	 * secure. This is needed because a TA always uses shared memory
835843bb75SJerome Forissier 	 * when communicating with another TA.
845843bb75SJerome Forissier 	 */
855843bb75SJerome Forissier 	access_flags = TEE_MEMORY_ACCESS_WRITE | TEE_MEMORY_ACCESS_ANY_OWNER |
865843bb75SJerome Forissier 		       TEE_MEMORY_ACCESS_SECURE;
879c34c0c7SBalint Dobszay 	res = vm_check_access_rights(uctx, access_flags,
885843bb75SJerome Forissier 				     (uaddr_t)params[1].memref.buffer,
895843bb75SJerome Forissier 				     params[1].memref.size);
905843bb75SJerome Forissier 	if (res != TEE_SUCCESS)
915843bb75SJerome Forissier 		return TEE_ERROR_SECURITY;
925843bb75SJerome Forissier 
935843bb75SJerome Forissier 	/* Take extra data into account. */
945843bb75SJerome Forissier 	if (ADD_OVERFLOW(data_len, params[0].memref.size, &data_len))
955843bb75SJerome Forissier 		return TEE_ERROR_SECURITY;
965843bb75SJerome Forissier 
975843bb75SJerome Forissier 	data = calloc(data_len, 1);
985843bb75SJerome Forissier 	if (!data)
995843bb75SJerome Forissier 		return TEE_ERROR_OUT_OF_MEMORY;
1005843bb75SJerome Forissier 
1019c34c0c7SBalint Dobszay 	memcpy(data, &uctx->ts_ctx->uuid, sizeof(TEE_UUID));
1025843bb75SJerome Forissier 
1035843bb75SJerome Forissier 	/* Append the user provided data */
1045843bb75SJerome Forissier 	memcpy(data + sizeof(TEE_UUID), params[0].memref.buffer,
1055843bb75SJerome Forissier 	       params[0].memref.size);
1065843bb75SJerome Forissier 
1075843bb75SJerome Forissier 	res = huk_subkey_derive(HUK_SUBKEY_UNIQUE_TA, data, data_len,
1085843bb75SJerome Forissier 				params[1].memref.buffer,
1095843bb75SJerome Forissier 				params[1].memref.size);
110a8e39e9cSJens Wiklander 	free_wipe(data);
1115843bb75SJerome Forissier 
1125843bb75SJerome Forissier 	return res;
1135843bb75SJerome Forissier }
1145843bb75SJerome Forissier 
1159c34c0c7SBalint Dobszay static TEE_Result system_map_zi(struct user_mode_ctx *uctx,
1169c34c0c7SBalint Dobszay 				uint32_t param_types,
1175843bb75SJerome Forissier 				TEE_Param params[TEE_NUM_PARAMS])
1185843bb75SJerome Forissier {
1195843bb75SJerome Forissier 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
1205843bb75SJerome Forissier 					  TEE_PARAM_TYPE_VALUE_INOUT,
1215843bb75SJerome Forissier 					  TEE_PARAM_TYPE_VALUE_INPUT,
1225843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE);
1235843bb75SJerome Forissier 	uint32_t prot = TEE_MATTR_URW | TEE_MATTR_PRW;
1245843bb75SJerome Forissier 	TEE_Result res = TEE_ERROR_GENERIC;
1255843bb75SJerome Forissier 	struct mobj *mobj = NULL;
1265843bb75SJerome Forissier 	uint32_t pad_begin = 0;
127b9651492SJens Wiklander 	uint32_t vm_flags = 0;
1285843bb75SJerome Forissier 	struct fobj *f = NULL;
1295843bb75SJerome Forissier 	uint32_t pad_end = 0;
1305843bb75SJerome Forissier 	size_t num_bytes = 0;
1315843bb75SJerome Forissier 	vaddr_t va = 0;
1325843bb75SJerome Forissier 
1335843bb75SJerome Forissier 	if (exp_pt != param_types)
1345843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
1355843bb75SJerome Forissier 	if (params[0].value.b & ~PTA_SYSTEM_MAP_FLAG_SHAREABLE)
1365843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
1375843bb75SJerome Forissier 
1385843bb75SJerome Forissier 	if (params[0].value.b & PTA_SYSTEM_MAP_FLAG_SHAREABLE)
1395843bb75SJerome Forissier 		vm_flags |= VM_FLAG_SHAREABLE;
1405843bb75SJerome Forissier 
1415843bb75SJerome Forissier 	num_bytes = params[0].value.a;
1425843bb75SJerome Forissier 	va = reg_pair_to_64(params[1].value.a, params[1].value.b);
1435843bb75SJerome Forissier 	pad_begin = params[2].value.a;
1445843bb75SJerome Forissier 	pad_end = params[2].value.b;
1455843bb75SJerome Forissier 
146787295dfSJens Wiklander 	f = fobj_ta_mem_alloc(ROUNDUP_DIV(num_bytes, SMALL_PAGE_SIZE));
1475843bb75SJerome Forissier 	if (!f)
1485843bb75SJerome Forissier 		return TEE_ERROR_OUT_OF_MEMORY;
1495843bb75SJerome Forissier 	mobj = mobj_with_fobj_alloc(f, NULL);
1505843bb75SJerome Forissier 	fobj_put(f);
1515843bb75SJerome Forissier 	if (!mobj)
1525843bb75SJerome Forissier 		return TEE_ERROR_OUT_OF_MEMORY;
1539c34c0c7SBalint Dobszay 	res = vm_map_pad(uctx, &va, num_bytes, prot, vm_flags,
154918e36c6SSughosh Ganu 			 mobj, 0, pad_begin, pad_end, 0);
155b9651492SJens Wiklander 	mobj_put(mobj);
156b9651492SJens Wiklander 	if (!res)
1575843bb75SJerome Forissier 		reg_pair_from_64(va, &params[1].value.a, &params[1].value.b);
1585843bb75SJerome Forissier 
1595843bb75SJerome Forissier 	return res;
1605843bb75SJerome Forissier }
1615843bb75SJerome Forissier 
1629c34c0c7SBalint Dobszay static TEE_Result system_unmap(struct user_mode_ctx *uctx, uint32_t param_types,
1635843bb75SJerome Forissier 			       TEE_Param params[TEE_NUM_PARAMS])
1645843bb75SJerome Forissier {
1655843bb75SJerome Forissier 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
1665843bb75SJerome Forissier 					  TEE_PARAM_TYPE_VALUE_INPUT,
1675843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE,
1685843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE);
16979f22013SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
17079f22013SJens Wiklander 	uint32_t vm_flags = 0;
171095b07ceSJens Wiklander 	vaddr_t end_va = 0;
17279f22013SJens Wiklander 	vaddr_t va = 0;
17379f22013SJens Wiklander 	size_t sz = 0;
1745843bb75SJerome Forissier 
1755843bb75SJerome Forissier 	if (exp_pt != param_types)
1765843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
1775843bb75SJerome Forissier 
1785843bb75SJerome Forissier 	if (params[0].value.b)
1795843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
1805843bb75SJerome Forissier 
18179f22013SJens Wiklander 	va = reg_pair_to_64(params[1].value.a, params[1].value.b);
18279f22013SJens Wiklander 	sz = ROUNDUP(params[0].value.a, SMALL_PAGE_SIZE);
18379f22013SJens Wiklander 
184095b07ceSJens Wiklander 	/*
185095b07ceSJens Wiklander 	 * The vm_get_flags() and vm_unmap() are supposed to detect or
186095b07ceSJens Wiklander 	 * handle overflow directly or indirectly. However, this function
187095b07ceSJens Wiklander 	 * an API function so an extra guard here is in order. If nothing
188095b07ceSJens Wiklander 	 * else to make it easier to review the code.
189095b07ceSJens Wiklander 	 */
190095b07ceSJens Wiklander 	if (ADD_OVERFLOW(va, sz, &end_va))
191095b07ceSJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
192095b07ceSJens Wiklander 
1939c34c0c7SBalint Dobszay 	res = vm_get_flags(uctx, va, sz, &vm_flags);
19479f22013SJens Wiklander 	if (res)
19579f22013SJens Wiklander 		return res;
19679f22013SJens Wiklander 	if (vm_flags & VM_FLAG_PERMANENT)
19779f22013SJens Wiklander 		return TEE_ERROR_ACCESS_DENIED;
19879f22013SJens Wiklander 
1999c34c0c7SBalint Dobszay 	return vm_unmap(uctx, va, sz);
2005843bb75SJerome Forissier }
2015843bb75SJerome Forissier 
2029c34c0c7SBalint Dobszay static TEE_Result system_dlopen(struct user_mode_ctx *uctx,
2039c34c0c7SBalint Dobszay 				uint32_t param_types,
2045843bb75SJerome Forissier 				TEE_Param params[TEE_NUM_PARAMS])
2055843bb75SJerome Forissier {
2065843bb75SJerome Forissier 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
2075843bb75SJerome Forissier 					  TEE_PARAM_TYPE_VALUE_INPUT,
2085843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE,
2095843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE);
2105843bb75SJerome Forissier 	TEE_Result res = TEE_ERROR_GENERIC;
21100b3b9a2SJens Wiklander 	struct ts_session *s = NULL;
2125843bb75SJerome Forissier 	TEE_UUID *uuid = NULL;
2135843bb75SJerome Forissier 	uint32_t flags = 0;
2145843bb75SJerome Forissier 
2155843bb75SJerome Forissier 	if (exp_pt != param_types)
2165843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
2175843bb75SJerome Forissier 
2185843bb75SJerome Forissier 	uuid = params[0].memref.buffer;
2195843bb75SJerome Forissier 	if (!uuid || params[0].memref.size != sizeof(*uuid))
2205843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
2215843bb75SJerome Forissier 
2225843bb75SJerome Forissier 	flags = params[1].value.a;
2235843bb75SJerome Forissier 
22400b3b9a2SJens Wiklander 	s = ts_pop_current_session();
225*cbe7e1b8SBalint Dobszay 	res = ldelf_dlopen(uctx, uuid, flags);
22600b3b9a2SJens Wiklander 	ts_push_current_session(s);
2275843bb75SJerome Forissier 
2285843bb75SJerome Forissier 	return res;
2295843bb75SJerome Forissier }
2305843bb75SJerome Forissier 
2319c34c0c7SBalint Dobszay static TEE_Result system_dlsym(struct user_mode_ctx *uctx, uint32_t param_types,
2325843bb75SJerome Forissier 			       TEE_Param params[TEE_NUM_PARAMS])
2335843bb75SJerome Forissier {
2345843bb75SJerome Forissier 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
2355843bb75SJerome Forissier 					  TEE_PARAM_TYPE_MEMREF_INPUT,
2365843bb75SJerome Forissier 					  TEE_PARAM_TYPE_VALUE_OUTPUT,
2375843bb75SJerome Forissier 					  TEE_PARAM_TYPE_NONE);
2385843bb75SJerome Forissier 	TEE_Result res = TEE_ERROR_GENERIC;
23900b3b9a2SJens Wiklander 	struct ts_session *s = NULL;
2405843bb75SJerome Forissier 	const char *sym = NULL;
2415843bb75SJerome Forissier 	TEE_UUID *uuid = NULL;
2425843bb75SJerome Forissier 	size_t maxlen = 0;
2435843bb75SJerome Forissier 	vaddr_t va = 0;
2445843bb75SJerome Forissier 
2455843bb75SJerome Forissier 	if (exp_pt != param_types)
2465843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
2475843bb75SJerome Forissier 
2485843bb75SJerome Forissier 	uuid = params[0].memref.buffer;
2495843bb75SJerome Forissier 	if (uuid && params[0].memref.size != sizeof(*uuid))
2505843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
2515843bb75SJerome Forissier 
2525843bb75SJerome Forissier 	sym = params[1].memref.buffer;
2535843bb75SJerome Forissier 	if (!sym)
2545843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
2555843bb75SJerome Forissier 	maxlen = params[1].memref.size;
2565843bb75SJerome Forissier 
25700b3b9a2SJens Wiklander 	s = ts_pop_current_session();
258*cbe7e1b8SBalint Dobszay 	res = ldelf_dlsym(uctx, uuid, sym, maxlen, &va);
25900b3b9a2SJens Wiklander 	ts_push_current_session(s);
2605843bb75SJerome Forissier 
2615843bb75SJerome Forissier 	if (!res)
2625843bb75SJerome Forissier 		reg_pair_from_64(va, &params[2].value.a, &params[2].value.b);
2635843bb75SJerome Forissier 
2645843bb75SJerome Forissier 	return res;
2655843bb75SJerome Forissier }
2665843bb75SJerome Forissier 
267dd333f03SJavier Almansa Sobrino static TEE_Result system_get_tpm_event_log(uint32_t param_types,
268dd333f03SJavier Almansa Sobrino 					   TEE_Param params[TEE_NUM_PARAMS])
269dd333f03SJavier Almansa Sobrino {
270dd333f03SJavier Almansa Sobrino 	uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_OUTPUT,
271dd333f03SJavier Almansa Sobrino 					  TEE_PARAM_TYPE_NONE,
272dd333f03SJavier Almansa Sobrino 					  TEE_PARAM_TYPE_NONE,
273dd333f03SJavier Almansa Sobrino 					  TEE_PARAM_TYPE_NONE);
274dd333f03SJavier Almansa Sobrino 	size_t size = 0;
275dd333f03SJavier Almansa Sobrino 	TEE_Result res = TEE_SUCCESS;
276dd333f03SJavier Almansa Sobrino 
277dd333f03SJavier Almansa Sobrino 	if (exp_pt != param_types)
278dd333f03SJavier Almansa Sobrino 		return TEE_ERROR_BAD_PARAMETERS;
279dd333f03SJavier Almansa Sobrino 
280dd333f03SJavier Almansa Sobrino 	size = params[0].memref.size;
281dd333f03SJavier Almansa Sobrino 	res = tpm_get_event_log(params[0].memref.buffer, &size);
282dd333f03SJavier Almansa Sobrino 	params[0].memref.size = size;
283dd333f03SJavier Almansa Sobrino 
284dd333f03SJavier Almansa Sobrino 	return res;
285dd333f03SJavier Almansa Sobrino }
286dd333f03SJavier Almansa Sobrino 
2875843bb75SJerome Forissier static TEE_Result open_session(uint32_t param_types __unused,
2885843bb75SJerome Forissier 			       TEE_Param params[TEE_NUM_PARAMS] __unused,
2895843bb75SJerome Forissier 			       void **sess_ctx)
2905843bb75SJerome Forissier {
29100b3b9a2SJens Wiklander 	struct ts_session *s = NULL;
2925843bb75SJerome Forissier 	struct system_ctx *ctx = NULL;
2935843bb75SJerome Forissier 
2945843bb75SJerome Forissier 	/* Check that we're called from a user TA */
29500b3b9a2SJens Wiklander 	s = ts_get_calling_session();
2965843bb75SJerome Forissier 	if (!s)
2975843bb75SJerome Forissier 		return TEE_ERROR_ACCESS_DENIED;
2985843bb75SJerome Forissier 	if (!is_user_ta_ctx(s->ctx))
2995843bb75SJerome Forissier 		return TEE_ERROR_ACCESS_DENIED;
3005843bb75SJerome Forissier 
3015843bb75SJerome Forissier 	ctx = calloc(1, sizeof(*ctx));
3025843bb75SJerome Forissier 	if (!ctx)
3035843bb75SJerome Forissier 		return TEE_ERROR_OUT_OF_MEMORY;
3045843bb75SJerome Forissier 
3055843bb75SJerome Forissier 	*sess_ctx = ctx;
3065843bb75SJerome Forissier 
3075843bb75SJerome Forissier 	return TEE_SUCCESS;
3085843bb75SJerome Forissier }
3095843bb75SJerome Forissier 
3105843bb75SJerome Forissier static void close_session(void *sess_ctx)
3115843bb75SJerome Forissier {
3125843bb75SJerome Forissier 	struct system_ctx *ctx = sess_ctx;
3135843bb75SJerome Forissier 
3145843bb75SJerome Forissier 	handle_db_destroy(&ctx->db, ta_bin_close);
3155843bb75SJerome Forissier 	free(ctx);
3165843bb75SJerome Forissier }
3175843bb75SJerome Forissier 
3185843bb75SJerome Forissier static TEE_Result invoke_command(void *sess_ctx, uint32_t cmd_id,
3195843bb75SJerome Forissier 				 uint32_t param_types,
3205843bb75SJerome Forissier 				 TEE_Param params[TEE_NUM_PARAMS])
3215843bb75SJerome Forissier {
32200b3b9a2SJens Wiklander 	struct ts_session *s = ts_get_calling_session();
3239c34c0c7SBalint Dobszay 	struct user_mode_ctx *uctx = to_user_mode_ctx(s->ctx);
3245843bb75SJerome Forissier 
3255843bb75SJerome Forissier 	switch (cmd_id) {
3265843bb75SJerome Forissier 	case PTA_SYSTEM_ADD_RNG_ENTROPY:
3279c34c0c7SBalint Dobszay 		return system_rng_reseed(param_types, params);
3285843bb75SJerome Forissier 	case PTA_SYSTEM_DERIVE_TA_UNIQUE_KEY:
3299c34c0c7SBalint Dobszay 		return system_derive_ta_unique_key(uctx, param_types, params);
3305843bb75SJerome Forissier 	case PTA_SYSTEM_MAP_ZI:
3319c34c0c7SBalint Dobszay 		return system_map_zi(uctx, param_types, params);
3325843bb75SJerome Forissier 	case PTA_SYSTEM_UNMAP:
3339c34c0c7SBalint Dobszay 		return system_unmap(uctx, param_types, params);
3345843bb75SJerome Forissier 	case PTA_SYSTEM_OPEN_TA_BINARY:
335*cbe7e1b8SBalint Dobszay 		return ldelf_open_ta_binary(sess_ctx, param_types, params);
3365843bb75SJerome Forissier 	case PTA_SYSTEM_CLOSE_TA_BINARY:
337*cbe7e1b8SBalint Dobszay 		return ldelf_close_ta_binary(sess_ctx, param_types, params);
3385843bb75SJerome Forissier 	case PTA_SYSTEM_MAP_TA_BINARY:
339*cbe7e1b8SBalint Dobszay 		return ldelf_map_ta_binary(sess_ctx, uctx, param_types, params);
3405843bb75SJerome Forissier 	case PTA_SYSTEM_COPY_FROM_TA_BINARY:
341*cbe7e1b8SBalint Dobszay 		return ldelf_copy_from_ta_binary(sess_ctx, param_types,
3425843bb75SJerome Forissier 						  params);
3435843bb75SJerome Forissier 	case PTA_SYSTEM_SET_PROT:
344*cbe7e1b8SBalint Dobszay 		return ldelf_set_prot(uctx, param_types, params);
3455843bb75SJerome Forissier 	case PTA_SYSTEM_REMAP:
346*cbe7e1b8SBalint Dobszay 		return ldelf_remap(uctx, param_types, params);
3475843bb75SJerome Forissier 	case PTA_SYSTEM_DLOPEN:
3489c34c0c7SBalint Dobszay 		return system_dlopen(uctx, param_types, params);
3495843bb75SJerome Forissier 	case PTA_SYSTEM_DLSYM:
3509c34c0c7SBalint Dobszay 		return system_dlsym(uctx, param_types, params);
351dd333f03SJavier Almansa Sobrino 	case PTA_SYSTEM_GET_TPM_EVENT_LOG:
352dd333f03SJavier Almansa Sobrino 		return system_get_tpm_event_log(param_types, params);
3535843bb75SJerome Forissier 	default:
3545843bb75SJerome Forissier 		break;
3555843bb75SJerome Forissier 	}
3565843bb75SJerome Forissier 
3575843bb75SJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
3585843bb75SJerome Forissier }
3595843bb75SJerome Forissier 
3605843bb75SJerome Forissier pseudo_ta_register(.uuid = PTA_SYSTEM_UUID, .name = "system.pta",
3615843bb75SJerome Forissier 		   .flags = PTA_DEFAULT_FLAGS | TA_FLAG_CONCURRENT,
3625843bb75SJerome Forissier 		   .open_session_entry_point = open_session,
3635843bb75SJerome Forissier 		   .close_session_entry_point = close_session,
3645843bb75SJerome Forissier 		   .invoke_command_entry_point = invoke_command);
365