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