xref: /optee_os/core/arch/arm/tee/svc_cache.c (revision 89c9728d981ff0f4a8edecc325858537441d721e)
11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2046ffe61SJens Wiklander /*
3046ffe61SJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
4046ffe61SJens Wiklander  * Copyright (c) 2015, Linaro Limited
5046ffe61SJens Wiklander  */
62221cb56SEtienne Carriere 
7046ffe61SJens Wiklander #include <kernel/tee_ta_manager.h>
8*89c9728dSJens Wiklander #include <mm/vm.h>
92221cb56SEtienne Carriere #include <tee/cache.h>
10d9147dedSEtienne Carriere #include <tee/svc_cache.h>
11046ffe61SJens Wiklander 
syscall_cache_operation(void * va,size_t len,unsigned long op)122221cb56SEtienne Carriere TEE_Result syscall_cache_operation(void *va, size_t len, unsigned long op)
13046ffe61SJens Wiklander {
1400b3b9a2SJens Wiklander 	struct ts_session *s = ts_get_current_session();
1500b3b9a2SJens Wiklander 	struct user_ta_ctx *utc = NULL;
1600b3b9a2SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
172221cb56SEtienne Carriere 
183560d990SJens Wiklander 	if ((to_ta_ctx(s->ctx)->flags & TA_FLAG_CACHE_MAINTENANCE) == 0)
19046ffe61SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
20046ffe61SJens Wiklander 
2100b3b9a2SJens Wiklander 	utc = to_user_ta_ctx(s->ctx);
222221cb56SEtienne Carriere 
23ff25a4d2SEtienne Carriere 	/*
24ff25a4d2SEtienne Carriere 	 * TAs are allowed to operate cache maintenance on TA memref parameters
25ff25a4d2SEtienne Carriere 	 * only, not on the TA private memory.
26ff25a4d2SEtienne Carriere 	 */
27*89c9728dSJens Wiklander 	if (vm_buf_intersects_um_private(&utc->uctx, va, len))
28ff25a4d2SEtienne Carriere 		return TEE_ERROR_ACCESS_DENIED;
29ff25a4d2SEtienne Carriere 
30*89c9728dSJens Wiklander 	res = vm_check_access_rights(&utc->uctx,
31*89c9728dSJens Wiklander 				     TEE_MEMORY_ACCESS_READ |
32ff25a4d2SEtienne Carriere 				     TEE_MEMORY_ACCESS_ANY_OWNER,
332ffdd194SJens Wiklander 				     (uaddr_t)va, len);
34046ffe61SJens Wiklander 	if (res != TEE_SUCCESS)
352221cb56SEtienne Carriere 		return TEE_ERROR_ACCESS_DENIED;
36046ffe61SJens Wiklander 
372221cb56SEtienne Carriere 	return cache_operation(op, va, len);
38046ffe61SJens Wiklander }
39