aboutsummaryrefslogtreecommitdiff
path: root/core/arch/arm32
diff options
context:
space:
mode:
authorPascal Brand <pascal.brand@st.com>2015-02-03 13:45:20 +0100
committerPascal Brand <pascal.brand@st.com>2015-02-12 09:47:42 +0100
commitfa530828cafeb20aa384d4abb2b76c1fe6fab614 (patch)
tree07b164d2e59ac9473cc9ac78e65a5ca13165ce21 /core/arch/arm32
parentdb5f4ae461cebc9d1d119d53aaa7ccd8ff7088d0 (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.c56
-rw-r--r--core/arch/arm32/plat-stm/conf.mk1
-rw-r--r--core/arch/arm32/tee/arch_svc.c1
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)