aboutsummaryrefslogtreecommitdiff
path: root/hw/openpic.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/openpic.c')
-rw-r--r--hw/openpic.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/hw/openpic.c b/hw/openpic.c
index 8068e7e590..31773373ac 100644
--- a/hw/openpic.c
+++ b/hw/openpic.c
@@ -159,7 +159,7 @@ typedef struct IRQ_dst_t {
uint32_t pcsr; /* CPU sensitivity register */
IRQ_queue_t raised;
IRQ_queue_t servicing;
- CPUState *env; /* Needed if we did SMP */
+ CPUState *env;
} IRQ_dst_t;
struct openpic_t {
@@ -265,8 +265,7 @@ static void IRQ_local_pipe (openpic_t *opp, int n_CPU, int n_IRQ)
if (priority > dst->raised.priority) {
IRQ_get_next(opp, &dst->raised);
DPRINTF("Raise CPU IRQ\n");
- /* XXX: choose the correct cpu */
- cpu_interrupt(first_cpu, CPU_INTERRUPT_HARD);
+ cpu_interrupt(dst->env, CPU_INTERRUPT_HARD);
}
}
@@ -782,8 +781,7 @@ static void openpic_cpu_write (void *opaque, uint32_t addr, uint32_t val)
src = &opp->src[n_IRQ];
if (IPVP_PRIORITY(src->ipvp) > dst->servicing.priority) {
DPRINTF("Raise CPU IRQ\n");
- /* XXX: choose cpu */
- cpu_interrupt(first_cpu, CPU_INTERRUPT_HARD);
+ cpu_interrupt(dst->env, CPU_INTERRUPT_HARD);
}
}
break;
@@ -965,7 +963,8 @@ static void openpic_map(PCIDevice *pci_dev, int region_num,
#endif
}
-openpic_t *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus)
+openpic_t *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus,
+ CPUPPCState **envp)
{
openpic_t *opp;
uint8_t *pci_conf;
@@ -1019,6 +1018,8 @@ openpic_t *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus)
for (; i < MAX_IRQ; i++) {
opp->src[i].type = IRQ_INTERNAL;
}
+ for (i = 0; i < nb_cpus; i++)
+ opp->dst[i].env = envp[i];
openpic_reset(opp);
if (pmem_index)
*pmem_index = opp->mem_index;