From 38dee817745e8ed37aa28248d87b6b6404a7a2e3 Mon Sep 17 00:00:00 2001
From: Julien Grall <julien.grall@linaro.org>
Date: Sat, 19 Apr 2014 22:32:01 +0100
Subject: [PATCH 30/48] xen/intr: Introduce xen_pic_assign_cpu

---
 sys/xen/xen_intr.c | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/sys/xen/xen_intr.c b/sys/xen/xen_intr.c
index 3bd292e..b7dac73 100644
--- a/sys/xen/xen_intr.c
+++ b/sys/xen/xen_intr.c
@@ -144,7 +144,8 @@ 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);
-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);
@@ -168,7 +169,7 @@ struct pic xen_intr_pic = {
 	.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
 };
 
 /**
@@ -184,7 +185,7 @@ struct pic xen_intr_pirq_pic = {
 	.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;
@@ -665,7 +666,7 @@ xen_rebind_ipi(struct xenisrc *isrc)
 {
 #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 };
 
@@ -678,8 +679,7 @@ xen_rebind_ipi(struct xenisrc *isrc)
 	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);
@@ -694,7 +694,7 @@ static void
 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 };
@@ -709,8 +709,7 @@ xen_rebind_virq(struct xenisrc *isrc)
 	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);
@@ -840,26 +839,24 @@ xen_intr_config_intr(struct intsrc *isrc, enum intr_trigger trig,
  * 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;
 
 #ifdef XENHVM
 	if (xen_vector_callback_enabled == 0)
 		return (EOPNOTSUPP);
 #endif
 
-	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);
@@ -910,6 +907,13 @@ out:
 #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.
@@ -1250,7 +1254,7 @@ xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu,
     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;
@@ -1293,7 +1297,7 @@ xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu,
 		 * 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
 
@@ -1313,7 +1317,7 @@ xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu,
     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;
@@ -1353,7 +1357,7 @@ xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu,
 		 * 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);
 	}
 
 	/*
-- 
2.1.0

