[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 16/21] openpic: fix remaining issues from idr-to-destm
From: |
Alexander Graf |
Subject: |
[Qemu-ppc] [PATCH 16/21] openpic: fix remaining issues from idr-to-destmask conversion |
Date: |
Fri, 25 Jan 2013 13:52:59 +0100 |
From: Scott Wood <address@hidden>
openpic_update_irq() was checking idr rather than destmask, treating
it as if it were a simple bitmap of cpus. Changed to use destmask.
IPI delivery was removing bits directly from .idr, without calling
write_IRQreg_idr so that the change could be conveyed to destmask.
Changed to use destmask directly.
Save/restore destmask when serializing, as due to the IPI change it
cannot be reproduced from idr.
Signed-off-by: Scott Wood <address@hidden>
Signed-off-by: Alexander Graf <address@hidden>
---
hw/openpic.c | 13 +++++++------
1 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/hw/openpic.c b/hw/openpic.c
index 25aa9bf..a4488c2 100644
--- a/hw/openpic.c
+++ b/hw/openpic.c
@@ -436,13 +436,13 @@ static void openpic_update_irq(OpenPICState *opp, int
n_IRQ)
src->ivpr &= ~IVPR_ACTIVITY_MASK;
}
- if (src->idr == 0) {
+ if (src->destmask == 0) {
/* No target */
DPRINTF("%s: IRQ %d has no target\n", __func__, n_IRQ);
return;
}
- if (src->idr == (1 << src->last_cpu)) {
+ if (src->destmask == (1 << src->last_cpu)) {
/* Only one CPU is allowed to receive this IRQ */
IRQ_local_pipe(opp, src->last_cpu, n_IRQ, active, was_active);
} else if (!(src->ivpr & IVPR_MODE_MASK)) {
@@ -1000,8 +1000,7 @@ static void openpic_cpu_write_internal(void *opaque,
hwaddr addr,
case 0x70:
idx = (addr - 0x40) >> 4;
/* we use IDE as mask which CPUs to deliver the IPI to still. */
- write_IRQreg_idr(opp, opp->irq_ipi0 + idx,
- opp->src[opp->irq_ipi0 + idx].idr | val);
+ opp->src[opp->irq_ipi0 + idx].destmask |= val;
openpic_set_irq(opp, opp->irq_ipi0 + idx, 1);
openpic_set_irq(opp, opp->irq_ipi0 + idx, 0);
break;
@@ -1101,8 +1100,8 @@ static uint32_t openpic_iack(OpenPICState *opp, IRQDest
*dst, int cpu)
}
if ((irq >= opp->irq_ipi0) && (irq < (opp->irq_ipi0 + MAX_IPI))) {
- src->idr &= ~(1 << cpu);
- if (src->idr && !src->level) {
+ src->destmask &= ~(1 << cpu);
+ if (src->destmask && !src->level) {
/* trigger on CPUs that didn't know about it yet */
openpic_set_irq(opp, irq, 1);
openpic_set_irq(opp, irq, 0);
@@ -1307,6 +1306,7 @@ static void openpic_save(QEMUFile* f, void *opaque)
for (i = 0; i < opp->max_irq; i++) {
qemu_put_be32s(f, &opp->src[i].ivpr);
qemu_put_be32s(f, &opp->src[i].idr);
+ qemu_get_be32s(f, &opp->src[i].destmask);
qemu_put_sbe32s(f, &opp->src[i].last_cpu);
qemu_put_sbe32s(f, &opp->src[i].pending);
}
@@ -1372,6 +1372,7 @@ static int openpic_load(QEMUFile* f, void *opaque, int
version_id)
qemu_get_be32s(f, &opp->src[i].ivpr);
qemu_get_be32s(f, &opp->src[i].idr);
+ qemu_get_be32s(f, &opp->src[i].destmask);
qemu_get_sbe32s(f, &opp->src[i].last_cpu);
qemu_get_sbe32s(f, &opp->src[i].pending);
}
--
1.6.0.2
- [Qemu-ppc] [PATCH 04/21] macio: Split MacIO in two, (continued)
- [Qemu-ppc] [PATCH 04/21] macio: Split MacIO in two, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 14/21] pseries: Improve handling of multiple PCI host bridges, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 09/21] cuda: QOM'ify CUDA, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 21/21] PPC: Move ppc specific hw emulation to hw/ppc, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 20/21] PPC: e500: Select MPIC v4.2 on ppce500 platform, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 18/21] openpic: add basic support for MPIC v4.2, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 19/21] PPC: e500: fix mpic_iack address, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 16/21] openpic: fix remaining issues from idr-to-destmask conversion,
Alexander Graf <=
- [Qemu-ppc] [PATCH 17/21] openpic: fix timer address decoding, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 11/21] adb: QOM'ify ADB devices, Alexander Graf, 2013/01/25
- [Qemu-ppc] [PATCH 02/21] macio: QOM'ify some more, Alexander Graf, 2013/01/25