The GICv3 architecture does not guarantee that writes to the list
registers are self-synchronizing. As a result, it is possible for a
valid interrupt to be written into a list register but have the empty
list register status register report that list register as not holding
a valid interrupt. Since the empty list register status registers are
used to indicate which list registers can be used to inject an
interrupt to a cell, it is possible for a valid list register entry to
be overwritten, dropping the corresponding interrupt.

Fixes: 2ce9d14ca4e2 ("arm: GICv3 initialisation")
Signed-off-by: Chase Conklin <[email protected]>
---
 hypervisor/arch/arm-common/gic-v3.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/hypervisor/arch/arm-common/gic-v3.c 
b/hypervisor/arch/arm-common/gic-v3.c
index 906d9a8d..6a1d90f8 100644
--- a/hypervisor/arch/arm-common/gic-v3.c
+++ b/hypervisor/arch/arm-common/gic-v3.c
@@ -113,6 +113,12 @@ static void gicv3_write_lr(unsigned int reg, u64 val)
        __WRITE_LR8_15(7)
 #undef __WRITE_LR8_15
        }
+
+       /*
+        * Ensure the write to the LR is visible to the GIC (so that ICH_ELRSR
+        * is updated to indicate that the just-written LR is no longer empty)
+        */
+       isb();
 }
 
 static int gicv3_init(void)
-- 
2.22.0

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/20200115173339.3317-1-chase.conklin%40arm.com.

Reply via email to