X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=7db595f2ad771f859a48f3fa615e4551dce264f4;hb=639fdba00d36b2a60fad3d28703459354cf8744f;hp=31aa28adf6fae61374736ef896c9a21bc68cf479;hpb=4b013fe3750a387fc034352a7e4379f025dad7c2;p=palacios-OLD.git diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 31aa28a..7db595f 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -161,16 +161,16 @@ static int pic_get_intr_number(void * private_data) { for (i = 0; i < 16; i++) { if (i <= 7) { if (((state->master_irr & ~(state->master_imr)) >> i) == 0x01) { - state->master_isr |= (0x1 << i); + //state->master_isr |= (0x1 << i); // reset the irr - state->master_irr &= ~(0x1 << i); + //state->master_irr &= ~(0x1 << i); PrintDebug("IRQ: %d, icw2: %x\n", i, state->master_icw2); return i + state->master_icw2; } } else { if (((state->slave_irr & ~(state->slave_imr)) >> (i - 8)) == 0x01) { - state->slave_isr |= (0x1 << (i - 8)); - state->slave_irr &= ~(0x1 << (i - 8)); + //state->slave_isr |= (0x1 << (i - 8)); + //state->slave_irr &= ~(0x1 << (i - 8)); return (i - 8) + state->slave_icw2; } } @@ -180,7 +180,28 @@ static int pic_get_intr_number(void * private_data) { } +/* The IRQ number is the number returned by pic_get_intr_number(), not the pin number */ static int pic_begin_irq(void * private_data, int irq) { + struct pic_internal * state = (struct pic_internal*)private_data; + + if ((irq >= state->master_icw2) && (irq <= state->master_icw2 + 7)) { + irq &= 0x7; + } else if ((irq >= state->slave_icw2) && (irq <= state->slave_icw2 + 7)) { + irq &= 0x7; + irq += 8; + } else { + return -1; + } + + if (irq <= 7) { + if (((state->master_irr & ~(state->master_imr)) >> irq) == 0x01) { + state->master_isr |= (0x1 << irq); + state->master_irr &= ~(0x1 << irq); + } + } else { + state->slave_isr |= (0x1 << (irq - 8)); + state->slave_irr &= ~(0x1 << (irq - 8)); + } return 0; } @@ -517,7 +538,7 @@ static struct vm_device_ops dev_ops = { struct vm_device * create_pic() { struct pic_internal * state = NULL; - VMMMalloc(struct pic_internal *, state, sizeof(struct pic_internal)); + V3_Malloc(struct pic_internal *, state, sizeof(struct pic_internal)); struct vm_device *device = create_device("8259A", &dev_ops, state);