diff options
author | Pascal Brand <pascal.brand@st.com> | 2015-02-03 13:45:20 +0100 |
---|---|---|
committer | Pascal Brand <pascal.brand@st.com> | 2015-02-12 09:47:42 +0100 |
commit | fa530828cafeb20aa384d4abb2b76c1fe6fab614 (patch) | |
tree | 07b164d2e59ac9473cc9ac78e65a5ca13165ce21 /core/arch/arm32 | |
parent | db5f4ae461cebc9d1d119d53aaa7ccd8ff7088d0 (diff) |
Internal API extension on Cache Operations
Following extensions are introduced:
- TEE_CacheClean()
- TEE_CacheFlush()
- TEE_CacheInvalidate()
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Tested-by: Pascal Brand <pascal.brand@linaro.org> (STM platform)
Signed-off-by: Pascal Brand <pascal.brand@st.com>
Diffstat (limited to 'core/arch/arm32')
-rw-r--r-- | core/arch/arm32/kernel/tee_ta_manager.c | 56 | ||||
-rw-r--r-- | core/arch/arm32/plat-stm/conf.mk | 1 | ||||
-rw-r--r-- | core/arch/arm32/tee/arch_svc.c | 1 |
3 files changed, 54 insertions, 4 deletions
diff --git a/core/arch/arm32/kernel/tee_ta_manager.c b/core/arch/arm32/kernel/tee_ta_manager.c index e495585..2dadb11 100644 --- a/core/arch/arm32/kernel/tee_ta_manager.c +++ b/core/arch/arm32/kernel/tee_ta_manager.c @@ -61,8 +61,8 @@ #include <kernel/tee_kta_trace.h> #include <kernel/trace_ta.h> - -/* Use this invalid ID for a static TA, since +/* + * Use this invalid ID for a static TA, since * session is not needed for calling static TA. */ #define TEE_SESSION_ID_STATIC_TA 0xFFFFFFFF @@ -698,7 +698,7 @@ static TEE_Result tee_ta_param_pa2va(struct tee_ta_session *sess, case TEE_PARAM_TYPE_MEMREF_OUTPUT: case TEE_PARAM_TYPE_MEMREF_INOUT: if (core_pa2va - ((uint32_t) param->params[n].memref.buffer, &va)) + ((uint32_t)param->params[n].memref.buffer, &va)) return TEE_ERROR_BAD_PARAMETERS; param->params[n].memref.buffer = va; break; @@ -711,7 +711,6 @@ static TEE_Result tee_ta_param_pa2va(struct tee_ta_session *sess, return TEE_SUCCESS; } - static void tee_ta_set_invoke_timeout(struct tee_ta_session *sess, uint32_t cancel_req_to) { @@ -1543,6 +1542,55 @@ TEE_Result tee_ta_verify_session_pointer(struct tee_ta_session *sess, } /* + * tee_uta_cache_operation - dynamic cache clean/inval request from a TA + */ +#ifdef CFG_CACHE_API +TEE_Result tee_uta_cache_operation(struct tee_ta_session *sess, + enum utee_cache_operation op, + void *va, size_t len) +{ + TEE_Result ret; + paddr_t pa = 0; + int l1op, l2op; + + if ((sess->ctx->flags & TA_FLAG_CACHE_MAINTENANCE) == 0) + return TEE_ERROR_NOT_SUPPORTED; + + ret = tee_mmu_check_access_rights(sess->ctx, + TEE_MEMORY_ACCESS_WRITE, (tee_uaddr_t)va, len); + if (ret != TEE_SUCCESS) + return TEE_ERROR_ACCESS_DENIED; + + ret = tee_mmu_user_va2pa(sess->ctx, va, &pa); + if (ret != TEE_SUCCESS) + return TEE_ERROR_ACCESS_DENIED; + + switch (op) { + case TEE_CACHEFLUSH: + l1op = DCACHE_AREA_CLEAN_INV; + l2op = L2CACHE_AREA_CLEAN_INV; + break; + case TEE_CACHECLEAN: + l1op = DCACHE_AREA_CLEAN; + l2op = L2CACHE_AREA_CLEAN; + break; + case TEE_CACHEINVALIDATE: + l1op = DCACHE_INVALIDATE; + l2op = L2CACHE_INVALIDATE; + break; + default: + return TEE_ERROR_NOT_SUPPORTED; + } + + ret = cache_maintenance_l1(l1op, va, len); + if (ret != TEE_SUCCESS) + return ret; + + return cache_maintenance_l2(l2op, pa, len); +} +#endif + +/* * dump_state - Display TA state as an error log. */ static void dump_state(struct tee_ta_ctx *ctx) diff --git a/core/arch/arm32/plat-stm/conf.mk b/core/arch/arm32/plat-stm/conf.mk index f9ce6e6..7453268 100644 --- a/core/arch/arm32/plat-stm/conf.mk +++ b/core/arch/arm32/plat-stm/conf.mk @@ -14,6 +14,7 @@ core-platform-subdirs += \ libutil_with_isoc := y WITH_PL310 := y WITH_SECURE_TIME_SOURCE_REE := y +CFG_CACHE_API := y include mk/config.mk include $(platform-dir)/system_config.in diff --git a/core/arch/arm32/tee/arch_svc.c b/core/arch/arm32/tee/arch_svc.c index 7d626b9..739fde6 100644 --- a/core/arch/arm32/tee/arch_svc.c +++ b/core/arch/arm32/tee/arch_svc.c @@ -112,6 +112,7 @@ static const tee_svc_func tee_svc_syscall_table[] = { (tee_svc_func)tee_svc_se_channel_get_select_resp, (tee_svc_func)tee_svc_se_channel_transmit, (tee_svc_func)tee_svc_se_channel_close, + (tee_svc_func)tee_svc_cache_operation, }; void tee_svc_handler(struct thread_svc_regs *regs) |