xref: /optee_os/lib/libutee/tee_system_pta.c (revision 5a913ee74d3c71af2a2860ce8a4e7aeab2916f9b)
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, 0, 0, NULL,
21 						   &sess, NULL);
22 
23 		if (res)
24 			return res;
25 	}
26 
27 	return TEE_InvokeTACommand(sess, 0, cmd_id, param_types, params, NULL);
28 }
29 
30 void *tee_map_zi(size_t len, uint32_t flags)
31 {
32 	uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
33 					       TEE_PARAM_TYPE_VALUE_INOUT,
34 					       TEE_PARAM_TYPE_VALUE_INPUT,
35 					       TEE_PARAM_TYPE_NONE);
36 	TEE_Param params[TEE_NUM_PARAMS] = { };
37 	TEE_Result res = TEE_SUCCESS;
38 
39 	params[0].value.a = len;
40 	if (params[0].value.a != len)
41 		return NULL;
42 	switch (flags) {
43 	case 0:
44 		break;
45 	case TEE_MEMORY_ACCESS_ANY_OWNER:
46 		params[0].value.b = PTA_SYSTEM_MAP_FLAG_SHAREABLE;
47 		break;
48 	default:
49 		return NULL;
50 	}
51 
52 	res = invoke_system_pta(PTA_SYSTEM_MAP_ZI, param_types, params);
53 	if (res)
54 		return NULL;
55 
56 	return (void *)(vaddr_t)reg_pair_to_64(params[1].value.a,
57 					       params[1].value.b);
58 }
59 
60 TEE_Result tee_unmap(void *buf, size_t len)
61 {
62 	TEE_Result res = TEE_SUCCESS;
63 	uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
64 					       TEE_PARAM_TYPE_VALUE_INPUT,
65 					       TEE_PARAM_TYPE_NONE,
66 					       TEE_PARAM_TYPE_NONE);
67 	TEE_Param params[TEE_NUM_PARAMS] = { };
68 
69 	params[0].value.a = len;
70 	reg_pair_from_64((vaddr_t)buf, &params[1].value.a, &params[1].value.b);
71 
72 	res = invoke_system_pta(PTA_SYSTEM_UNMAP, param_types, params);
73 	if (res)
74 		EMSG("Invoke PTA_SYSTEM_UNMAP: buf %p, len %#zx", buf, len);
75 
76 	return res;
77 }
78