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 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