From 54bc94114f22dfd7960c9ba9045f42ff276c3305 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Wed, 5 Sep 2018 14:43:09 +0100 Subject: [PATCH] dev-arm: Take into account PPI enable bit When checking for PPIs to send to the cpu in the PL390 GIC we were forwarding any pending PPI regardless of their masking in the distributor. Change-Id: I2e294abeca733cca95cd0deeb9659c7d3d9d8734 Signed-off-by: Giacomo Travaglini Reviewed-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/12624 Maintainer: Andreas Sandberg --- src/dev/arm/gic_v2.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/dev/arm/gic_v2.cc b/src/dev/arm/gic_v2.cc index 6eaf06525..fe5e1eac8 100644 --- a/src/dev/arm/gic_v2.cc +++ b/src/dev/arm/gic_v2.cc @@ -742,11 +742,18 @@ GicV2::updateIntState(int hint) // Check PPIs if (cpuPpiPending[cpu]) { - for (int ppi = 0; ppi < PPI_MAX; ppi++) { - if (cpuPpiPending[cpu] & (1 << ppi)) - if (highest_pri > getIntPriority(cpu, SGI_MAX + ppi)) { - highest_pri = getIntPriority(cpu, SGI_MAX + ppi); - highest_int = SGI_MAX + ppi; + for (int ppi_idx = 0, int_num = SGI_MAX; + int_num < PPI_MAX + SGI_MAX; + ppi_idx++, int_num++) { + + const bool ppi_pending = bits(cpuPpiPending[cpu], ppi_idx); + const bool ppi_enabled = bits(getIntEnabled(cpu, 0), int_num); + const bool higher_priority = + highest_pri > getIntPriority(cpu, int_num); + + if (ppi_pending && ppi_enabled && higher_priority) { + highest_pri = getIntPriority(cpu, int_num); + highest_int = int_num; } } } -- 2.30.2