SDEI: Unconditionally resume Secure if it was interrupted
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>
Thu, 11 Oct 2018 08:50:26 +0000 (09:50 +0100)
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>
Mon, 26 Nov 2018 11:22:32 +0000 (11:22 +0000)
Secure world execution nearly always expect a controlled exit to
Non-secure world. SDEI interrupts, although targets EL3, occur on behalf
of Non-secure world, and may have higher priority than Secure world
interrupts. Therefore they might preempt Secure execution, and yield
execution to Non-secure SDEI handler. Upon completion of SDEI event
handling (regardless of whether it's COPLETE or COMPLETE_AND_RESUME), we
must resume Secure execution if it was preempted.

Change-Id: I6edd991032588588427ba2fe6c3d7668f7080e3d
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
services/std_svc/sdei/sdei_intr_mgmt.c

index e834a2b90694052e0c0a79c6d85f34b49c70294b..fa778c04e9ca1ffcceb05fe8ac7da839b5b93876 100644 (file)
@@ -485,15 +485,14 @@ int sdei_intr_handler(uint32_t intr_raw, uint32_t flags, void *handle,
        /*
         * We reach here when client completes the event.
         *
-        * If the cause of dispatch originally interrupted the Secure world, and
-        * if Non-secure world wasn't allowed to preempt Secure execution,
+        * If the cause of dispatch originally interrupted the Secure world,
         * resume Secure.
         *
         * No need to save the Non-secure context ahead of a world switch: the
         * Non-secure context was fully saved before dispatch, and has been
         * returned to its pre-dispatch state.
         */
-       if ((sec_state == SECURE) && (ehf_is_ns_preemption_allowed() == 0U))
+       if (sec_state == SECURE)
                restore_and_resume_secure_context();
 
        /*