Page MenuHomeFreeBSD

D35406.id106644.diff
No OneTemporary

D35406.id106644.diff

Index: sys/x86/include/intr_machdep.h
===================================================================
--- sys/x86/include/intr_machdep.h
+++ sys/x86/include/intr_machdep.h
@@ -84,7 +84,6 @@
void (*pic_eoi_source)(struct intsrc *);
void (*pic_enable_intr)(struct intsrc *);
void (*pic_disable_intr)(struct intsrc *);
- int (*pic_vector)(struct intsrc *);
int (*pic_source_pending)(struct intsrc *);
void (*pic_suspend)(struct pic *);
void (*pic_resume)(struct pic *, bool suspend_cancelled);
@@ -149,11 +148,12 @@
int intr_config_intr(struct intsrc *isrc, enum intr_trigger trig,
enum intr_polarity pol);
int intr_describe(struct intsrc *isrc, void *ih, const char *descr);
-void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame);
+void intr_execute_handlers(u_int vector, struct intsrc *isrc,
+ struct trapframe *frame);
u_int intr_next_cpu(int domain);
struct intsrc *intr_lookup_source(int vector);
int intr_register_pic(struct pic *pic);
-int intr_register_source(struct intsrc *isrc);
+int intr_register_source(u_int vector, struct intsrc *isrc);
int intr_remove_handler(void *cookie);
void intr_resume(bool suspend_cancelled);
void intr_suspend(void);
Index: sys/x86/isa/atpic.c
===================================================================
--- sys/x86/isa/atpic.c
+++ sys/x86/isa/atpic.c
@@ -102,7 +102,6 @@
.pic_eoi_source = (eoi), \
.pic_enable_intr = atpic_enable_intr, \
.pic_disable_intr = atpic_disable_intr, \
- .pic_vector = atpic_vector, \
.pic_source_pending = atpic_source_pending, \
.pic_resume = atpic_resume, \
.pic_config_intr = atpic_config_intr, \
@@ -237,7 +236,7 @@
for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) {
if (i == ICU_SLAVEID)
continue;
- intr_register_source(&ai->at_intsrc);
+ intr_register_source(i, &ai->at_intsrc);
}
}
@@ -550,7 +549,7 @@
if ((isr & IRQ_MASK(7)) == 0)
return;
}
- intr_execute_handlers(isrc, frame);
+ intr_execute_handlers(atpic_vector(isrc), isrc, frame);
}
#ifdef DEV_ISA
Index: sys/x86/x86/intr_machdep.c
===================================================================
--- sys/x86/x86/intr_machdep.c
+++ sys/x86/x86/intr_machdep.c
@@ -111,7 +111,7 @@
static int intr_pic_registered(struct pic *pic);
static void intrcnt_setname(const char *name, int index);
static void intrcnt_updatename(struct intsrc *is);
-static void intrcnt_register(struct intsrc *is);
+static void intrcnt_register(u_int vector, struct intsrc *is);
/*
* SYSINIT levels for SI_SUB_INTR:
@@ -219,12 +219,11 @@
* called.
*/
int
-intr_register_source(struct intsrc *isrc)
+intr_register_source(u_int vector, struct intsrc *isrc)
{
- int error, vector;
+ int error;
KASSERT(intr_pic_registered(isrc->is_pic), ("unregistered PIC"));
- vector = isrc->is_pic->pic_vector(isrc);
KASSERT(vector < num_io_irqs, ("IRQ %d too large (%u irqs)", vector,
num_io_irqs));
if (interrupt_sources[vector] != NULL)
@@ -241,7 +240,7 @@
intr_event_destroy(isrc->is_event);
return (EEXIST);
}
- intrcnt_register(isrc);
+ intrcnt_register(vector, isrc);
interrupt_sources[vector] = isrc;
isrc->is_handlers = 0;
sx_xunlock(&intrsrc_lock);
@@ -319,10 +318,10 @@
}
void
-intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame)
+intr_execute_handlers(u_int vector, struct intsrc *isrc,
+ struct trapframe *frame)
{
struct intr_event *ie;
- int vector;
/*
* We count software interrupts when we process them. The
@@ -339,7 +338,6 @@
* XXX: We assume that IRQ 0 is only used for the ISA timer
* device (clk).
*/
- vector = isrc->is_pic->pic_vector(isrc);
if (vector == 0)
clkintr_pending = 1;
@@ -437,7 +435,7 @@
}
static void
-intrcnt_register(struct intsrc *is)
+intrcnt_register(u_int vector, struct intsrc *is)
{
char straystr[MAXCOMLEN + 1];
@@ -446,8 +444,7 @@
MPASS(intrcnt_index + 2 <= nintrcnt);
is->is_index = intrcnt_index;
intrcnt_index += 2;
- snprintf(straystr, MAXCOMLEN + 1, "stray irq%d",
- is->is_pic->pic_vector(is));
+ snprintf(straystr, MAXCOMLEN + 1, "stray irq%u", vector);
intrcnt_updatename(is);
is->is_count = &intrcnt[is->is_index];
intrcnt_setname(straystr, is->is_index + 1);
Index: sys/x86/x86/io_apic.c
===================================================================
--- sys/x86/x86/io_apic.c
+++ sys/x86/x86/io_apic.c
@@ -119,7 +119,6 @@
static void ioapic_eoi_source(struct intsrc *isrc);
static void ioapic_enable_intr(struct intsrc *isrc);
static void ioapic_disable_intr(struct intsrc *isrc);
-static int ioapic_vector(struct intsrc *isrc);
static int ioapic_source_pending(struct intsrc *isrc);
static int ioapic_config_intr(struct intsrc *isrc, enum intr_trigger trig,
enum intr_polarity pol);
@@ -136,7 +135,6 @@
.pic_eoi_source = ioapic_eoi_source,
.pic_enable_intr = ioapic_enable_intr,
.pic_disable_intr = ioapic_disable_intr,
- .pic_vector = ioapic_vector,
.pic_source_pending = ioapic_source_pending,
.pic_suspend = NULL,
.pic_resume = ioapic_resume,
@@ -530,15 +528,6 @@
}
}
-static int
-ioapic_vector(struct intsrc *isrc)
-{
- struct ioapic_intsrc *pin;
-
- pin = (struct ioapic_intsrc *)isrc;
- return (pin->io_irq);
-}
-
static int
ioapic_source_pending(struct intsrc *isrc)
{
@@ -951,7 +940,7 @@
io = (struct ioapic *)pic;
for (i = 0, pin = io->io_pins; i < io->io_numintr; i++, pin++) {
if (pin->io_irq >= 0)
- intr_register_source(&pin->io_intsrc);
+ intr_register_source(pin->io_irq, &pin->io_intsrc);
}
}
Index: sys/x86/x86/local_apic.c
===================================================================
--- sys/x86/x86/local_apic.c
+++ sys/x86/x86/local_apic.c
@@ -1288,14 +1288,15 @@
lapic_handle_intr(int vector, struct trapframe *frame)
{
struct intsrc *isrc;
+ u_int irq;
kasan_mark(frame, sizeof(*frame), sizeof(*frame), 0);
kmsan_mark(&vector, sizeof(vector), KMSAN_STATE_INITED);
kmsan_mark(frame, sizeof(*frame), KMSAN_STATE_INITED);
- isrc = intr_lookup_source(apic_idt_to_irq(PCPU_GET(apic_id),
- vector));
- intr_execute_handlers(isrc, frame);
+ irq = apic_idt_to_irq(PCPU_GET(apic_id), vector);
+ isrc = intr_lookup_source(irq);
+ intr_execute_handlers(irq, isrc, frame);
}
void
Index: sys/x86/x86/msi.c
===================================================================
--- sys/x86/x86/msi.c
+++ sys/x86/x86/msi.c
@@ -132,7 +132,6 @@
static void msi_eoi_source(struct intsrc *isrc);
static void msi_enable_intr(struct intsrc *isrc);
static void msi_disable_intr(struct intsrc *isrc);
-static int msi_vector(struct intsrc *isrc);
static int msi_source_pending(struct intsrc *isrc);
static int msi_config_intr(struct intsrc *isrc, enum intr_trigger trig,
enum intr_polarity pol);
@@ -144,7 +143,6 @@
.pic_eoi_source = msi_eoi_source,
.pic_enable_intr = msi_enable_intr,
.pic_disable_intr = msi_disable_intr,
- .pic_vector = msi_vector,
.pic_source_pending = msi_source_pending,
.pic_suspend = NULL,
.pic_resume = NULL,
@@ -217,14 +215,6 @@
apic_disable_vector(msi->msi_cpu, msi->msi_vector);
}
-static int
-msi_vector(struct intsrc *isrc)
-{
- struct msi_intsrc *msi = (struct msi_intsrc *)isrc;
-
- return (msi->msi_irq);
-}
-
static int
msi_source_pending(struct intsrc *isrc)
{
@@ -371,7 +361,7 @@
msi = malloc(sizeof(struct msi_intsrc), M_MSI, M_WAITOK | M_ZERO);
msi->msi_intsrc.is_pic = &msi_pic;
msi->msi_irq = irq;
- intr_register_source(&msi->msi_intsrc);
+ intr_register_source(irq, &msi->msi_intsrc);
nexus_add_irq(irq);
}
Index: sys/x86/xen/xen_intr.c
===================================================================
--- sys/x86/xen/xen_intr.c
+++ sys/x86/xen/xen_intr.c
@@ -137,7 +137,6 @@
static void xen_intr_eoi_source(struct intsrc *isrc);
static void xen_intr_enable_intr(struct intsrc *isrc);
static void xen_intr_disable_intr(struct intsrc *isrc);
-static int xen_intr_vector(struct intsrc *isrc);
static int xen_intr_source_pending(struct intsrc *isrc);
static int xen_intr_config_intr(struct intsrc *isrc,
enum intr_trigger trig, enum intr_polarity pol);
@@ -152,7 +151,6 @@
.pic_eoi_source = xen_intr_eoi_source,
.pic_enable_intr = xen_intr_enable_intr,
.pic_disable_intr = xen_intr_disable_intr,
- .pic_vector = xen_intr_vector,
.pic_source_pending = xen_intr_source_pending,
.pic_suspend = xen_intr_suspend,
.pic_resume = xen_intr_resume,
@@ -329,7 +327,7 @@
isrc->xi_intsrc.is_pic = &xen_intr_pic;
isrc->xi_vector = vector;
isrc->xi_type = type;
- intr_register_source(&isrc->xi_intsrc);
+ intr_register_source(vector, &isrc->xi_intsrc);
mtx_lock(&xen_intr_isrc_lock);
return (isrc);
@@ -568,7 +566,8 @@
("Received unexpected event on vCPU#%d, event bound to vCPU#%d",
PCPU_GET(cpuid), isrc->xi_cpu));
- intr_execute_handlers(&isrc->xi_intsrc, trap_frame);
+ intr_execute_handlers(isrc->xi_vector,
+ &isrc->xi_intsrc, trap_frame);
/*
* If this is the final port processed,
@@ -789,22 +788,6 @@
evtchn_mask_port(isrc->xi_port);
}
-/**
- * Determine the global interrupt vector number for
- * a Xen interrupt source.
- *
- * \param isrc The interrupt source to query.
- *
- * \return The vector number corresponding to the given interrupt source.
- */
-static int
-xen_intr_vector(struct intsrc *base_isrc)
-{
- struct xenisrc *isrc = (struct xenisrc *)base_isrc;
-
- return (isrc->xi_vector);
-}
-
/**
* Determine whether or not interrupt events are pending on the
* the given interrupt source.

File Metadata

Mime Type
text/plain
Expires
Fri, May 15, 7:53 PM (7 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33096780
Default Alt Text
D35406.id106644.diff (9 KB)

Event Timeline