Damien Zammit, le sam. 12 juil. 2025 12:34:44 +0000, a ecrit: > This code may be needed in the future, so add it in now > but keep it disabled. The special EOI handling for > interrupts may only need to be done for one kind of trigger mode.
Applied, thanks! > --- > i386/i386at/ioapic.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git a/i386/i386at/ioapic.c b/i386/i386at/ioapic.c > index d0724f76..85359664 100644 > --- a/i386/i386at/ioapic.c > +++ b/i386/i386at/ioapic.c > @@ -290,6 +290,17 @@ ioapic_toggle(int pin, int mask) > ioapic_toggle_entry(apic, pin, mask); > } > > +#if 0 > +static int > +lapic_tmr_bit(uint8_t vec) > +{ > + int i; > + > + i = (vec & ~0x1f) >> 5; > + return lapic->tmr[i].r & (1 << (vec & 0x1f)); > +} > +#endif > + > void > ioapic_irq_eoi(int pin) > { > @@ -301,11 +312,14 @@ ioapic_irq_eoi(int pin) > > spl_t s = simple_lock_irq(&ioapic_lock); > > + /* Read entry to find vector */ > + ioapic_read_entry(apic, pin, &entry.both); > + > if (!has_irq_specific_eoi) { > + // XXX Linux conditions on TMR bit: if > (!lapic_tmr_bit(entry.both.vector)) { > /* Workaround for old IOAPICs with no specific EOI */ > > /* Mask the pin and change to edge triggered */ > - ioapic_read_entry(apic, pin, &entry.both); > oldentry = entry; > entry.both.mask = IOAPIC_MASK_DISABLED; > entry.both.trigger = IOAPIC_EDGE_TRIGGERED; > @@ -313,10 +327,9 @@ ioapic_irq_eoi(int pin) > > /* Restore level entry */ > ioapic_write_entry(apic, pin, oldentry.both); > + //} > } else { > volatile ApicIoUnit *ioapic = apic_get_ioapic(apic)->ioapic; > - > - ioapic_read_entry(apic, pin, &entry.both); > ioapic->eoi.r = entry.both.vector; > } > > -- > 2.45.2 > > > -- Samuel "...very few phenomena can pull someone out of Deep Hack Mode, with two noted exceptions: being struck by lightning, or worse, your *computer* being struck by lightning." (By Matt Welsh)