Deleted Added
full compact
xen_intr.c (255726) xen_intr.c (256073)
1/******************************************************************************
2 * xen_intr.c
3 *
4 * Xen event and interrupt services for x86 PV and HVM guests.
5 *
6 * Copyright (c) 2002-2005, K A Fraser
7 * Copyright (c) 2005, Intel Corporation <xiaofeng.ling@intel.com>
8 * Copyright (c) 2012, Spectra Logic Corporation

--- 16 unchanged lines hidden (view full) ---

25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29 * IN THE SOFTWARE.
30 */
31
32#include <sys/cdefs.h>
1/******************************************************************************
2 * xen_intr.c
3 *
4 * Xen event and interrupt services for x86 PV and HVM guests.
5 *
6 * Copyright (c) 2002-2005, K A Fraser
7 * Copyright (c) 2005, Intel Corporation <xiaofeng.ling@intel.com>
8 * Copyright (c) 2012, Spectra Logic Corporation

--- 16 unchanged lines hidden (view full) ---

25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29 * IN THE SOFTWARE.
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: head/sys/x86/xen/xen_intr.c 255726 2013-09-20 05:06:03Z gibbs $");
33__FBSDID("$FreeBSD: head/sys/x86/xen/xen_intr.c 256073 2013-10-05 23:11:01Z gibbs $");
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/bus.h>
38#include <sys/malloc.h>
39#include <sys/kernel.h>
40#include <sys/limits.h>
41#include <sys/lock.h>

--- 564 unchanged lines hidden (view full) ---

606{
607}
608
609static void
610xen_rebind_ipi(struct xenisrc *isrc)
611{
612#ifdef SMP
613 int cpu = isrc->xi_cpu;
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/bus.h>
38#include <sys/malloc.h>
39#include <sys/kernel.h>
40#include <sys/limits.h>
41#include <sys/lock.h>

--- 564 unchanged lines hidden (view full) ---

606{
607}
608
609static void
610xen_rebind_ipi(struct xenisrc *isrc)
611{
612#ifdef SMP
613 int cpu = isrc->xi_cpu;
614 int acpi_id = pcpu_find(cpu)->pc_acpi_id;
614 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
615 int error;
615 int error;
616 struct evtchn_bind_ipi bind_ipi = { .vcpu = acpi_id };
616 struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
617
618 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
619 &bind_ipi);
620 if (error != 0)
621 panic("unable to rebind xen IPI: %d", error);
622
623 isrc->xi_port = bind_ipi.port;
624 isrc->xi_cpu = 0;

--- 10 unchanged lines hidden (view full) ---

635 panic("Resume IPI event channel on UP");
636#endif
637}
638
639static void
640xen_rebind_virq(struct xenisrc *isrc)
641{
642 int cpu = isrc->xi_cpu;
617
618 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
619 &bind_ipi);
620 if (error != 0)
621 panic("unable to rebind xen IPI: %d", error);
622
623 isrc->xi_port = bind_ipi.port;
624 isrc->xi_cpu = 0;

--- 10 unchanged lines hidden (view full) ---

635 panic("Resume IPI event channel on UP");
636#endif
637}
638
639static void
640xen_rebind_virq(struct xenisrc *isrc)
641{
642 int cpu = isrc->xi_cpu;
643 int acpi_id = pcpu_find(cpu)->pc_acpi_id;
643 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
644 int error;
645 struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq,
644 int error;
645 struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq,
646 .vcpu = acpi_id };
646 .vcpu = vcpu_id };
647
648 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
649 &bind_virq);
650 if (error != 0)
651 panic("unable to rebind xen VIRQ#%d: %d", isrc->xi_virq, error);
652
653 isrc->xi_port = bind_virq.port;
654 isrc->xi_cpu = 0;

--- 136 unchanged lines hidden (view full) ---

791 * \returns 0 if successful, otherwise an errno.
792 */
793static int
794xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
795{
796#ifdef SMP
797 struct evtchn_bind_vcpu bind_vcpu;
798 struct xenisrc *isrc;
647
648 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
649 &bind_virq);
650 if (error != 0)
651 panic("unable to rebind xen VIRQ#%d: %d", isrc->xi_virq, error);
652
653 isrc->xi_port = bind_virq.port;
654 isrc->xi_cpu = 0;

--- 136 unchanged lines hidden (view full) ---

791 * \returns 0 if successful, otherwise an errno.
792 */
793static int
794xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
795{
796#ifdef SMP
797 struct evtchn_bind_vcpu bind_vcpu;
798 struct xenisrc *isrc;
799 u_int to_cpu, acpi_id;
799 u_int to_cpu, vcpu_id;
800 int error;
801
802#ifdef XENHVM
803 if (xen_vector_callback_enabled == 0)
804 return (EOPNOTSUPP);
805#endif
806
807 to_cpu = apic_cpuid(apic_id);
800 int error;
801
802#ifdef XENHVM
803 if (xen_vector_callback_enabled == 0)
804 return (EOPNOTSUPP);
805#endif
806
807 to_cpu = apic_cpuid(apic_id);
808 acpi_id = pcpu_find(to_cpu)->pc_acpi_id;
808 vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id;
809 xen_intr_intrcnt_add(to_cpu);
810
811 mtx_lock(&xen_intr_isrc_lock);
812 isrc = (struct xenisrc *)base_isrc;
813 if (!is_valid_evtchn(isrc->xi_port)) {
814 mtx_unlock(&xen_intr_isrc_lock);
815 return (EINVAL);
816 }

--- 8 unchanged lines hidden (view full) ---

825 evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
826 isrc->xi_cpu = to_cpu;
827 evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port);
828 mtx_unlock(&xen_intr_isrc_lock);
829 return (0);
830 }
831
832 bind_vcpu.port = isrc->xi_port;
809 xen_intr_intrcnt_add(to_cpu);
810
811 mtx_lock(&xen_intr_isrc_lock);
812 isrc = (struct xenisrc *)base_isrc;
813 if (!is_valid_evtchn(isrc->xi_port)) {
814 mtx_unlock(&xen_intr_isrc_lock);
815 return (EINVAL);
816 }

--- 8 unchanged lines hidden (view full) ---

825 evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
826 isrc->xi_cpu = to_cpu;
827 evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port);
828 mtx_unlock(&xen_intr_isrc_lock);
829 return (0);
830 }
831
832 bind_vcpu.port = isrc->xi_port;
833 bind_vcpu.vcpu = acpi_id;
833 bind_vcpu.vcpu = vcpu_id;
834
835 /*
836 * Allow interrupts to be fielded on the new VCPU before
837 * we ask the hypervisor to deliver them there.
838 */
839 evtchn_cpu_unmask_port(to_cpu, isrc->xi_port);
840 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu);
841 if (isrc->xi_cpu != to_cpu) {

--- 216 unchanged lines hidden (view full) ---

1058 return (0);
1059}
1060
1061int
1062xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu,
1063 driver_filter_t filter, driver_intr_t handler, void *arg,
1064 enum intr_type flags, xen_intr_handle_t *port_handlep)
1065{
834
835 /*
836 * Allow interrupts to be fielded on the new VCPU before
837 * we ask the hypervisor to deliver them there.
838 */
839 evtchn_cpu_unmask_port(to_cpu, isrc->xi_port);
840 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu);
841 if (isrc->xi_cpu != to_cpu) {

--- 216 unchanged lines hidden (view full) ---

1058 return (0);
1059}
1060
1061int
1062xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu,
1063 driver_filter_t filter, driver_intr_t handler, void *arg,
1064 enum intr_type flags, xen_intr_handle_t *port_handlep)
1065{
1066 int acpi_id = pcpu_find(cpu)->pc_acpi_id;
1066 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
1067 struct xenisrc *isrc;
1067 struct xenisrc *isrc;
1068 struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = acpi_id };
1068 struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id };
1069 int error;
1070
1071 /* Ensure the target CPU is ready to handle evtchn interrupts. */
1072 xen_intr_intrcnt_add(cpu);
1073
1074 isrc = NULL;
1075 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &bind_virq);
1076 if (error != 0) {

--- 44 unchanged lines hidden (view full) ---

1121}
1122
1123int
1124xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu,
1125 driver_filter_t filter, enum intr_type flags,
1126 xen_intr_handle_t *port_handlep)
1127{
1128#ifdef SMP
1069 int error;
1070
1071 /* Ensure the target CPU is ready to handle evtchn interrupts. */
1072 xen_intr_intrcnt_add(cpu);
1073
1074 isrc = NULL;
1075 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &bind_virq);
1076 if (error != 0) {

--- 44 unchanged lines hidden (view full) ---

1121}
1122
1123int
1124xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu,
1125 driver_filter_t filter, enum intr_type flags,
1126 xen_intr_handle_t *port_handlep)
1127{
1128#ifdef SMP
1129 int acpi_id = pcpu_find(cpu)->pc_acpi_id;
1129 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
1130 struct xenisrc *isrc;
1130 struct xenisrc *isrc;
1131 struct evtchn_bind_ipi bind_ipi = { .vcpu = acpi_id };
1131 struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
1132 int error;
1133
1134 /* Ensure the target CPU is ready to handle evtchn interrupts. */
1135 xen_intr_intrcnt_add(cpu);
1136
1137 isrc = NULL;
1138 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, &bind_ipi);
1139 if (error != 0) {

--- 102 unchanged lines hidden ---
1132 int error;
1133
1134 /* Ensure the target CPU is ready to handle evtchn interrupts. */
1135 xen_intr_intrcnt_add(cpu);
1136
1137 isrc = NULL;
1138 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, &bind_ipi);
1139 if (error != 0) {

--- 102 unchanged lines hidden ---