xref: /optee_os/lib/libutee/tee_system_pta.c (revision 542ae20738df87469ef875507443dc5a753470a9)
187065172SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
287065172SJens Wiklander /*
387065172SJens Wiklander  * Copyright (c) 2019, Linaro Limited
487065172SJens Wiklander  */
587065172SJens Wiklander 
687065172SJens Wiklander #include <pta_system.h>
787065172SJens Wiklander #include <string.h>
887065172SJens Wiklander #include <tee_internal_api_extensions.h>
987065172SJens Wiklander #include <tee_internal_api.h>
1087065172SJens Wiklander #include <types_ext.h>
1187065172SJens Wiklander #include <util.h>
1287065172SJens Wiklander 
1387065172SJens Wiklander static TEE_Result invoke_system_pta(uint32_t cmd_id, uint32_t param_types,
1487065172SJens Wiklander 				    TEE_Param params[TEE_NUM_PARAMS])
1587065172SJens Wiklander {
1687065172SJens Wiklander 	static TEE_TASessionHandle sess = TEE_HANDLE_NULL;
1787065172SJens Wiklander 	static const TEE_UUID uuid = PTA_SYSTEM_UUID;
1887065172SJens Wiklander 
1987065172SJens Wiklander 	if (sess == TEE_HANDLE_NULL) {
20*542ae207SCedric Auger 		TEE_Result res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE,
21*542ae207SCedric Auger 						   0, NULL, &sess, NULL);
2287065172SJens Wiklander 
2387065172SJens Wiklander 		if (res)
2487065172SJens Wiklander 			return res;
2587065172SJens Wiklander 	}
2687065172SJens Wiklander 
27*542ae207SCedric Auger 	return TEE_InvokeTACommand(sess, TEE_TIMEOUT_INFINITE, cmd_id,
28*542ae207SCedric Auger 				   param_types, params, NULL);
2987065172SJens Wiklander }
3087065172SJens Wiklander 
3187065172SJens Wiklander void *tee_map_zi(size_t len, uint32_t flags)
3287065172SJens Wiklander {
3387065172SJens Wiklander 	uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
3487065172SJens Wiklander 					       TEE_PARAM_TYPE_VALUE_INOUT,
3587065172SJens Wiklander 					       TEE_PARAM_TYPE_VALUE_INPUT,
3687065172SJens Wiklander 					       TEE_PARAM_TYPE_NONE);
3787065172SJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS] = { };
3887065172SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
3987065172SJens Wiklander 
4087065172SJens Wiklander 	params[0].value.a = len;
4187065172SJens Wiklander 	if (params[0].value.a != len)
4287065172SJens Wiklander 		return NULL;
4387065172SJens Wiklander 	switch (flags) {
4487065172SJens Wiklander 	case 0:
4587065172SJens Wiklander 		break;
4687065172SJens Wiklander 	case TEE_MEMORY_ACCESS_ANY_OWNER:
4787065172SJens Wiklander 		params[0].value.b = PTA_SYSTEM_MAP_FLAG_SHAREABLE;
4887065172SJens Wiklander 		break;
4987065172SJens Wiklander 	default:
5087065172SJens Wiklander 		return NULL;
5187065172SJens Wiklander 	}
5287065172SJens Wiklander 
5387065172SJens Wiklander 	res = invoke_system_pta(PTA_SYSTEM_MAP_ZI, param_types, params);
5487065172SJens Wiklander 	if (res)
5587065172SJens Wiklander 		return NULL;
5687065172SJens Wiklander 
5787065172SJens Wiklander 	return (void *)(vaddr_t)reg_pair_to_64(params[1].value.a,
5887065172SJens Wiklander 					       params[1].value.b);
5987065172SJens Wiklander }
6087065172SJens Wiklander 
6187065172SJens Wiklander TEE_Result tee_unmap(void *buf, size_t len)
6287065172SJens Wiklander {
6387065172SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
6487065172SJens Wiklander 	uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
6587065172SJens Wiklander 					       TEE_PARAM_TYPE_VALUE_INPUT,
6687065172SJens Wiklander 					       TEE_PARAM_TYPE_NONE,
6787065172SJens Wiklander 					       TEE_PARAM_TYPE_NONE);
6887065172SJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS] = { };
6987065172SJens Wiklander 
7087065172SJens Wiklander 	params[0].value.a = len;
7187065172SJens Wiklander 	reg_pair_from_64((vaddr_t)buf, &params[1].value.a, &params[1].value.b);
7287065172SJens Wiklander 
7387065172SJens Wiklander 	res = invoke_system_pta(PTA_SYSTEM_UNMAP, param_types, params);
7487065172SJens Wiklander 	if (res)
7587065172SJens Wiklander 		EMSG("Invoke PTA_SYSTEM_UNMAP: buf %p, len %#zx", buf, len);
7687065172SJens Wiklander 
7787065172SJens Wiklander 	return res;
7887065172SJens Wiklander }
79