On 2012-09-05 06:33, Matthew Ogilvie wrote: > According to later discussion, the main issue is actually the input > IRQ behavior on a high to low transition; hence the following fixes > both the test program and the Microport UNIX problem: > > diff --git a/hw/i8259.c b/hw/i8259.c > index 6587666..c011787 100644 > --- a/hw/i8259.c > +++ b/hw/i8259.c > @@ -143,22 +143,23 @@ static void pic_set_irq(void *opaque, int irq, int > level) > if (s->elcr & mask) { > /* level triggered */ > if (level) { > s->irr |= mask; > s->last_irr |= mask; > } else { > s->irr &= ~mask; > s->last_irr &= ~mask; > } > } else { > /* edge triggered */ > if (level) { > if ((s->last_irr & mask) == 0) { > s->irr |= mask; > } > s->last_irr |= mask; > } else { > + s->irr &= ~mask; > s->last_irr &= ~mask; > } > } > pic_update_irq(s); > } > > > Perhaps it would be worth it to swap around the "if"s a little bit > to avoid the (!level) duplication, and clarify that the only difference > is in the low to high transition?
Yes, refactoring would be welcome. But I would suggest to do this in two patches, leaving the above change (+ changelog that explains the reason) in its current clarity. Hurray, no vmstate subsections needed! :) Jan -- Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux