summaryrefslogtreecommitdiff
path: root/core/arch/arm/tee/entry_std.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/arch/arm/tee/entry_std.c')
-rw-r--r--core/arch/arm/tee/entry_std.c62
1 files changed, 44 insertions, 18 deletions
diff --git a/core/arch/arm/tee/entry_std.c b/core/arch/arm/tee/entry_std.c
index 29c3b74..233d731 100644
--- a/core/arch/arm/tee/entry_std.c
+++ b/core/arch/arm/tee/entry_std.c
@@ -51,28 +51,45 @@ static struct tee_ta_session_head tee_open_sessions =
TAILQ_HEAD_INITIALIZER(tee_open_sessions);
static struct mobj *shm_mobj;
+#ifdef CFG_SECURE_DATA_PATH
+static struct mobj **sdp_mem_mobjs;
+#endif
-static TEE_Result set_mem_param(const struct optee_msg_param *param,
- struct param_mem *mem)
+static bool param_mem_from_mobj(struct param_mem *mem, struct mobj *mobj,
+ const paddr_t pa, const size_t sz)
{
paddr_t b;
- size_t sz;
- size_t tsz;
- if (mobj_get_pa(shm_mobj, 0, 0, &b) != TEE_SUCCESS)
- panic("Failed to be PA of shared memory MOBJ");
+ if (mobj_get_pa(mobj, 0, 0, &b) != TEE_SUCCESS)
+ panic("mobj_get_pa failed");
- sz = shm_mobj->size;
- tsz = param->u.tmem.size;
- if (param->u.tmem.buf_ptr && !tsz)
- tsz++;
- if (!core_is_buffer_inside(param->u.tmem.buf_ptr, tsz, b, sz))
- return TEE_ERROR_BAD_PARAMETERS;
+ if (!core_is_buffer_inside(pa, MAX(sz, 1UL), b, mobj->size))
+ return false;
- mem->mobj = shm_mobj;
- mem->offs = param->u.tmem.buf_ptr - b;
- mem->size = param->u.tmem.size;
- return TEE_SUCCESS;
+ mem->mobj = mobj;
+ mem->offs = pa - b;
+ mem->size = sz;
+ return true;
+}
+
+/* fill 'struct param_mem' structure if buffer matches a valid memory object */
+static TEE_Result assign_mobj_to_param_mem(const paddr_t pa, const size_t sz,
+ struct param_mem *mem)
+{
+ struct mobj __maybe_unused **mobj;
+
+ /* belongs to nonsecure shared memory ? */
+ if (param_mem_from_mobj(mem, shm_mobj, pa, sz))
+ return TEE_SUCCESS;
+
+#ifdef CFG_SECURE_DATA_PATH
+ /* belongs to SDP memories ? */
+ for (mobj = sdp_mem_mobjs; *mobj; mobj++)
+ if (param_mem_from_mobj(mem, *mobj, pa, sz))
+ return TEE_SUCCESS;
+#endif
+
+ return TEE_ERROR_BAD_PARAMETERS;
}
static TEE_Result copy_in_params(const struct optee_msg_param *params,
@@ -115,7 +132,9 @@ static TEE_Result copy_in_params(const struct optee_msg_param *params,
case OPTEE_MSG_ATTR_TYPE_TMEM_INOUT:
pt[n] = TEE_PARAM_TYPE_MEMREF_INPUT + attr -
OPTEE_MSG_ATTR_TYPE_TMEM_INPUT;
- res = set_mem_param(params + n, &ta_param->u[n].mem);
+ res = assign_mobj_to_param_mem(params[n].u.tmem.buf_ptr,
+ params[n].u.tmem.size,
+ &ta_param->u[n].mem);
if (res != TEE_SUCCESS)
return res;
break;
@@ -346,7 +365,8 @@ void tee_entry_std(struct thread_smc_args *smc_args)
return;
}
- thread_set_irq(true); /* Enable IRQ for STD calls */
+ /* Enable foreign interrupts for STD calls */
+ thread_set_foreign_intr(true);
switch (arg->cmd) {
case OPTEE_MSG_CMD_OPEN_SESSION:
entry_open_session(smc_args, arg, num_params);
@@ -380,6 +400,12 @@ static TEE_Result default_mobj_init(void)
if (!mobj_sec_ddr)
panic("Failed to register secure ta ram");
+#ifdef CFG_SECURE_DATA_PATH
+ sdp_mem_mobjs = core_sdp_mem_create_mobjs();
+ if (!sdp_mem_mobjs)
+ panic("Failed to register SDP memory");
+#endif
+
return TEE_SUCCESS;
}