diff options
author | Jeenu Viswambharan <jeenu.viswambharan@arm.com> | 2018-01-10 15:22:49 +0000 |
---|---|---|
committer | Jeenu Viswambharan <jeenu.viswambharan@arm.com> | 2018-02-06 07:58:55 +0000 |
commit | 1dd022ca6a820b30faa91187572d4c0ce8fdb270 (patch) | |
tree | 175383bc8f1f63a4ef8cfab1fe8c3217cc762d30 | |
parent | 26ea390891154aaa3c0236f3c206342cc5d3fdc0 (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>
-rw-r--r-- | services/spd/tspd/tspd_main.c | 23 |
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. |