[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 13/23] i8259: Switch to per-PIC IRQ update
From: |
Jan Kiszka |
Subject: |
[Qemu-devel] [PATCH v2 13/23] i8259: Switch to per-PIC IRQ update |
Date: |
Fri, 7 Oct 2011 09:19:46 +0200 |
This converts pic_update_irq to work against a single PIC instead of the
complete cascade. Along this change, the required update after
pic_set_irq1 is now moved into that function.
Signed-off-by: Jan Kiszka <address@hidden>
---
hw/i8259.c | 59 ++++++++++++++++++++---------------------------------------
1 files changed, 20 insertions(+), 39 deletions(-)
diff --git a/hw/i8259.c b/hw/i8259.c
index d18fc62..bb257e6 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -118,39 +118,19 @@ static int pic_get_irq(PicState *s)
}
}
-static void pic_set_irq1(PicState *s, int irq, int level);
-
-/* raise irq to CPU if necessary. must be called every time the active
- irq may change */
-static void pic_update_irq(PicState2 *s)
+/* Update INT output. Must be called every time the output may have changed. */
+static void pic_update_irq(PicState *s)
{
- int irq2, irq;
-
- /* first look at slave pic */
- irq2 = pic_get_irq(&s->pics[1]);
- if (irq2 >= 0) {
- /* if irq request by slave pic, signal master PIC */
- pic_set_irq1(&s->pics[0], 2, 1);
- pic_set_irq1(&s->pics[0], 2, 0);
- }
- /* look at requested irq */
- irq = pic_get_irq(&s->pics[0]);
- if (irq >= 0) {
-#if defined(DEBUG_PIC)
- {
- int i;
- for(i = 0; i < 2; i++) {
- printf("pic%d: imr=%x irr=%x padd=%d\n",
- i, s->pics[i].imr, s->pics[i].irr,
- s->pics[i].priority_add);
+ int irq;
- }
- }
- printf("pic: cpu_interrupt\n");
-#endif
- qemu_irq_raise(s->pics[0].int_out);
+ irq = pic_get_irq(s);
+ if (irq >= 0) {
+ DPRINTF("pic%d: imr=%x irr=%x padd=%d\n",
+ s == &s->pics_state->pics[0] ? 0 : 1, s->imr, s->irr,
+ s->priority_add);
+ qemu_irq_raise(s->int_out);
} else {
- qemu_irq_lower(s->pics[0].int_out);
+ qemu_irq_lower(s->int_out);
}
}
@@ -179,6 +159,7 @@ static void pic_set_irq1(PicState *s, int irq, int level)
s->last_irr &= ~mask;
}
}
+ pic_update_irq(s);
}
#ifdef DEBUG_IRQ_LATENCY
@@ -205,7 +186,6 @@ static void i8259_set_irq(void *opaque, int irq, int level)
}
#endif
pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);
- pic_update_irq(s);
}
/* acknowledge interrupt 'irq' */
@@ -220,6 +200,7 @@ static void pic_intack(PicState *s, int irq)
/* We don't clear a level sensitive interrupt here */
if (!(s->elcr & (1 << irq)))
s->irr &= ~(1 << irq);
+ pic_update_irq(s);
}
int pic_read_irq(PicState2 *s)
@@ -246,7 +227,6 @@ int pic_read_irq(PicState2 *s)
irq = 7;
intno = s->pics[0].irq_base + irq;
}
- pic_update_irq(s);
#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_LATENCY)
if (irq == 2) {
@@ -281,7 +261,7 @@ static void pic_init_reset(PicState *s)
s->init4 = 0;
s->single_mode = 0;
/* Note: ELCR is not reset */
- pic_update_irq(s->pics_state);
+ pic_update_irq(s);
}
static void pic_reset(void *opaque)
@@ -331,23 +311,23 @@ static void pic_ioport_write(void *opaque,
target_phys_addr_t addr64,
s->isr &= ~(1 << irq);
if (cmd == 5)
s->priority_add = (irq + 1) & 7;
- pic_update_irq(s->pics_state);
+ pic_update_irq(s);
}
break;
case 3:
irq = val & 7;
s->isr &= ~(1 << irq);
- pic_update_irq(s->pics_state);
+ pic_update_irq(s);
break;
case 6:
s->priority_add = (val + 1) & 7;
- pic_update_irq(s->pics_state);
+ pic_update_irq(s);
break;
case 7:
irq = val & 7;
s->isr &= ~(1 << irq);
s->priority_add = (irq + 1) & 7;
- pic_update_irq(s->pics_state);
+ pic_update_irq(s);
break;
default:
/* no operation */
@@ -359,7 +339,7 @@ static void pic_ioport_write(void *opaque,
target_phys_addr_t addr64,
case 0:
/* normal mode */
s->imr = val;
- pic_update_irq(s->pics_state);
+ pic_update_irq(s);
break;
case 1:
s->irq_base = val & 0xf8;
@@ -395,8 +375,9 @@ static uint32_t pic_poll_read(PicState *s)
}
s->irr &= ~(1 << ret);
s->isr &= ~(1 << ret);
- if (slave || ret != 2)
- pic_update_irq(s->pics_state);
+ if (slave || ret != 2) {
+ pic_update_irq(s);
+ }
} else {
ret = 0x07;
}
--
1.7.3.4
- [Qemu-devel] [PATCH v2 01/23] pc: Drop useless test from isa_irq_handler, (continued)
- [Qemu-devel] [PATCH v2 01/23] pc: Drop useless test from isa_irq_handler, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 03/23] pc: Convert GSIState::i8259_irq into array, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 05/23] i8259: Remove premature inline function attributes, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 06/23] i8259: Drop obsolete prototypes, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 04/23] pc: Fix and clean up PIC-to-APIC IRQ path, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 08/23] i8239: Introduce per-PIC output interrupt, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 07/23] i8259: Move pic_set_irq1 after pic_update_irq, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 11/23] i8259: Update IRQ state after reset, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 10/23] i8259: Reorder intack in pic_read_irq, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 09/23] i8259: Do not update IRQ output after spurious pic_poll_read, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 13/23] i8259: Switch to per-PIC IRQ update,
Jan Kiszka <=
- [Qemu-devel] [PATCH v2 15/23] i8259: Clean up pic_ioport_read, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 14/23] i8259: Fix poll command, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 17/23] i8259: Replace PicState::pics_state with master flag, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 12/23] i8259: Clear ELCR on reset, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 02/23] pc: Generalize ISA IRQs to GSIs, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 19/23] qdev: Add HEX8 property, Jan Kiszka, 2011/10/07
- [Qemu-devel] [PATCH v2 16/23] i8259: PREP: Replace pic_intack_read with pic_read_irq, Jan Kiszka, 2011/10/07