@samitouri / QOSamiQemu / commits / 883cd84e82

target/arm: GICv5 cpuif: Fix overflow in left shift

Coverity points out that we forgot the "ULL" suffix when shifting 1 right by a bitcount in various places, so for bit counts above 31 we end up shifting off the end of the word. Fix the three problems Coverity noticed and one more of the same kind that it didn't. CID: 1659588, 1659591, 1659559 Fixes: ce245ac6957 ("target/arm: GICv5 cpuif: Calculate the highest priority PPI") Fixes: 3f79212abae ("target/arm: GICv5 cpuif: Implement GICR CDIA command") Fixes: 49f4c98648c ("target/arm: GICv5 cpuif: Implement GIC CDDI") Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20260512093856.3197700-2-peter.maydell@linaro.org

Peter Maydell committed May 12, 2026 at 10:38 UTC 883cd84e8211f7cd0a8a954e57044d23c707f004
1 file changed +4 -4
target/arm/tcg/gicv5-cpuif.c
+4 -4
@@ -275,7 +275,7 @@ static void gic_recalc_ppi_hppi(CPUARMState *env)
275 int ppi;
276 int bit = ctz64(en_pend_nact);
277
278 - en_pend_nact &= ~(1 << bit);
278 + en_pend_nact &= ~(1ULL << bit);
279
280 ppi = i * 64 + bit;
281 prio = extract64(env->gicv5_cpuif.ppi_priority[ppi / 8],
@@ -631,7 +631,7 @@ static uint64_t gicr_cdia_read(CPUARMState *env, const ARMCPRegInfo *ri)
631 * gicv5_activate() cause a re-evaluation of HPPIs they use the
632 * right (new) running priority.
633 */
634 - env->gicv5_cpuif.icc_apr[domain] |= (1 << hppi.prio);
634 + env->gicv5_cpuif.icc_apr[domain] |= (1ULL << hppi.prio);
635 switch (type) {
636 case GICV5_PPI:
637 {
@@ -639,7 +639,7 @@ static uint64_t gicr_cdia_read(CPUARMState *env, const ARMCPRegInfo *ri)
639
640 assert(id < GICV5_NUM_PPIS);
641 ppireg = id / 64;
642 - ppibit = 1 << (id % 64);
642 + ppibit = 1ULL << (id % 64);
643
644 env->gicv5_cpuif.ppi_active[ppireg] |= ppibit;
645 if (!(env->gicv5_cpuif.ppi_hm[ppireg] & ppibit)) {
@@ -707,7 +707,7 @@ static void gic_cddi_write(CPUARMState *env, const ARMCPRegInfo *ri,
707 }
708
709 ppireg = id / 64;
710 - ppibit = 1 << (id % 64);
710 + ppibit = 1ULL << (id % 64);
711
712 env->gicv5_cpuif.ppi_active[ppireg] &= ~ppibit;
713 gic_recalc_ppi_hppi(env);