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