Handle the virtual interrupt domain in our GIC CDDI implementation:
for LPIs and SPIs we just pass through the "virtual" parameter, but
for PPIs we must look at the virtual PPI state rather than the
physical PPI state.

Signed-off-by: Peter Maydell <[email protected]>
---
 target/arm/tcg/gicv5-cpuif.c | 11 ++++++++---
 target/arm/tcg/trace-events  |  2 +-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/target/arm/tcg/gicv5-cpuif.c b/target/arm/tcg/gicv5-cpuif.c
index aeacc812fe0..c85d72b05d0 100644
--- a/target/arm/tcg/gicv5-cpuif.c
+++ b/target/arm/tcg/gicv5-cpuif.c
@@ -1254,7 +1254,7 @@ static void gic_cddi_write(CPUARMState *env, const 
ARMCPRegInfo *ri,
     GICv5IntType type = FIELD_EX64(value, GIC_CDDI, TYPE);
     uint32_t id = FIELD_EX64(value, GIC_CDDI, ID);
 
-    trace_gicv5_cddi(domain, value);
+    trace_gicv5_cddi(domain, virtual, value);
 
     switch (type) {
     case GICV5_PPI:
@@ -1268,8 +1268,13 @@ static void gic_cddi_write(CPUARMState *env, const 
ARMCPRegInfo *ri,
         ppireg = id / 64;
         ppibit = 1ULL << (id % 64);
 
-        env->gicv5_cpuif.ppi_active[ppireg] &= ~ppibit;
-        gic_recalc_ppi_hppi(env);
+        if (virtual) {
+            env->gicv5_cpuif.ich_ppi_active[ppireg] &= ~ppibit;
+            gic_recalc_virt_ppi_hppi(env);
+        } else {
+            env->gicv5_cpuif.ppi_active[ppireg] &= ~ppibit;
+            gic_recalc_ppi_hppi(env);
+        }
         break;
     }
     case GICV5_LPI:
diff --git a/target/arm/tcg/trace-events b/target/arm/tcg/trace-events
index 8e7e4c119db..31c6eafd8ed 100644
--- a/target/arm/tcg/trace-events
+++ b/target/arm/tcg/trace-events
@@ -8,7 +8,7 @@ gicv5_gicr_cdia_fail(int domain, const char *reason) "domain %d 
CDIA attempt fai
 gicv5_gicr_cdia(int domain, uint32_t id) "domain %d CDIA acknowledge of 
interrupt 0x%x"
 gicv5_cdeoi(int domain) "domain %d CDEOI performing priority drop"
 gicv5_vcdeoi(void) "virtual interrupt domain CDEOI performing priority drop"
-gicv5_cddi(int domain, uint32_t id) "domain %d CDDI deactivating interrupt ID 
0x%x"
+gicv5_cddi(int domain, bool virtual, uint32_t id) "domain %d virtual %d CDDI 
deactivating interrupt ID 0x%x"
 gicv5_update_irq_fiq(bool irq, bool fiq, bool nmi) "now IRQ %d FIQ %d NMI %d"
 gicv5_update_virq_vfiq(bool virq, bool vinmi) "now VIRQ %d VINMI %d"
 gicv5_update_ppi_state(int ppi, bool level) "PPI %d source level now %d"
-- 
2.43.0


Reply via email to