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>
This commit is contained in:
parent
ba6e5ca671
commit
611eb9cfa7
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue