diff options
author | Kevin Peng <kevin.peng@arm.com> | 2021-03-22 18:07:43 +0800 |
---|---|---|
committer | Ken Liu <ken.liu@arm.com> | 2021-05-08 09:40:26 +0200 |
commit | 77ad9f8777328faac28a1572b255af5b49b21f5b (patch) | |
tree | c01099f16a02ec5ab12ceb94f6d75d95cc415b26 /secure_fw | |
parent | a5448d601df8de06837ecfe8010c22253e3fb4be (diff) | |
download | trusted-firmware-m-77ad9f8777328faac28a1572b255af5b49b21f5b.tar.gz |
SPM: Do not schedule if NSPE was interrupted by SPE
Scheduling should not happen if NSPE was interrupted by SPE, otherwise
the NSPE and SPE would be out of sync on thread context.
Note: Multi-core case does not have this issue.
Change-Id: I58e376e175604c57cfd7d240de8030664ce6b4a7
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
Diffstat (limited to 'secure_fw')
-rw-r--r-- | secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c | 8 | ||||
-rw-r--r-- | secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c | 3 |
2 files changed, 11 insertions, 0 deletions
diff --git a/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c index 61a8cd7dad..72d1685367 100644 --- a/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c +++ b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_base.c @@ -53,6 +53,13 @@ __attribute__((naked)) void PendSV_Handler(void) { __ASM volatile( +#ifndef __ICCARM__ + ".syntax unified \n" +#endif + "movs r0, #0x40 \n" + "mov r1, lr \n" + "tst r0, r1 \n" /* Was NS interrupted by S? */ + "beq exc_return \n" /* Yes, do not schedule */ "mrs r0, psp \n" "mrs r1, psplim \n" "push {r0, r1, r2, lr} \n" @@ -74,6 +81,7 @@ __attribute__((naked)) void PendSV_Handler(void) "mov lr, r3 \n" "msr psp, r0 \n" "msr psplim, r1 \n" + "exc_return: \n" "bx lr \n" ); } diff --git a/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c index 57fd9a2f56..7ee168b141 100644 --- a/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c +++ b/secure_fw/spm/cmsis_psa/arch/tfm_arch_v8m_main.c @@ -56,6 +56,9 @@ __attribute__((naked)) void PendSV_Handler(void) { __ASM volatile( + "tst lr, #0x40 \n" /* Was NS interrupted by S? */ + "it eq \n" + "bxeq lr \n" /* Yes, do not schedule */ "mrs r0, psp \n" "mrs r1, psplim \n" "push {r0, r1, r2, lr} \n" |