Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Fixes for physical interrupts on Xen:
details: https://anonhg.NetBSD.org/src/rev/4d836cb48a5e
branches: trunk
changeset: 358131:4d836cb48a5e
user: bouyer <bouyer%NetBSD.org@localhost>
date: Wed Dec 13 16:30:18 2017 +0000
description:
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
diffstat:
sys/arch/x86/isa/isa_machdep.c | 8 ++++----
sys/arch/x86/x86/intr.c | 18 ++++++++++--------
sys/arch/x86/x86/ioapic.c | 10 ++++++----
sys/arch/xen/include/intr.h | 4 ++--
sys/arch/xen/x86/pintr.c | 28 +++++++++++++++++++++++-----
sys/arch/xen/xen/evtchn.c | 6 ++++--
6 files changed, 49 insertions(+), 25 deletions(-)
diffs (253 lines):
diff -r cccf81851e6a -r 4d836cb48a5e sys/arch/x86/isa/isa_machdep.c
--- a/sys/arch/x86/isa/isa_machdep.c Wed Dec 13 13:52:13 2017 +0000
+++ b/sys/arch/x86/isa/isa_machdep.c Wed Dec 13 16:30:18 2017 +0000
@@ -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 @@
{
struct pic *pic;
int pin;
+ intr_handle_t mpih = 0;
#if NIOAPIC > 0
- intr_handle_t mpih = 0;
struct ioapic_softc *ioapic = NULL;
#endif
@@ -245,7 +245,7 @@
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
diff -r cccf81851e6a -r 4d836cb48a5e sys/arch/x86/x86/intr.c
--- a/sys/arch/x86/x86/intr.c Wed Dec 13 13:52:13 2017 +0000
+++ b/sys/arch/x86/x86/intr.c Wed Dec 13 16:30:18 2017 +0000
@@ -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 @@
#if NPCI > 0 || NISA > 0
struct pintrhand *pih;
+ intr_handle_t irq;
int evtchn;
char evname[16];
@@ -1267,12 +1268,12 @@
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 @@
#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;
diff -r cccf81851e6a -r 4d836cb48a5e sys/arch/x86/x86/ioapic.c
--- a/sys/arch/x86/x86/ioapic.c Wed Dec 13 13:52:13 2017 +0000
+++ b/sys/arch/x86/x86/ioapic.c Wed Dec 13 16:30:18 2017 +0000
@@ -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 @@
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 @@
#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);
diff -r cccf81851e6a -r 4d836cb48a5e sys/arch/xen/include/intr.h
--- a/sys/arch/xen/include/intr.h Wed Dec 13 13:52:13 2017 +0000
+++ b/sys/arch/xen/include/intr.h Wed Dec 13 16:30:18 2017 +0000
@@ -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 @@
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 *);
diff -r cccf81851e6a -r 4d836cb48a5e sys/arch/xen/x86/pintr.c
--- a/sys/arch/xen/x86/pintr.c Wed Dec 13 13:52:13 2017 +0000
+++ b/sys/arch/xen/x86/pintr.c Wed Dec 13 16:30:18 2017 +0000
@@ -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 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
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 @@
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 @@
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 */
diff -r cccf81851e6a -r 4d836cb48a5e sys/arch/xen/xen/evtchn.c
--- a/sys/arch/xen/xen/evtchn.c Wed Dec 13 13:52:13 2017 +0000
+++ b/sys/arch/xen/xen/evtchn.c Wed Dec 13 16:30:18 2017 +0000
@@ -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 @@
return NULL;
}
+ KASSERT(evtch > 0);
+
ih->pirq = pirq;
ih->evtch = evtch;
ih->func = func;
Home |
Main Index |
Thread Index |
Old Index