summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBalint Dobszay <balint.dobszay@arm.com>2020-12-11 16:25:37 +0100
committerJérôme Forissier <jerome@forissier.org>2021-01-05 17:56:19 +0100
commit0a971fdb4eeaa9139755d12ba08aaad50ab0f884 (patch)
treecda8aee135fc76bbd871aaf592cb6cb30b1fb6e9
parentcbe7e1b87977e7dff91e859f5ff0c839b9387c4a (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.c1
-rw-r--r--core/arch/arm/kernel/thread.c4
-rw-r--r--core/arch/arm/kernel/user_ta.c1
-rw-r--r--core/include/kernel/ts_manager.h3
-rw-r--r--core/kernel/tee_ta_manager.c1
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;
}