Module Name:    src
Committed By:   bouyer
Date:           Wed Dec 13 16:30:18 UTC 2017

Modified Files:
        src/sys/arch/x86/isa: isa_machdep.c
        src/sys/arch/x86/x86: intr.c ioapic.c
        src/sys/arch/xen/include: intr.h
        src/sys/arch/xen/x86: pintr.c
        src/sys/arch/xen/xen: evtchn.c

Log Message:
Fixes for physical interrupts on Xen:
- do not cast int * to intr_handle_t *, they're not the same size
- legacy_irq is not always -1 for ioapic interrupts, test pic_type instead
- change irq2port[] to hold (port + 1) so that 0 is an invalid value
- add KASSERTs to make sure vect, port or irq values extracted from arrays are
  valid (or that they are invalid before write)
- for the !ioapic case, we still need to do PHYSDEVOP_ASSIGN_VECTOR and
  bind_pirq_to_evtch().

now XEN3_DOM0 boots again


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/x86/isa/isa_machdep.c
cvs rdiff -u -r1.112 -r1.113 src/sys/arch/x86/x86/intr.c
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/x86/x86/ioapic.c
cvs rdiff -u -r1.44 -r1.45 src/sys/arch/xen/include/intr.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/xen/x86/pintr.c
cvs rdiff -u -r1.78 -r1.79 src/sys/arch/xen/xen/evtchn.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/isa/isa_machdep.c
diff -u src/sys/arch/x86/isa/isa_machdep.c:1.37 src/sys/arch/x86/isa/isa_machdep.c:1.38
--- src/sys/arch/x86/isa/isa_machdep.c:1.37	Sat Nov  4 14:56:48 2017
+++ src/sys/arch/x86/isa/isa_machdep.c	Wed Dec 13 16:30:18 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: isa_machdep.c,v 1.37 2017/11/04 14:56:48 cherry Exp $	*/
+/*	$NetBSD: isa_machdep.c,v 1.38 2017/12/13 16:30:18 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.37 2017/11/04 14:56:48 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: isa_machdep.c,v 1.38 2017/12/13 16:30:18 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -210,8 +210,8 @@ isa_intr_establish_xname(isa_chipset_tag
 {
 	struct pic *pic;
 	int pin;
-#if NIOAPIC > 0
 	intr_handle_t mpih = 0;
+#if NIOAPIC > 0
 	struct ioapic_softc *ioapic = NULL;
 #endif
 
@@ -245,7 +245,7 @@ isa_intr_establish_xname(isa_chipset_tag
 
 	mpih |= APIC_IRQ_LEGACY_IRQ(irq);
 
-	evtch = xen_pirq_alloc((intr_handle_t *)&mpih, type); /* XXX: legacy - xen just tosses irq back at us */
+	evtch = xen_pirq_alloc(&mpih, type); /* XXX: legacy - xen just tosses irq back at us */
 	if (evtch == -1)
 		return NULL;
 #if NIOAPIC > 0

Index: src/sys/arch/x86/x86/intr.c
diff -u src/sys/arch/x86/x86/intr.c:1.112 src/sys/arch/x86/x86/intr.c:1.113
--- src/sys/arch/x86/x86/intr.c:1.112	Sat Nov 11 21:05:58 2017
+++ src/sys/arch/x86/x86/intr.c	Wed Dec 13 16:30:18 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.112 2017/11/11 21:05:58 riastradh Exp $	*/
+/*	$NetBSD: intr.c,v 1.113 2017/12/13 16:30:18 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -133,7 +133,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.112 2017/11/11 21:05:58 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.113 2017/12/13 16:30:18 bouyer Exp $");
 
 #include "opt_intrdebug.h"
 #include "opt_multiprocessor.h"
@@ -1259,6 +1259,7 @@ intr_establish_xname(int legacy_irq, str
 
 #if NPCI > 0 || NISA > 0
 	struct pintrhand *pih;
+	intr_handle_t irq;
 	int evtchn;
 	char evname[16];
 
@@ -1267,12 +1268,12 @@ intr_establish_xname(int legacy_irq, str
 	KASSERTMSG(!(legacy_irq == -1 && pic == &i8259_pic),
 	    "non-legacy IRQon i8259 ");
 
-	if (legacy_irq == -1) {
+	if (pic->pic_type != PIC_I8259) {
 #if NIOAPIC > 0
 		/* will do interrupts via I/O APIC */
-		legacy_irq = APIC_INT_VIA_APIC;
-		legacy_irq |= pic->pic_apicid << APIC_INT_APIC_SHIFT;
-		legacy_irq |= pin << APIC_INT_PIN_SHIFT;
+		irq = APIC_INT_VIA_APIC;
+		irq |= pic->pic_apicid << APIC_INT_APIC_SHIFT;
+		irq |= pin << APIC_INT_PIN_SHIFT;
 		snprintf(evname, sizeof(evname), "%s pin %d",
 		    pic->pic_name, pin);
 #else /* NIOAPIC */
@@ -1280,10 +1281,11 @@ intr_establish_xname(int legacy_irq, str
 #endif /* NIOAPIC */
 	} else {
 		snprintf(evname, sizeof(evname), "irq%d", legacy_irq);
+		irq = legacy_irq;
 	}
 
-	evtchn = xen_pirq_alloc((intr_handle_t *)&legacy_irq, type);
-	pih = pirq_establish(legacy_irq & 0xff, evtchn, handler, arg, level,
+	evtchn = xen_pirq_alloc(&irq, type);
+	pih = pirq_establish(irq & 0xff, evtchn, handler, arg, level,
 	    evname);
 	pih->pic_type = pic->pic_type;
 	return pih;

Index: src/sys/arch/x86/x86/ioapic.c
diff -u src/sys/arch/x86/x86/ioapic.c:1.55 src/sys/arch/x86/x86/ioapic.c:1.56
--- src/sys/arch/x86/x86/ioapic.c:1.55	Sun Nov 26 11:37:10 2017
+++ src/sys/arch/x86/x86/ioapic.c	Wed Dec 13 16:30:18 2017
@@ -1,4 +1,4 @@
-/* 	$NetBSD: ioapic.c,v 1.55 2017/11/26 11:37:10 maxv Exp $	*/
+/* 	$NetBSD: ioapic.c,v 1.56 2017/12/13 16:30:18 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2009 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.55 2017/11/26 11:37:10 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.56 2017/12/13 16:30:18 bouyer Exp $");
 
 #include "opt_ddb.h"
 
@@ -575,10 +575,13 @@ ioapic_addroute(struct pic *pic, struct 
 
 	int port, irq;
 	irq = vect2irq[idtvec];
+	KASSERT(irq != 0);
 	port = bind_pirq_to_evtch(irq);
 	KASSERT(port < NR_EVENT_CHANNELS);
+	KASSERT(port >= 0);
 
-	irq2port[irq] = port;
+	KASSERT(irq2port[irq] == 0);
+	irq2port[irq] = port + 1;
 
 	xen_atomic_set_bit(&ci->ci_evtmask[0], port);
 #endif
@@ -595,7 +598,6 @@ ioapic_delroute(struct pic *pic, struct 
 #if defined(XEN)
 	int port, irq;
 	irq = vect2irq[idtvec];
-	port = bind_pirq_to_evtch(irq);
 	port = unbind_pirq_from_evtch(irq);
 
 	KASSERT(port < NR_EVENT_CHANNELS);

Index: src/sys/arch/xen/include/intr.h
diff -u src/sys/arch/xen/include/intr.h:1.44 src/sys/arch/xen/include/intr.h:1.45
--- src/sys/arch/xen/include/intr.h:1.44	Sat Nov  4 14:56:48 2017
+++ src/sys/arch/xen/include/intr.h	Wed Dec 13 16:30:18 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.44 2017/11/04 14:56:48 cherry Exp $	*/
+/*	$NetBSD: intr.h,v 1.45 2017/12/13 16:30:18 bouyer Exp $	*/
 /*	NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp	*/
 
 /*-
@@ -63,7 +63,7 @@ struct evtsource {
 extern struct intrstub xenev_stubs[];
 extern int irq2vect[256];
 extern int vect2irq[256];
-extern int irq2port[NR_EVENT_CHANNELS];
+extern int irq2port[NR_EVENT_CHANNELS]; /* actually port + 1, so that 0 is invaid */
 
 #ifdef MULTIPROCESSOR
 int xen_intr_biglock_wrapper(void *);

Index: src/sys/arch/xen/x86/pintr.c
diff -u src/sys/arch/xen/x86/pintr.c:1.1 src/sys/arch/xen/x86/pintr.c:1.2
--- src/sys/arch/xen/x86/pintr.c:1.1	Sat Nov  4 09:22:16 2017
+++ src/sys/arch/xen/x86/pintr.c	Wed Dec 13 16:30:18 2017
@@ -103,7 +103,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pintr.c,v 1.1 2017/11/04 09:22:16 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pintr.c,v 1.2 2017/12/13 16:30:18 bouyer Exp $");
 
 #include "opt_multiprocessor.h"
 #include "opt_xen.h"
@@ -142,7 +142,7 @@ struct intrstub ioapic_level_stubs[MAX_I
 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 irq2port[NR_EVENT_CHANNELS] = {0}; /* actually port + 1, so that 0 is invaid */
 int irq2vect[256] = {0};
 int vect2irq[256] = {0};
 #endif /* NIOAPIC */
@@ -162,6 +162,7 @@ int vect2irq[256] = {0};
 int
 xen_pirq_alloc(intr_handle_t *pirq, int type)
 {
+	physdev_op_t op;
 	int irq = *pirq;
 #if NIOAPIC > 0
 	extern struct cpu_info phycpu_info_primary; /* XXX */
@@ -180,7 +181,6 @@ xen_pirq_alloc(intr_handle_t *pirq, int 
 	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];
@@ -199,15 +199,33 @@ retry:
 					panic("PHYSDEVOP_ASSIGN_VECTOR irq %d", irq);
 				goto retry;
 			}
+			KASSERT(irq2vect[irq] == 0);
 			irq2vect[irq] = op.u.irq_op.vector;
+			KASSERT(vect2irq[op.u.irq_op.vector] == 0);
 			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;
-	}
+	} else
 #endif /* NIOAPIC */
-	return irq2port[irq];
+	{
+		if (irq2port[irq] == 0) {
+			op.cmd = PHYSDEVOP_ASSIGN_VECTOR;
+			op.u.irq_op.irq = irq;
+			if (HYPERVISOR_physdev_op(&op) < 0) {
+				panic("PHYSDEVOP_ASSIGN_VECTOR irq %d", irq);
+			}
+			KASSERT(irq2vect[irq] == 0);
+			irq2vect[irq] = op.u.irq_op.vector;
+			KASSERT(vect2irq[op.u.irq_op.vector] == 0);
+			vect2irq[op.u.irq_op.vector] = irq;
+			KASSERT(irq2port[irq] == 0);
+			irq2port[irq] = bind_pirq_to_evtch(irq) + 1;
+		}
+	}
+	KASSERT(irq2port[irq] > 0);
+	return (irq2port[irq] - 1);
 }
 #endif /* defined(DOM0OPS) || NPCI > 0 */

Index: src/sys/arch/xen/xen/evtchn.c
diff -u src/sys/arch/xen/xen/evtchn.c:1.78 src/sys/arch/xen/xen/evtchn.c:1.79
--- src/sys/arch/xen/xen/evtchn.c:1.78	Sat Nov 11 17:02:53 2017
+++ src/sys/arch/xen/xen/evtchn.c	Wed Dec 13 16:30:18 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: evtchn.c,v 1.78 2017/11/11 17:02:53 riastradh Exp $	*/
+/*	$NetBSD: evtchn.c,v 1.79 2017/12/13 16:30:18 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -54,7 +54,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.78 2017/11/11 17:02:53 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.79 2017/12/13 16:30:18 bouyer Exp $");
 
 #include "opt_xen.h"
 #include "isa.h"
@@ -745,6 +745,8 @@ pirq_establish(int pirq, int evtch, int 
 		return NULL;
 	}
 
+	KASSERT(evtch > 0);
+
 	ih->pirq = pirq;
 	ih->evtch = evtch;
 	ih->func = func;

Reply via email to