Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/xen On XEN dom0, the function xen/x86/intr.c:xen_in...



details:   https://anonhg.NetBSD.org/src/rev/3817ff784509
branches:  trunk
changeset: 827591:3817ff784509
user:      cherry <cherry%NetBSD.org@localhost>
date:      Sat Nov 04 09:22:16 2017 +0000

description:
On XEN dom0, the function xen/x86/intr.c:xen_intr_map() is used to map
hardware interrupts to XEN callbacks called 'events'. This function
combines both the allocation and the binding.

This change is the first part of breaking up that combination into
xen_pirq_alloc() and the binding will happen as part of the
pic_addroute() callback of a new pseudo PIC_XEN

This code will be added later on.

diffstat:

 sys/arch/xen/conf/files.xen |    3 +-
 sys/arch/xen/include/intr.h |    9 +-
 sys/arch/xen/x86/intr.c     |   13 +--
 sys/arch/xen/x86/pintr.c    |  213 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 224 insertions(+), 14 deletions(-)

diffs (296 lines):

diff -r 0788637e0e19 -r 3817ff784509 sys/arch/xen/conf/files.xen
--- a/sys/arch/xen/conf/files.xen       Sat Nov 04 08:58:30 2017 +0000
+++ b/sys/arch/xen/conf/files.xen       Sat Nov 04 09:22:16 2017 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.xen,v 1.159 2017/11/04 08:55:50 cherry Exp $
+#      $NetBSD: files.xen,v 1.160 2017/11/04 09:22:16 cherry Exp $
 #      NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp 
 #      NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp 
 
@@ -138,6 +138,7 @@
 file   arch/x86/x86/bus_space.c        machdep
 file   arch/xen/x86/consinit.c         machdep
 file   arch/x86/x86/identcpu.c         machdep
+file   arch/xen/x86/pintr.c            machdep & dom0ops
 file   arch/xen/x86/intr.c             machdep
 file   arch/xen/x86/xen_ipi.c          multiprocessor
 file   arch/x86/x86/idt.c              machdep
diff -r 0788637e0e19 -r 3817ff784509 sys/arch/xen/include/intr.h
--- a/sys/arch/xen/include/intr.h       Sat Nov 04 08:58:30 2017 +0000
+++ b/sys/arch/xen/include/intr.h       Sat Nov 04 09:22:16 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: intr.h,v 1.42 2017/07/16 14:02:48 cherry Exp $ */
+/*     $NetBSD: intr.h,v 1.43 2017/11/04 09:22:16 cherry Exp $ */
 /*     NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp       */
 
 /*-
@@ -61,7 +61,9 @@
 };
 
 extern struct intrstub xenev_stubs[];
-
+extern int irq2vect[256];
+extern int vect2irq[256];
+extern int irq2port[NR_EVENT_CHANNELS];
 
 #ifdef MULTIPROCESSOR
 int xen_intr_biglock_wrapper(void *);
@@ -70,6 +72,9 @@
 int xen_intr_map(int *, int);
 struct pic *intr_findpic(int);
 void intr_add_pcibus(struct pcibus_attach_args *);
+#if defined(DOM0OPS) || NPCI > 0
+int xen_pirq_alloc(intr_handle_t *, int);
+#endif /* defined(DOM0OPS) || NPCI > 0 */
 
 #ifdef MULTIPROCESSOR
 void xen_ipi_init(void);
diff -r 0788637e0e19 -r 3817ff784509 sys/arch/xen/x86/intr.c
--- a/sys/arch/xen/x86/intr.c   Sat Nov 04 08:58:30 2017 +0000
+++ b/sys/arch/xen/x86/intr.c   Sat Nov 04 09:22:16 2017 +0000
@@ -103,7 +103,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.32 2017/07/16 06:14:24 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.33 2017/11/04 09:22:16 cherry Exp $");
 
 #include "opt_multiprocessor.h"
 #include "opt_xen.h"
@@ -130,18 +130,9 @@
 #include "acpica.h"
 #include "ioapic.h"
 #include "opt_mpbios.h"
-/* for x86/i8259.c */
-struct intrstub i8259_stubs[NUM_LEGACY_IRQS] = {{0,0}};
+
 #if NIOAPIC > 0
-/* for x86/ioapic.c */
-struct intrstub ioapic_edge_stubs[MAX_INTR_SOURCES] = {{0,0}};
-struct intrstub ioapic_level_stubs[MAX_INTR_SOURCES] = {{0,0}};
-struct intrstub x2apic_edge_stubs[MAX_INTR_SOURCES] = {{0,0}};
-struct intrstub x2apic_level_stubs[MAX_INTR_SOURCES] = {{0,0}};
-
 #include <machine/i82093var.h>
-int irq2vect[256] = {0};
-int vect2irq[256] = {0};
 #endif /* NIOAPIC */
 #if NACPICA > 0
 #include <machine/mpconfig.h>
diff -r 0788637e0e19 -r 3817ff784509 sys/arch/xen/x86/pintr.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/xen/x86/pintr.c  Sat Nov 04 09:22:16 2017 +0000
@@ -0,0 +1,213 @@
+/*     NetBSD: intr.c,v 1.15 2004/04/10 14:49:55 kochi Exp     */
+
+/*
+ * Copyright 2002 (c) Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Frank van der Linden for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)isa.c       7.2 (Berkeley) 5/13/91
+ */
+/*-
+ * Copyright (c) 1993, 1994 Charles Hannum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)isa.c       7.2 (Berkeley) 5/13/91
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: pintr.c,v 1.1 2017/11/04 09:22:16 cherry Exp $");
+
+#include "opt_multiprocessor.h"
+#include "opt_xen.h"
+#include "isa.h"
+#include "pci.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/syslog.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/cpu.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/i8259.h>
+#include <machine/pio.h>
+#include <xen/evtchn.h>
+#include <xen/intr.h>
+
+#include "acpica.h"
+#include "ioapic.h"
+#include "opt_mpbios.h"
+
+#if NIOAPIC > 0
+/* XXX: todo - compat with lapic.c and XEN for x2apic */
+bool x2apic_mode __read_mostly = false;
+/* for x86/i8259.c */
+struct intrstub i8259_stubs[NUM_LEGACY_IRQS] = {{0,0}};
+/* for x86/ioapic.c */
+struct intrstub ioapic_edge_stubs[MAX_INTR_SOURCES] = {{0,0}};
+struct intrstub ioapic_level_stubs[MAX_INTR_SOURCES] = {{0,0}};
+struct intrstub x2apic_edge_stubs[MAX_INTR_SOURCES] = {{0,0}};
+struct intrstub x2apic_level_stubs[MAX_INTR_SOURCES] = {{0,0}};
+#include <machine/i82093var.h>
+int irq2port[NR_EVENT_CHANNELS] = {0};
+int irq2vect[256] = {0};
+int vect2irq[256] = {0};
+#endif /* NIOAPIC */
+#if NACPICA > 0
+#include <machine/mpconfig.h>
+#include <machine/mpacpi.h>
+#endif
+#ifdef MPBIOS
+#include <machine/mpbiosvar.h>
+#endif
+
+#if NPCI > 0
+#include <dev/pci/ppbreg.h>
+#endif
+
+#if defined(DOM0OPS) || NPCI > 0
+int
+xen_pirq_alloc(intr_handle_t *pirq, int type)
+{
+       int irq = *pirq;
+#if NIOAPIC > 0
+       extern struct cpu_info phycpu_info_primary; /* XXX */
+       /*
+        * The hypervisor has already allocated vectors and IRQs for the
+        * devices. Reusing the same IRQ doesn't work because as we bind
+        * them for each devices, we can't then change the route entry
+        * of the next device if this one used this IRQ. The easiest is
+        * to allocate IRQs top-down, starting with a high number.
+        * 250 and 230 have been tried, but got rejected by Xen.
+        *
+        * Xen 3.5 also rejects 200. Try out all values until Xen accepts
+        * or none is available.
+        */
+       static int xen_next_irq = 200;
+       struct ioapic_softc *ioapic = ioapic_find(APIC_IRQ_APIC(*pirq));
+       struct pic *pic = &ioapic->sc_pic;
+       int pin = APIC_IRQ_PIN(*pirq);
+       physdev_op_t op;
+
+       if (*pirq & APIC_INT_VIA_APIC) {
+               irq = vect2irq[ioapic->sc_pins[pin].ip_vector];
+               if (ioapic->sc_pins[pin].ip_vector == 0 || irq == 0) {
+                       /* allocate IRQ */
+                       irq = APIC_IRQ_LEGACY_IRQ(*pirq);
+                       if (irq <= 0 || irq > 15)
+                               irq = xen_next_irq--;
+retry:
+                       /* allocate vector and route interrupt */
+                       op.cmd = PHYSDEVOP_ASSIGN_VECTOR;
+                       op.u.irq_op.irq = irq;
+                       if (HYPERVISOR_physdev_op(&op) < 0) {
+                               irq = xen_next_irq--;
+                               if (xen_next_irq == 15)
+                                       panic("PHYSDEVOP_ASSIGN_VECTOR irq %d", irq);
+                               goto retry;
+                       }
+                       irq2vect[irq] = op.u.irq_op.vector;
+                       vect2irq[op.u.irq_op.vector] = irq;
+                       pic->pic_addroute(pic, &phycpu_info_primary, pin,
+                           op.u.irq_op.vector, type);
+               }
+               *pirq &= ~0xff;
+               *pirq |= irq;
+       }
+#endif /* NIOAPIC */
+       return irq2port[irq];
+}
+#endif /* defined(DOM0OPS) || NPCI > 0 */



Home | Main Index | Thread Index | Old Index