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)