From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MaBQM-0007fM-Mf for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MaBQH-0007dX-V4 for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:10 -0400 Received: from [199.232.76.173] (port=60270 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MaBQH-0007dT-SZ for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:05 -0400 Received: from mx2.redhat.com ([66.187.237.31]:32994) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MaBQH-00078R-7Q for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:05 -0400 From: Avi Kivity Date: Sun, 9 Aug 2009 19:44:56 +0300 Message-Id: <1249836296-13288-3-git-send-email-avi@redhat.com> In-Reply-To: <1249836296-13288-1-git-send-email-avi@redhat.com> References: <1249836296-13288-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [PATCH 2/2] Route IOAPIC interrupts via ISA bus List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org Instead of calling the IOAPIC from the PIC, raise IOAPIC irqs via the ISA bus. As a side effect, IOAPIC lines 16-23 are enabled. Signed-off-by: Avi Kivity --- hw/i8259.c | 13 ------------- hw/ioapic.c | 6 ++++-- hw/pc.c | 16 ++++++++-------- hw/pc.h | 4 +--- 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/hw/i8259.c b/hw/i8259.c index 0b9fab5..74acc39 100644 --- a/hw/i8259.c +++ b/hw/i8259.c @@ -60,9 +60,6 @@ struct PicState2 { PicState pics[2]; qemu_irq parent_irq; void *irq_request_opaque; - /* IOAPIC callback support */ - SetIRQFunc *alt_irq_func; - void *alt_irq_opaque; }; #if defined(DEBUG_PIC) || defined (DEBUG_IRQ_COUNT) @@ -203,9 +200,6 @@ static void i8259_set_irq(void *opaque, int irq, int level) } #endif pic_set_irq1(&s->pics[irq >> 3], irq & 7, level); - /* used for IOAPIC irqs */ - if (s->alt_irq_func) - s->alt_irq_func(s->alt_irq_opaque, irq, level); pic_update_irq(s); } @@ -562,10 +556,3 @@ qemu_irq *i8259_init(qemu_irq parent_irq) isa_pic = s; return qemu_allocate_irqs(i8259_set_irq, s, 16); } - -void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func, - void *alt_irq_opaque) -{ - s->alt_irq_func = alt_irq_func; - s->alt_irq_opaque = alt_irq_opaque; -} diff --git a/hw/ioapic.c b/hw/ioapic.c index a5cdd5d..998894d 100644 --- a/hw/ioapic.c +++ b/hw/ioapic.c @@ -241,9 +241,10 @@ static CPUWriteMemoryFunc *ioapic_mem_write[3] = { ioapic_mem_writel, }; -IOAPICState *ioapic_init(void) +qemu_irq *ioapic_init(void) { IOAPICState *s; + qemu_irq *irq; int io_memory; s = qemu_mallocz(sizeof(IOAPICState)); @@ -255,6 +256,7 @@ IOAPICState *ioapic_init(void) register_savevm("ioapic", 0, 1, ioapic_save, ioapic_load, s); qemu_register_reset(ioapic_reset, s); + irq = qemu_allocate_irqs(ioapic_set_irq, s, IOAPIC_NUM_PINS); - return s; + return irq; } diff --git a/hw/pc.c b/hw/pc.c index a6be4a8..5182a57 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -60,7 +60,6 @@ static fdctrl_t *floppy_controller; static RTCState *rtc_state; static PITState *pit; -static IOAPICState *ioapic; static PCIDevice *i440fx_state; typedef struct rom_reset_data { @@ -89,14 +88,18 @@ static void option_rom_setup_reset(target_phys_addr_t addr, unsigned size) typedef struct isa_irq_state { qemu_irq *i8259; + qemu_irq *ioapic; } IsaIrqState; static void isa_irq_handler(void *opaque, int n, int level) { IsaIrqState *isa = (IsaIrqState *)opaque; - qemu_set_irq(isa->i8259[n], level); -} + if (n < 16) { + qemu_set_irq(isa->i8259[n], level); + } + qemu_set_irq(isa->ioapic[n], level); +}; static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) { @@ -1279,7 +1282,7 @@ static void pc_init1(ram_addr_t ram_size, i8259 = i8259_init(cpu_irq[0]); isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state)); isa_irq_state->i8259 = i8259; - isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 16); + isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24); ferr_irq = isa_irq[13]; if (pci_enabled) { @@ -1321,16 +1324,13 @@ static void pc_init1(ram_addr_t ram_size, register_ioport_write(0x92, 1, 1, ioport92_write, NULL); if (pci_enabled) { - ioapic = ioapic_init(); + isa_irq_state->ioapic = ioapic_init(); } pit = pit_init(0x40, isa_irq[0]); pcspk_init(pit); if (!no_hpet) { hpet_init(isa_irq); } - if (pci_enabled) { - pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic); - } for(i = 0; i < MAX_SERIAL_PORTS; i++) { if (serial_hds[i]) { diff --git a/hw/pc.h b/hw/pc.h index 9fbae20..043c216 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -32,8 +32,6 @@ extern PicState2 *isa_pic; void pic_set_irq(int irq, int level); void pic_set_irq_new(void *opaque, int irq, int level); qemu_irq *i8259_init(qemu_irq parent_irq); -void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func, - void *alt_irq_opaque); int pic_read_irq(PicState2 *s); void pic_update_irq(PicState2 *s); uint32_t pic_intack_read(PicState2 *s); @@ -50,7 +48,7 @@ int apic_init(CPUState *env); int apic_accept_pic_intr(CPUState *env); void apic_deliver_pic_intr(CPUState *env, int level); int apic_get_interrupt(CPUState *env); -IOAPICState *ioapic_init(void); +qemu_irq *ioapic_init(void); void ioapic_set_irq(void *opaque, int vector, int level); void apic_reset_irq_delivered(void); int apic_get_irq_delivered(void); -- 1.6.2.5