xref: /optee_os/lib/libutee/tee_system_pta.c (revision 870651722167c9613fd3bd24061934556e0b49a6)
1*87065172SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
2*87065172SJens Wiklander /*
3*87065172SJens Wiklander  * Copyright (c) 2019, Linaro Limited
4*87065172SJens Wiklander  */
5*87065172SJens Wiklander 
6*87065172SJens Wiklander #include <pta_system.h>
7*87065172SJens Wiklander #include <string.h>
8*87065172SJens Wiklander #include <tee_internal_api_extensions.h>
9*87065172SJens Wiklander #include <tee_internal_api.h>
10*87065172SJens Wiklander #include <types_ext.h>
11*87065172SJens Wiklander #include <util.h>
12*87065172SJens Wiklander 
13*87065172SJens Wiklander static TEE_Result invoke_system_pta(uint32_t cmd_id, uint32_t param_types,
14*87065172SJens Wiklander 				    TEE_Param params[TEE_NUM_PARAMS])
15*87065172SJens Wiklander {
16*87065172SJens Wiklander 	static TEE_TASessionHandle sess = TEE_HANDLE_NULL;
17*87065172SJens Wiklander 	static const TEE_UUID uuid = PTA_SYSTEM_UUID;
18*87065172SJens Wiklander 
19*87065172SJens Wiklander 	if (sess == TEE_HANDLE_NULL) {
20*87065172SJens Wiklander 		TEE_Result res = TEE_OpenTASession(&uuid, 0, 0, NULL,
21*87065172SJens Wiklander 						   &sess, NULL);
22*87065172SJens Wiklander 
23*87065172SJens Wiklander 		if (res)
24*87065172SJens Wiklander 			return res;
25*87065172SJens Wiklander 	}
26*87065172SJens Wiklander 
27*87065172SJens Wiklander 	return TEE_InvokeTACommand(sess, 0, cmd_id, param_types, params, NULL);
28*87065172SJens Wiklander }
29*87065172SJens Wiklander 
30*87065172SJens Wiklander void *tee_map_zi(size_t len, uint32_t flags)
31*87065172SJens Wiklander {
32*87065172SJens Wiklander 	uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
33*87065172SJens Wiklander 					       TEE_PARAM_TYPE_VALUE_INOUT,
34*87065172SJens Wiklander 					       TEE_PARAM_TYPE_VALUE_INPUT,
35*87065172SJens Wiklander 					       TEE_PARAM_TYPE_NONE);
36*87065172SJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS] = { };
37*87065172SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
38*87065172SJens Wiklander 
39*87065172SJens Wiklander 	params[0].value.a = len;
40*87065172SJens Wiklander 	if (params[0].value.a != len)
41*87065172SJens Wiklander 		return NULL;
42*87065172SJens Wiklander 	switch (flags) {
43*87065172SJens Wiklander 	case 0:
44*87065172SJens Wiklander 		break;
45*87065172SJens Wiklander 	case TEE_MEMORY_ACCESS_ANY_OWNER:
46*87065172SJens Wiklander 		params[0].value.b = PTA_SYSTEM_MAP_FLAG_SHAREABLE;
47*87065172SJens Wiklander 		break;
48*87065172SJens Wiklander 	default:
49*87065172SJens Wiklander 		return NULL;
50*87065172SJens Wiklander 	}
51*87065172SJens Wiklander 
52*87065172SJens Wiklander 	res = invoke_system_pta(PTA_SYSTEM_MAP_ZI, param_types, params);
53*87065172SJens Wiklander 	if (res)
54*87065172SJens Wiklander 		return NULL;
55*87065172SJens Wiklander 
56*87065172SJens Wiklander 	return (void *)(vaddr_t)reg_pair_to_64(params[1].value.a,
57*87065172SJens Wiklander 					       params[1].value.b);
58*87065172SJens Wiklander }
59*87065172SJens Wiklander 
60*87065172SJens Wiklander TEE_Result tee_unmap(void *buf, size_t len)
61*87065172SJens Wiklander {
62*87065172SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
63*87065172SJens Wiklander 	uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
64*87065172SJens Wiklander 					       TEE_PARAM_TYPE_VALUE_INPUT,
65*87065172SJens Wiklander 					       TEE_PARAM_TYPE_NONE,
66*87065172SJens Wiklander 					       TEE_PARAM_TYPE_NONE);
67*87065172SJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS] = { };
68*87065172SJens Wiklander 
69*87065172SJens Wiklander 	params[0].value.a = len;
70*87065172SJens Wiklander 	reg_pair_from_64((vaddr_t)buf, &params[1].value.a, &params[1].value.b);
71*87065172SJens Wiklander 
72*87065172SJens Wiklander 	res = invoke_system_pta(PTA_SYSTEM_UNMAP, param_types, params);
73*87065172SJens Wiklander 	if (res)
74*87065172SJens Wiklander 		EMSG("Invoke PTA_SYSTEM_UNMAP: buf %p, len %#zx", buf, len);
75*87065172SJens Wiklander 
76*87065172SJens Wiklander 	return res;
77*87065172SJens Wiklander }
78