X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=fb0ab432461bd82f49e24e762397846230a3d655;hb=0275941640fa24071fe2070cc09af175e58e695e;hp=325f41651614337ff16128e8c38dd32383628686;hpb=48aeb8816a1633ab97dd145289d5d0acd75387bb;p=palacios-OLD.git diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 325f416..fb0ab43 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -209,7 +209,7 @@ static int pic_raise_intr(struct v3_vm_info * vm, void * private_data, int irq) return -1; } - v3_interrupt_cpu(vm, 0); + v3_interrupt_cpu(vm, 0, 0); return 0; } @@ -258,7 +258,7 @@ static int pic_get_intr_number(struct guest_info * info, void * private_data) { for (i = 0; i < 16; i++) { if (i <= 7) { - if (((state->master_irr & ~(state->master_imr)) >> i) == 0x01) { + if (((state->master_irr & ~(state->master_imr)) >> i) & 0x01) { //state->master_isr |= (0x1 << i); // reset the irr //state->master_irr &= ~(0x1 << i); @@ -267,11 +267,11 @@ static int pic_get_intr_number(struct guest_info * info, void * private_data) { break; } } else { - if (((state->slave_irr & ~(state->slave_imr)) >> (i - 8)) == 0x01) { + if (((state->slave_irr & ~(state->slave_imr)) >> (i - 8)) & 0x01) { //state->slave_isr |= (0x1 << (i - 8)); //state->slave_irr &= ~(0x1 << (i - 8)); PrintDebug("8259 PIC: IRQ: %d, slave_icw2: %x\n", i, state->slave_icw2); - irq= (i - 8) + state->slave_icw2; + irq = (i - 8) + state->slave_icw2; break; } } @@ -305,7 +305,8 @@ static int pic_begin_irq(struct guest_info * info, void * private_data, int irq) } if (irq <= 7) { - if (((state->master_irr & ~(state->master_imr)) >> irq) == 0x01) { + // This should always be true: See pic_get_intr_number + if (((state->master_irr & ~(state->master_imr)) >> irq) & 0x01) { state->master_isr |= (0x1 << irq); if (!(state->master_elcr & (0x1 << irq))) { @@ -313,10 +314,13 @@ static int pic_begin_irq(struct guest_info * info, void * private_data, int irq) } } } else { - state->slave_isr |= (0x1 << (irq - 8)); - - if (!(state->slave_elcr & (0x1 << irq))) { - state->slave_irr &= ~(0x1 << (irq - 8)); + // This should always be true: See pic_get_intr_number + if (((state->slave_irr & ~(state->slave_imr)) >> (irq - 8)) & 0x01) { + state->slave_isr |= (0x1 << (irq - 8)); + + if (!(state->slave_elcr & (0x1 << (irq - 8)))) { + state->slave_irr &= ~(0x1 << (irq - 8)); + } } }