aboutsummaryrefslogtreecommitdiff
path: root/hw/intc
diff options
context:
space:
mode:
authorGlenn Miles <milesg@linux.ibm.com>2025-05-12 13:10:18 +1000
committerCédric Le Goater <clg@redhat.com>2025-07-21 08:03:52 +0200
commit8d373176181fbc11f8d8eae2b4532b867f083ea6 (patch)
tree4b86f801d9c68464f88123b2b4cd8a8f155f0b79 /hw/intc
parenta1577527e212efd27a8ceefbd95321c306abf739 (diff)
downloadqemu-8d373176181fbc11f8d8eae2b4532b867f083ea6.zip
qemu-8d373176181fbc11f8d8eae2b4532b867f083ea6.tar.gz
qemu-8d373176181fbc11f8d8eae2b4532b867f083ea6.tar.bz2
ppc/xive2: Fix irq preempted by lower priority group irq
A problem was seen where uart interrupts would be lost resulting in the console hanging. Traces showed that a lower priority interrupt was preempting a higher priority interrupt, which would result in the higher priority interrupt never being handled. The new interrupt's priority was being compared against the CPPR (Current Processor Priority Register) instead of the PIPR (Post Interrupt Priority Register), as was required by the XIVE spec. This allowed for a window between raising an interrupt and ACK'ing the interrupt where a lower priority interrupt could slip in. Fixes: 26c55b99418 ("ppc/xive2: Process group backlog when updating the CPPR") Signed-off-by: Glenn Miles <milesg@linux.ibm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Michael Kowal <kowal@linux.ibm.com> Reviewed-by: Caleb Schlossin <calebs@linux.ibm.com> Tested-by: Gautam Menghani <gautam@linux.ibm.com> Link: https://lore.kernel.org/qemu-devel/20250512031100.439842-10-npiggin@gmail.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
Diffstat (limited to 'hw/intc')
-rw-r--r--hw/intc/xive2.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
index edf5d9e..36e842f 100644
--- a/hw/intc/xive2.c
+++ b/hw/intc/xive2.c
@@ -1283,7 +1283,7 @@ bool xive2_tm_irq_precluded(XiveTCTX *tctx, int ring, uint8_t priority)
* priority to know if the thread can take the interrupt now or if
* it is precluded.
*/
- if (priority < alt_regs[TM_CPPR]) {
+ if (priority < alt_regs[TM_PIPR]) {
return false;
}
return true;