Revision 5861a338

b/hw/openpic.c
207 207
    PCIDevice pci_dev;
208 208
    MemoryRegion mem;
209 209

  
210
    /* Behavior control */
211
    uint32_t flags;
212

  
210 213
    /* Sub-regions */
211 214
    MemoryRegion sub_io_mem[7];
212 215

  
......
234 237
    int irq_ipi0;
235 238
    int irq_tim0;
236 239
    void (*reset) (void *);
237
    void (*irq_raise) (struct openpic_t *, int, IRQ_src_t *);
238 240
} openpic_t;
239 241

  
242
static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src);
243

  
240 244
static inline void IRQ_setbit (IRQ_queue_t *q, int n_IRQ)
241 245
{
242 246
    set_bit(q->queue, n_IRQ);
......
321 325
        return;
322 326
    }
323 327
    DPRINTF("Raise OpenPIC INT output cpu %d irq %d\n", n_CPU, n_IRQ);
324
    opp->irq_raise(opp, n_CPU, src);
328
    openpic_irq_raise(opp, n_CPU, src);
325 329
}
326 330

  
327 331
/* update pic state because registers for n_IRQ have changed value */
......
753 757
             IPVP_PRIORITY(src->ipvp) > dst->servicing.priority)) {
754 758
            DPRINTF("Raise OpenPIC INT output cpu %d irq %d\n",
755 759
                    idx, n_IRQ);
756
            opp->irq_raise(opp, idx, src);
760
            openpic_irq_raise(opp, idx, src);
757 761
        }
758 762
        break;
759 763
    default:
......
996 1000

  
997 1001
static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src)
998 1002
{
999
    qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]);
1003
    int n_ci = IDR_CI0 - n_CPU;
1004

  
1005
    if ((opp->flags & OPENPIC_FLAG_IDE_CRIT) && test_bit(&src->ide, n_ci)) {
1006
        qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_CINT]);
1007
    } else {
1008
        qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]);
1009
    }
1000 1010
}
1001 1011

  
1002 1012
qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus,
......
1059 1069
                    openpic_save, openpic_load, opp);
1060 1070
    qemu_register_reset(openpic_reset, opp);
1061 1071

  
1062
    opp->irq_raise = openpic_irq_raise;
1063 1072
    opp->reset = openpic_reset;
1064 1073

  
1065 1074
    if (pmem)
......
1068 1077
    return qemu_allocate_irqs(openpic_set_irq, opp, opp->max_irq);
1069 1078
}
1070 1079

  
1071
static void mpic_irq_raise(openpic_t *mpp, int n_CPU, IRQ_src_t *src)
1072
{
1073
    int n_ci = IDR_CI0 - n_CPU;
1074

  
1075
    if(test_bit(&src->ide, n_ci)) {
1076
        qemu_irq_raise(mpp->dst[n_CPU].irqs[OPENPIC_OUTPUT_CINT]);
1077
    }
1078
    else {
1079
        qemu_irq_raise(mpp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]);
1080
    }
1081
}
1082

  
1083 1080
static void mpic_reset (void *opaque)
1084 1081
{
1085 1082
    openpic_t *mpp = (openpic_t *)opaque;
......
1265 1262
        mpp->dst[i].irqs = irqs[i];
1266 1263
    mpp->irq_out = irq_out;
1267 1264

  
1268
    mpp->irq_raise = mpic_irq_raise;
1265
    /* Enable critical interrupt support */
1266
    mpp->flags |= OPENPIC_FLAG_IDE_CRIT;
1269 1267
    mpp->reset = mpic_reset;
1270 1268

  
1271 1269
    register_savevm(NULL, "mpic", 0, 2, openpic_save, openpic_load, mpp);
b/hw/openpic.h
11 11
    OPENPIC_OUTPUT_NB,
12 12
};
13 13

  
14
/* OpenPIC capability flags */
15
#define OPENPIC_FLAG_IDE_CRIT    (1 << 0)
16

  
14 17
qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus,
15 18
                        qemu_irq **irqs, qemu_irq irq_out);
16 19
qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base,

Also available in: Unified diff