Subject says it all. With KVM in-kernel irqchip this is unused.
Index: kvm-userspace.io/qemu/hw/apic.c =================================================================== --- kvm-userspace.io.orig/qemu/hw/apic.c +++ kvm-userspace.io/qemu/hw/apic.c @@ -478,6 +478,8 @@ int apic_get_interrupt(CPUState *env) APICState *s = env->apic_state; int intno; + assert_is_locked(&irq_mutex); + /* if the APIC is installed or enabled, we let the 8259 handle the IRQs */ if (!s) @@ -597,6 +599,8 @@ static uint32_t apic_mem_readl(void *opa return 0; s = env->apic_state; + qemu_mutex_lock(&irq_mutex); + index = (addr >> 4) & 0xff; switch(index) { case 0x02: /* id */ @@ -659,6 +663,7 @@ static uint32_t apic_mem_readl(void *opa val = 0; break; } + qemu_mutex_unlock(&irq_mutex); #ifdef DEBUG_APIC printf("APIC read: %08x = %08x\n", (uint32_t)addr, val); #endif @@ -676,6 +681,8 @@ static void apic_mem_writel(void *opaque return; s = env->apic_state; + qemu_mutex_lock(&irq_mutex); + #ifdef DEBUG_APIC printf("APIC write: %08x = %08x\n", (uint32_t)addr, val); #endif @@ -748,6 +755,8 @@ static void apic_mem_writel(void *opaque s->esr |= ESR_ILLEGAL_ADDRESS; break; } + + qemu_mutex_unlock(&irq_mutex); } #ifdef KVM_CAP_IRQCHIP @@ -995,6 +1004,8 @@ static void ioapic_service(IOAPICState * uint8_t polarity; uint32_t deliver_bitmask[MAX_APIC_WORDS]; + assert_is_locked(&irq_mutex); + for (i = 0; i < IOAPIC_NUM_PINS; i++) { mask = 1 << i; if (s->irr & mask) { @@ -1087,9 +1098,12 @@ static void ioapic_mem_writel(void *opaq IOAPICState *s = opaque; int index; + qemu_mutex_lock(&irq_mutex); + addr &= 0xff; if (addr == 0x00) { s->ioregsel = val; + qemu_mutex_unlock(&irq_mutex); return; } else if (addr == 0x10) { #ifdef DEBUG_IOAPIC @@ -1113,6 +1127,7 @@ static void ioapic_mem_writel(void *opaq s->ioredtbl[index] |= val; } ioapic_service(s); + qemu_mutex_unlock(&irq_mutex); } } } Index: kvm-userspace.io/qemu/hw/i8259.c =================================================================== --- kvm-userspace.io.orig/qemu/hw/i8259.c +++ kvm-userspace.io/qemu/hw/i8259.c @@ -78,6 +78,7 @@ static uint64_t irq_count[16]; static inline void pic_set_irq1(PicState *s, int irq, int level) { int mask; + assert_is_locked(&irq_mutex); mask = 1 << irq; if (s->elcr & mask) { /* level triggered */ @@ -118,6 +119,8 @@ static int pic_get_irq(PicState *s) { int mask, cur_priority, priority; + assert_is_locked(&irq_mutex); + mask = s->irr & ~s->imr; priority = get_priority(s, mask); if (priority == 8) @@ -189,6 +192,7 @@ static void i8259_set_irq(void *opaque, if (kvm_set_irq(irq, level)) return; #endif + qemu_mutex_lock(&irq_mutex); #if defined(DEBUG_PIC) || defined(DEBUG_IRQ_COUNT) if (level != irq_level[irq]) { #if defined(DEBUG_PIC) @@ -211,6 +215,7 @@ static void i8259_set_irq(void *opaque, if (s->alt_irq_func) s->alt_irq_func(s->alt_irq_opaque, irq, level); pic_update_irq(s); + qemu_mutex_unlock(&irq_mutex); } /* acknowledge interrupt 'irq' */ @@ -309,6 +314,7 @@ static void pic_ioport_write(void *opaqu PicState *s = opaque; int priority, cmd, irq; + qemu_mutex_lock(&irq_mutex); #ifdef DEBUG_PIC printf("pic_write: addr=0x%02x val=0x%02x\n", addr, val); #endif @@ -394,6 +400,7 @@ static void pic_ioport_write(void *opaqu break; } } + qemu_mutex_unlock(&irq_mutex); } static uint32_t pic_poll_read (PicState *s, uint32_t addr1) @@ -424,6 +431,7 @@ static uint32_t pic_ioport_read(void *op unsigned int addr; int ret; + qemu_mutex_lock(&irq_mutex); addr = addr1; addr &= 1; if (s->poll) { @@ -439,6 +447,7 @@ static uint32_t pic_ioport_read(void *op ret = s->imr; } } + qemu_mutex_unlock(&irq_mutex); #ifdef DEBUG_PIC printf("pic_read: addr=0x%02x val=0x%02x\n", addr1, ret); #endif @@ -451,11 +460,13 @@ uint32_t pic_intack_read(PicState2 *s) { int ret; + qemu_mutex_lock(&irq_mutex); ret = pic_poll_read(&s->pics[0], 0x00); if (ret == 2) ret = pic_poll_read(&s->pics[1], 0x80) + 8; /* Prepare for ISR read */ s->pics[0].read_reg_select = 1; + qemu_mutex_unlock(&irq_mutex); return ret; } Index: kvm-userspace.io/qemu/hw/pc.c =================================================================== --- kvm-userspace.io.orig/qemu/hw/pc.c +++ kvm-userspace.io/qemu/hw/pc.c @@ -53,6 +53,8 @@ static PITState *pit; static IOAPICState *ioapic; static PCIDevice *i440fx_state; +qemu_mutex_t irq_mutex; + static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) { } @@ -99,24 +101,30 @@ int cpu_get_pic_interrupt(CPUState *env) { int intno; + qemu_mutex_lock(&irq_mutex); intno = apic_get_interrupt(env); if (intno >= 0) { /* set irq request if a PIC irq is still pending */ /* XXX: improve that */ pic_update_irq(isa_pic); - return intno; + goto out; } /* read the irq from the PIC */ - if (!apic_accept_pic_intr(env)) - return -1; + if (!apic_accept_pic_intr(env)) { + intno = -1; + goto out; + } intno = pic_read_irq(isa_pic); +out: + qemu_mutex_unlock(&irq_mutex); return intno; } static void pic_irq_request(void *opaque, int irq, int level) { CPUState *env = opaque; + assert_is_locked(&irq_mutex); if (level && apic_accept_pic_intr(env)) cpu_interrupt(env, CPU_INTERRUPT_HARD); } @@ -783,6 +791,8 @@ static void pc_init1(ram_addr_t ram_size BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; BlockDriverState *fd[MAX_FD]; + qemu_mutex_init(&irq_mutex); + if (ram_size >= 0xe0000000 ) { above_4g_mem_size = ram_size - 0xe0000000; ram_size = 0xe0000000; Index: kvm-userspace.io/qemu/hw/pc.h =================================================================== --- kvm-userspace.io.orig/qemu/hw/pc.h +++ kvm-userspace.io/qemu/hw/pc.h @@ -2,6 +2,8 @@ #define HW_PC_H /* PC-style peripherals (also used by other machines). */ +extern qemu_mutex_t irq_mutex; + /* serial.c */ SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr); -- ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel