From 611eb9cfa72628d752a6f0cdf616eb48412506c2 Mon Sep 17 00:00:00 2001 From: Jeenu Viswambharan Date: Fri, 10 Aug 2018 11:05:31 +0100 Subject: [PATCH] SDEI: Fix locking issues The event lock for a shared event was being unlocked twice, and the locking sequence for event complete was misplaced. This patch fixes both issues. Change-Id: Ie2fb15c6ec240af132d7d438946ca160bd5c63dc Signed-off-by: Jeenu Viswambharan --- services/std_svc/sdei/sdei_intr_mgmt.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/services/std_svc/sdei/sdei_intr_mgmt.c b/services/std_svc/sdei/sdei_intr_mgmt.c index dd4ef307..e834a2b9 100644 --- a/services/std_svc/sdei/sdei_intr_mgmt.c +++ b/services/std_svc/sdei/sdei_intr_mgmt.c @@ -507,9 +507,6 @@ int sdei_intr_handler(uint32_t intr_raw, uint32_t flags, void *handle, } plat_ic_end_of_interrupt(intr_raw); - if (is_event_shared(map)) - sdei_map_unlock(map); - return 0; } @@ -624,6 +621,9 @@ int sdei_event_complete(bool resume, uint64_t pc) assert(map != NULL); se = get_event_entry(map); + if (is_event_shared(map)) + sdei_map_lock(map); + act = resume ? DO_COMPLETE_RESUME : DO_COMPLETE; if (!can_sdei_state_trans(se, act)) { if (is_event_shared(map)) @@ -631,15 +631,15 @@ int sdei_event_complete(bool resume, uint64_t pc) return SDEI_EDENY; } + if (is_event_shared(map)) + sdei_map_unlock(map); + /* Having done sanity checks, pop dispatch */ (void) pop_dispatch(); SDEI_LOG("EOI:%lx, %d spsr:%lx elr:%lx\n", read_mpidr_el1(), map->ev_num, read_spsr_el3(), read_elr_el3()); - if (is_event_shared(map)) - sdei_map_lock(map); - /* * Restore Non-secure to how it was originally interrupted. Once done, * it's up-to-date with the saved copy. -- 2.30.2