Applied, thanks! Damien Zammit, le sam. 19 juil. 2025 06:41:44 +0000, a ecrit: > Avoid reading the ioapic registers for vector and trigger mode, > by introducing an O(1) memory lookup for these properties. > --- > i386/i386/apic.h | 6 ++++++ > i386/i386/pic.c | 5 +++++ > i386/i386/pic.h | 6 ++++++ > i386/i386at/ioapic.c | 27 +++++++++++++-------------- > 4 files changed, 30 insertions(+), 14 deletions(-) > > diff --git a/i386/i386/apic.h b/i386/i386/apic.h > index 92fb900a..df95b812 100644 > --- a/i386/i386/apic.h > +++ b/i386/i386/apic.h > @@ -235,6 +235,11 @@ typedef struct ApicInfo { > struct IrqOverrideData irq_override_list[MAX_IRQ_OVERRIDE]; > } ApicInfo; > > +struct irqinfo { > + uint8_t trigger; > + uint8_t vector; > +}; > + > int apic_data_init(void); > void apic_add_cpu(uint16_t apic_id); > void apic_lapic_init(ApicLocalUnit* lapic_ptr); > @@ -275,6 +280,7 @@ extern volatile ApicLocalUnit* lapic; > extern int cpu_id_lut[]; > extern uint32_t *hpet_addr; > extern uint8_t apic_id_mask; > +extern struct irqinfo irqinfo[]; > > #endif > > diff --git a/i386/i386/pic.c b/i386/i386/pic.c > index 0218fea4..b51bf3ad 100644 > --- a/i386/i386/pic.c > +++ b/i386/i386/pic.c > @@ -80,6 +80,8 @@ int spl_init = 0; > > int iunit[NINTR] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; > > +struct irqinfo irqinfo[NINTR]; > + > unsigned short master_icw, master_ocw, slaves_icw, slaves_ocw; > > u_short PICM_ICW1, PICM_OCW1, PICS_ICW1, PICS_OCW1 ; > @@ -119,6 +121,9 @@ picinit(void) > curr_ipl[i] = SPLHI; > curr_pic_mask = 0; > > + for (i = 0; i < NINTR; i++) > + irqinfo[i].trigger = EDGE_TRIGGER; > + > /* > ** 1. Generate addresses to each PIC port. > */ > diff --git a/i386/i386/pic.h b/i386/i386/pic.h > index aec0ef6b..aa5f7e60 100644 > --- a/i386/i386/pic.h > +++ b/i386/i386/pic.h > @@ -181,11 +181,17 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > #define PIC_MASK_ZERO 0x00 > > #if !defined(__ASSEMBLER__) && !defined(APIC) > +struct irqinfo { > + unsigned char trigger; > + unsigned char vector; > +}; > + > extern void picinit (void); > extern int curr_pic_mask; > extern void intnull(int unit); > extern void mask_irq (unsigned int irq_nr); > extern void unmask_irq (unsigned int irq_nr); > +extern struct irqinfo irqinfo[]; > #endif /* __ASSEMBLER__ */ > > #endif /* _I386_PIC_H_ */ > diff --git a/i386/i386at/ioapic.c b/i386/i386at/ioapic.c > index a6c0fd6a..e38e4d6b 100644 > --- a/i386/i386at/ioapic.c > +++ b/i386/i386at/ioapic.c > @@ -128,6 +128,8 @@ interrupt_handler_fn ivect[NINTR] = { > /* 63 */ intnull, > }; > > +struct irqinfo irqinfo[NINTR]; > + > void > picdisable(void) > { > @@ -290,17 +292,6 @@ 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) > { > @@ -314,7 +305,7 @@ ioapic_irq_eoi(int pin) > spl_t s = simple_lock_irq(&ioapic_lock); > > if (!has_irq_specific_eoi) { > - // XXX Linux conditions on TMR bit: if > (!lapic_tmr_bit(entry.both.vector)) { > + // XXX Linux conditions on trigger mode: if (irqinfo[pin].trigger) { > /* Workaround for old IOAPICs with no specific EOI */ > > /* Mask the pin and change to edge triggered */ > @@ -329,8 +320,7 @@ ioapic_irq_eoi(int pin) > //} > } else { > volatile ApicIoUnit *ioapic = apic_get_ioapic(apic)->ioapic; > - ioapic_read_entry(apic, pin, &entry.both); > - ioapic->eoi.r = entry.both.vector; > + ioapic->eoi.r = irqinfo[pin].vector; > } > > simple_unlock_irq(s, &ioapic_lock); > @@ -420,6 +410,9 @@ ioapic_configure(void) > entry.both.vector = IOAPIC_INT_BASE + gsi; > ioapic_write_entry(apic, pin, entry.both); > > + irqinfo[pin].vector = entry.both.vector; > + irqinfo[pin].trigger = entry.both.trigger; > + > /* Set initial state to masked */ > mask_irq(pin); > > @@ -454,6 +447,9 @@ ioapic_configure(void) > entry.both.vector = IOAPIC_INT_BASE + gsi; > ioapic_write_entry(apic, pin, entry.both); > > + irqinfo[pin].vector = entry.both.vector; > + irqinfo[pin].trigger = entry.both.trigger; > + > /* Set initial state to masked */ > mask_irq(pin); > } > @@ -478,6 +474,9 @@ ioapic_configure(void) > entry.both.vector = IOAPIC_INT_BASE + gsi; > ioapic_write_entry(apic, pin, entry.both); > > + irqinfo[pin + ngsis].vector = entry.both.vector; > + irqinfo[pin + ngsis].trigger = entry.both.trigger; > + > /* Set initial state to masked */ > mask_irq(pin + ngsis); > } > -- > 2.45.2 > > >
-- Samuel il y a 10 catégories de personnes dans le monde : ceux qui comprennent le binaire, et ceux qui ne le comprennent pas