CNAME(int_to_apicintpin) + AIMI_SIZE * (irq_num) + AIMI_APIC_ADDRESS
#define REDIRIDX(irq_num) \
CNAME(int_to_apicintpin) + AIMI_SIZE * (irq_num) + AIMI_REDIRINDEX
-
+#define IOAPICFLAGS(irq_num) \
+ CNAME(int_to_apicintpin) + AIMI_SIZE * (irq_num) + AIMI_FLAGS
+
#define MASK_IRQ(irq_num) \
APIC_IMASK_LOCK ; /* into critical reg */ \
testl $IRQ_LBIT(irq_num), apic_imen ; \
* and the EOI cycle would cause redundant INTs to occur.
*/
#define MASK_LEVEL_IRQ(irq_num) \
- testl $IRQ_LBIT(irq_num), apic_pin_trigger ; \
+ testl $AIMI_FLAG_LEVEL, IOAPICFLAGS(irq_num) ; \
jz 9f ; /* edge, don't mask */ \
MASK_IRQ(irq_num) ; \
9: ; \
CNAME(cpustop_restartfunc):
.quad 0
- .globl apic_pin_trigger
-apic_pin_trigger:
- .long 0
-
.text
/*
* Setup the IO APIC.
*/
-
-extern int apic_pin_trigger; /* 'opaque' */
-
void
io_apic_setup_intpin(int apic, int pin)
{
flags = DEFAULT_FLAGS;
level = trigger(apic, pin, &flags);
if (level == 1)
- apic_pin_trigger |= (1 << irq);
+ int_to_apicintpin[irq].flags |= AIMI_FLAG_LEVEL;
polarity(apic, pin, &flags, level);
}
int maxpin;
int pin;
- if (apic == 0)
- apic_pin_trigger = 0; /* default to edge-triggered */
-
maxpin = REDIRCNT_IOAPIC(apic); /* pins in APIC */
kprintf("Programming %d pins in IOAPIC #%d\n", maxpin, apic);
int int_pin;
volatile void *apic_address;
int redirindex;
+ u_int flags; /* AIMI_FLAG */
};
+
+#define AIMI_FLAG_LEVEL 0x1 /* default to edge trigger */
+
extern struct apic_intmapinfo int_to_apicintpin[];
extern struct pcb stoppcbs[];
#ifdef SMP
ASSYM(AIMI_APIC_ADDRESS, offsetof(struct apic_intmapinfo, apic_address));
ASSYM(AIMI_REDIRINDEX, offsetof(struct apic_intmapinfo, redirindex));
+ASSYM(AIMI_FLAGS, offsetof(struct apic_intmapinfo, flags));
ASSYM(AIMI_SIZE, sizeof(struct apic_intmapinfo));
+ASSYM(AIMI_FLAG_LEVEL, AIMI_FLAG_LEVEL);
#endif