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
