summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>2018-08-10 11:05:31 +0100
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>2018-08-20 09:05:39 +0100
commit611eb9cfa72628d752a6f0cdf616eb48412506c2 (patch)
tree055419d8b7f3a818bd028943e7cece8b486acbd2 /services
parentba6e5ca67160f3847b0e68a0f7bc16d12989f2b4 (diff)
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 <jeenu.viswambharan@arm.com>
Diffstat (limited to 'services')
-rw-r--r--services/std_svc/sdei/sdei_intr_mgmt.c12
1 files 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.