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);
-static int xen_intr_assign_cpu(struct intsrc *isrc, u_int apic_id);
+static int xen_intr_assign_cpu(struct intsrc *isrc, u_int to_cpu);
+static int xen_pic_assign_cpu(struct intsrc *isrc, u_int apic_id);
static void xen_intr_pirq_enable_source(struct intsrc *isrc);
static void xen_intr_pirq_disable_source(struct intsrc *isrc, int eoi);
.pic_suspend = xen_intr_suspend,
.pic_resume = xen_intr_resume,
.pic_config_intr = xen_intr_config_intr,
- .pic_assign_cpu = xen_intr_assign_cpu
+ .pic_assign_cpu = xen_pic_assign_cpu
};
/**
.pic_vector = xen_intr_vector,
.pic_source_pending = xen_intr_source_pending,
.pic_config_intr = xen_intr_pirq_config_intr,
- .pic_assign_cpu = xen_intr_assign_cpu
+ .pic_assign_cpu = xen_pic_assign_cpu
};
static struct mtx xen_intr_isrc_lock;
{
#ifdef SMP
int cpu = isrc->xi_cpu;
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ int vcpu_id = cpu_to_vcpu_id(cpu);
int error;
struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
isrc->xi_cpu = 0;
xen_intr_port_to_isrc[bind_ipi.port] = isrc;
- error = xen_intr_assign_cpu(&isrc->xi_intsrc,
- cpu_apic_ids[cpu]);
+ error = xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
if (error)
panic("unable to bind xen IPI to CPU#%d: %d",
cpu, error);
xen_rebind_virq(struct xenisrc *isrc)
{
int cpu = isrc->xi_cpu;
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ int vcpu_id = cpu_to_vcpu_id(cpu);
int error;
struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq,
.vcpu = vcpu_id };
xen_intr_port_to_isrc[bind_virq.port] = isrc;
#ifdef SMP
- error = xen_intr_assign_cpu(&isrc->xi_intsrc,
- cpu_apic_ids[cpu]);
+ error = xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
if (error)
panic("unable to bind xen VIRQ#%d to CPU#%d: %d",
isrc->xi_virq, cpu, error);
* Configure CPU affinity for interrupt source event delivery.
*
* \param isrc The interrupt source to configure.
- * \param apic_id The apic id of the CPU for handling future events.
+ * \param to_cpu The id of the CPU for handling future events.
*
* \returns 0 if successful, otherwise an errno.
*/
static int
-xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
+xen_intr_assign_cpu(struct intsrc *base_isrc, u_int to_cpu)
{
#ifdef SMP
struct evtchn_bind_vcpu bind_vcpu;
struct xenisrc *isrc;
- u_int to_cpu, vcpu_id;
- int error, masked;
+ u_int vcpu_id = cpu_to_vcpu_id(to_cpu);
+ int error;
if (xen_vector_callback_enabled == 0)
return (EOPNOTSUPP);
- to_cpu = apic_cpuid(apic_id);
- vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id;
xen_intr_intrcnt_add(to_cpu);
mtx_lock(&xen_intr_isrc_lock);
#endif
}
+/* Wrapper of xen_intr_assign_cpu to use as pic callbacks */
+static int
+xen_pic_assign_cpu(struct intsrc *isrc, u_int apic_id)
+{
+ return xen_intr_assign_cpu(isrc, apic_cpuid(apic_id));
+}
+
/*------------------- Virtual Interrupt Source PIC Functions -----------------*/
/*
* Mask a level triggered interrupt source.
driver_filter_t filter, driver_intr_t handler, void *arg,
enum intr_type flags, xen_intr_handle_t *port_handlep)
{
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ int vcpu_id = cpu_to_vcpu_id(cpu);
struct xenisrc *isrc;
struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id };
int error;
* masks manually so events can't fire on the wrong cpu
* during AP startup.
*/
- xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]);
+ xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
}
#endif
xen_intr_handle_t *port_handlep)
{
#ifdef SMP
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ int vcpu_id = cpu_to_vcpu_id(cpu);
struct xenisrc *isrc;
struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
int error;
* masks manually so events can't fire on the wrong cpu
* during AP startup.
*/
- xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]);
+ xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
}
/*