diff options
author | Balint Dobszay <balint.dobszay@arm.com> | 2020-12-11 16:25:37 +0100 |
---|---|---|
committer | Jérôme Forissier <jerome@forissier.org> | 2021-01-05 17:56:19 +0100 |
commit | 0a971fdb4eeaa9139755d12ba08aaad50ab0f884 (patch) | |
tree | cda8aee135fc76bbd871aaf592cb6cb30b1fb6e9 | |
parent | cbe7e1b87977e7dff91e859f5ff0c839b9387c4a (diff) |
core: invoke SVC handler through struct ts_session
Store the current SVC handler function pointer in struct ts_session, and
invoke the handler through this. Enables changing the SVC handler for a
session without modifying the ts_ops defined in the session context.
Acked-by: Etienne Carriere <etienne.carriere@linaro.org>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Jerome Forissier <jerome@forissier.org>
Signed-off-by: Balint Dobszay <balint.dobszay@arm.com>
-rw-r--r-- | core/arch/arm/kernel/stmm_sp.c | 1 | ||||
-rw-r--r-- | core/arch/arm/kernel/thread.c | 4 | ||||
-rw-r--r-- | core/arch/arm/kernel/user_ta.c | 1 | ||||
-rw-r--r-- | core/include/kernel/ts_manager.h | 3 | ||||
-rw-r--r-- | core/kernel/tee_ta_manager.c | 1 |
5 files changed, 7 insertions, 3 deletions
diff --git a/core/arch/arm/kernel/stmm_sp.c b/core/arch/arm/kernel/stmm_sp.c index 48c63d91..895d7df2 100644 --- a/core/arch/arm/kernel/stmm_sp.c +++ b/core/arch/arm/kernel/stmm_sp.c @@ -330,6 +330,7 @@ TEE_Result stmm_init_session(const TEE_UUID *uuid, struct tee_ta_session *sess) mutex_lock(&tee_ta_mutex); sess->ts_sess.ctx = &spc->ta_ctx.ts_ctx; + sess->ts_sess.handle_svc = sess->ts_sess.ctx->ops->handle_svc; mutex_unlock(&tee_ta_mutex); ts_push_current_session(&sess->ts_sess); diff --git a/core/arch/arm/kernel/thread.c b/core/arch/arm/kernel/thread.c index f8d70606..bc55f6db 100644 --- a/core/arch/arm/kernel/thread.c +++ b/core/arch/arm/kernel/thread.c @@ -1558,8 +1558,8 @@ void __weak thread_svc_handler(struct thread_svc_regs *regs) /* Restore foreign interrupts which are disabled on exception entry */ thread_restore_foreign_intr(); - assert(sess && sess->ctx->ops && sess->ctx->ops->handle_svc); - if (sess->ctx->ops->handle_svc(regs)) { + assert(sess && sess->handle_svc); + if (sess->handle_svc(regs)) { /* We're about to switch back to user mode */ gprof_set_status(sess, TS_GPROF_RESUME); } else { diff --git a/core/arch/arm/kernel/user_ta.c b/core/arch/arm/kernel/user_ta.c index ca9e2aa4..524423c5 100644 --- a/core/arch/arm/kernel/user_ta.c +++ b/core/arch/arm/kernel/user_ta.c @@ -455,6 +455,7 @@ TEE_Result tee_ta_init_user_ta_session(const TEE_UUID *uuid, mutex_lock(&tee_ta_mutex); s->ts_sess.ctx = &utc->ta_ctx.ts_ctx; + s->ts_sess.handle_svc = s->ts_sess.ctx->ops->handle_svc; /* * Another thread trying to load this same TA may need to wait * until this context is fully initialized. This is needed to diff --git a/core/include/kernel/ts_manager.h b/core/include/kernel/ts_manager.h index 6d11e439..d08f6f13 100644 --- a/core/include/kernel/ts_manager.h +++ b/core/include/kernel/ts_manager.h @@ -16,6 +16,7 @@ struct ts_ctx { const struct ts_ops *ops; }; +struct thread_svc_regs; struct ts_session { TAILQ_ENTRY(ts_session) link_tsd; struct ts_ctx *ctx; /* Generic TS context */ @@ -30,6 +31,7 @@ struct ts_session { * syscalls to store handlers of opened TA/SP binaries. */ void *user_ctx; + bool (*handle_svc)(struct thread_svc_regs *regs); }; enum ts_gprof_status { @@ -37,7 +39,6 @@ enum ts_gprof_status { TS_GPROF_RESUME, }; -struct thread_svc_regs; struct ts_ops { TEE_Result (*enter_open_session)(struct ts_session *s); TEE_Result (*enter_invoke_cmd)(struct ts_session *s, uint32_t cmd); diff --git a/core/kernel/tee_ta_manager.c b/core/kernel/tee_ta_manager.c index b24d046e..4a84370e 100644 --- a/core/kernel/tee_ta_manager.c +++ b/core/kernel/tee_ta_manager.c @@ -610,6 +610,7 @@ static TEE_Result tee_ta_init_session_with_context(struct tee_ta_session *s, ctx->ref_count++; s->ts_sess.ctx = &ctx->ts_ctx; + s->ts_sess.handle_svc = s->ts_sess.ctx->ops->handle_svc; return TEE_SUCCESS; } |