Revision 1632dc6a

b/hw/i8259.c
60 60
    PicState pics[2];
61 61
    qemu_irq parent_irq;
62 62
    void *irq_request_opaque;
63
    /* IOAPIC callback support */
64
    SetIRQFunc *alt_irq_func;
65
    void *alt_irq_opaque;
66 63
};
67 64

  
68 65
#if defined(DEBUG_PIC) || defined (DEBUG_IRQ_COUNT)
......
203 200
    }
204 201
#endif
205 202
    pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);
206
    /* used for IOAPIC irqs */
207
    if (s->alt_irq_func)
208
        s->alt_irq_func(s->alt_irq_opaque, irq, level);
209 203
    pic_update_irq(s);
210 204
}
211 205

  
......
562 556
    isa_pic = s;
563 557
    return qemu_allocate_irqs(i8259_set_irq, s, 16);
564 558
}
565

  
566
void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func,
567
                          void *alt_irq_opaque)
568
{
569
    s->alt_irq_func = alt_irq_func;
570
    s->alt_irq_opaque = alt_irq_opaque;
571
}
b/hw/ioapic.c
241 241
    ioapic_mem_writel,
242 242
};
243 243

  
244
IOAPICState *ioapic_init(void)
244
qemu_irq *ioapic_init(void)
245 245
{
246 246
    IOAPICState *s;
247
    qemu_irq *irq;
247 248
    int io_memory;
248 249

  
249 250
    s = qemu_mallocz(sizeof(IOAPICState));
......
255 256

  
256 257
    register_savevm("ioapic", 0, 1, ioapic_save, ioapic_load, s);
257 258
    qemu_register_reset(ioapic_reset, s);
259
    irq = qemu_allocate_irqs(ioapic_set_irq, s, IOAPIC_NUM_PINS);
258 260

  
259
    return s;
261
    return irq;
260 262
}
b/hw/pc.c
61 61
static fdctrl_t *floppy_controller;
62 62
static RTCState *rtc_state;
63 63
static PITState *pit;
64
static IOAPICState *ioapic;
65 64
static PCIDevice *i440fx_state;
66 65

  
67 66
typedef struct rom_reset_data {
......
90 89

  
91 90
typedef struct isa_irq_state {
92 91
    qemu_irq *i8259;
92
    qemu_irq *ioapic;
93 93
} IsaIrqState;
94 94

  
95 95
static void isa_irq_handler(void *opaque, int n, int level)
96 96
{
97 97
    IsaIrqState *isa = (IsaIrqState *)opaque;
98 98

  
99
    qemu_set_irq(isa->i8259[n], level);
100
}
99
    if (n < 16) {
100
        qemu_set_irq(isa->i8259[n], level);
101
    }
102
    qemu_set_irq(isa->ioapic[n], level);
103
};
101 104

  
102 105
static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
103 106
{
......
1282 1285
    i8259 = i8259_init(cpu_irq[0]);
1283 1286
    isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
1284 1287
    isa_irq_state->i8259 = i8259;
1285
    isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 16);
1288
    isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
1286 1289
    ferr_irq = isa_irq[13];
1287 1290

  
1288 1291
    if (pci_enabled) {
......
1324 1327
    register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
1325 1328

  
1326 1329
    if (pci_enabled) {
1327
        ioapic = ioapic_init();
1330
        isa_irq_state->ioapic = ioapic_init();
1328 1331
    }
1329 1332
    pit = pit_init(0x40, isa_irq[0]);
1330 1333
    pcspk_init(pit);
1331 1334
    if (!no_hpet) {
1332 1335
        hpet_init(isa_irq);
1333 1336
    }
1334
    if (pci_enabled) {
1335
        pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
1336
    }
1337 1337

  
1338 1338
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
1339 1339
        if (serial_hds[i]) {
b/hw/pc.h
26 26
void pic_set_irq(int irq, int level);
27 27
void pic_set_irq_new(void *opaque, int irq, int level);
28 28
qemu_irq *i8259_init(qemu_irq parent_irq);
29
void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func,
30
                          void *alt_irq_opaque);
31 29
int pic_read_irq(PicState2 *s);
32 30
void pic_update_irq(PicState2 *s);
33 31
uint32_t pic_intack_read(PicState2 *s);
......
44 42
int apic_accept_pic_intr(CPUState *env);
45 43
void apic_deliver_pic_intr(CPUState *env, int level);
46 44
int apic_get_interrupt(CPUState *env);
47
IOAPICState *ioapic_init(void);
45
qemu_irq *ioapic_init(void);
48 46
void ioapic_set_irq(void *opaque, int vector, int level);
49 47
void apic_reset_irq_delivered(void);
50 48
int apic_get_irq_delivered(void);

Also available in: Unified diff