|
@@ -30,7 +30,11 @@ static void pch_pic_update_irq(LoongArchPCHPIC *s, uint64_t mask, int level)
|
|
|
qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 1);
|
|
|
}
|
|
|
} else {
|
|
|
- val = mask & s->intisr;
|
|
|
+ /*
|
|
|
+ * intirr means requested pending irq
|
|
|
+ * do not clear pending irq for edge-triggered on lowering edge
|
|
|
+ */
|
|
|
+ val = mask & s->intisr & ~s->intirr;
|
|
|
if (val) {
|
|
|
irq = ctz64(val);
|
|
|
s->intisr &= ~MAKE_64BIT_MASK(irq, 1);
|
|
@@ -51,6 +55,7 @@ static void pch_pic_irq_handler(void *opaque, int irq, int level)
|
|
|
/* Edge triggered */
|
|
|
if (level) {
|
|
|
if ((s->last_intirr & mask) == 0) {
|
|
|
+ /* marked pending on a rising edge */
|
|
|
s->intirr |= mask;
|
|
|
}
|
|
|
s->last_intirr |= mask;
|