summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>2018-01-10 15:22:49 +0000
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>2018-02-06 07:58:55 +0000
commit1dd022ca6a820b30faa91187572d4c0ce8fdb270 (patch)
tree175383bc8f1f63a4ef8cfab1fe8c3217cc762d30 /services
parent26ea390891154aaa3c0236f3c206342cc5d3fdc0 (diff)
TSPD: Explicitly allow NS preemption for Yielding SMCs
When EL3 exception handling is in effect (i.e., EL3_EXCEPTION_HANDLING=1), Non-secure interrupts can't preempt Secure execution. However, for yielding SMCs, preemption by Non-secure interupts is intended. This patch therefore adds a call to ehf_allow_ns_preemption() before dispatching a Yielding SMC to TSP. Change-Id: Ia3a1ae252f3adc0f14e6d7e0502f251bdb349bdf Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
Diffstat (limited to 'services')
-rw-r--r--services/spd/tspd/tspd_main.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/services/spd/tspd/tspd_main.c b/services/spd/tspd/tspd_main.c
index 2ba9f84c..c564f8b8 100644
--- a/services/spd/tspd/tspd_main.c
+++ b/services/spd/tspd/tspd_main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -20,6 +20,7 @@
#include <bl_common.h>
#include <context_mgmt.h>
#include <debug.h>
+#include <ehf.h>
#include <errno.h>
#include <platform.h>
#include <runtime_svc.h>
@@ -540,6 +541,18 @@ uint64_t tspd_smc_handler(uint32_t smc_fid,
*/
enable_intr_rm_local(INTR_TYPE_NS, SECURE);
#endif
+
+#if EL3_EXCEPTION_HANDLING
+ /*
+ * With EL3 exception handling, while an SMC is
+ * being processed, Non-secure interrupts can't
+ * preempt Secure execution. However, for
+ * yielding SMCs, we want preemption to happen;
+ * so explicitly allow NS preemption in this
+ * case.
+ */
+ ehf_allow_ns_preemption();
+#endif
}
cm_el1_sysregs_context_restore(SECURE);
@@ -646,7 +659,13 @@ uint64_t tspd_smc_handler(uint32_t smc_fid,
enable_intr_rm_local(INTR_TYPE_NS, SECURE);
#endif
-
+#if EL3_EXCEPTION_HANDLING
+ /*
+ * Allow the resumed yielding SMC processing to be preempted by
+ * Non-secure interrupts.
+ */
+ ehf_allow_ns_preemption();
+#endif
/* We just need to return to the preempted point in
* TSP and the execution will resume as normal.