1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
4 * Copyright (c) 2015, Linaro Limited
5 */
6
7 #include <kernel/tee_ta_manager.h>
8 #include <mm/vm.h>
9 #include <tee/cache.h>
10 #include <tee/svc_cache.h>
11
syscall_cache_operation(void * va,size_t len,unsigned long op)12 TEE_Result syscall_cache_operation(void *va, size_t len, unsigned long op)
13 {
14 struct ts_session *s = ts_get_current_session();
15 struct user_ta_ctx *utc = NULL;
16 TEE_Result res = TEE_SUCCESS;
17
18 if ((to_ta_ctx(s->ctx)->flags & TA_FLAG_CACHE_MAINTENANCE) == 0)
19 return TEE_ERROR_NOT_SUPPORTED;
20
21 utc = to_user_ta_ctx(s->ctx);
22
23 /*
24 * TAs are allowed to operate cache maintenance on TA memref parameters
25 * only, not on the TA private memory.
26 */
27 if (vm_buf_intersects_um_private(&utc->uctx, va, len))
28 return TEE_ERROR_ACCESS_DENIED;
29
30 res = vm_check_access_rights(&utc->uctx,
31 TEE_MEMORY_ACCESS_READ |
32 TEE_MEMORY_ACCESS_ANY_OWNER,
33 (uaddr_t)va, len);
34 if (res != TEE_SUCCESS)
35 return TEE_ERROR_ACCESS_DENIED;
36
37 return cache_operation(op, va, len);
38 }
39