Module Name: src
Committed By: cherry
Date: Mon Oct 8 08:05:08 UTC 2018
Modified Files:
src/sys/arch/x86/x86: i8259.c intr.c ioapic.c
Log Message:
Clean up XEN specific stuff from the apic code, and move to intr.c
No functional change.
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/x86/x86/i8259.c
cvs rdiff -u -r1.133 -r1.134 src/sys/arch/x86/x86/intr.c
cvs rdiff -u -r1.58 -r1.59 src/sys/arch/x86/x86/ioapic.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/x86/i8259.c
diff -u src/sys/arch/x86/x86/i8259.c:1.20 src/sys/arch/x86/x86/i8259.c:1.21
--- src/sys/arch/x86/x86/i8259.c:1.20 Sun Oct 7 16:36:36 2018
+++ src/sys/arch/x86/x86/i8259.c Mon Oct 8 08:05:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: i8259.c,v 1.20 2018/10/07 16:36:36 cherry Exp $ */
+/* $NetBSD: i8259.c,v 1.21 2018/10/08 08:05:08 cherry Exp $ */
/*
* Copyright 2002 (c) Wasabi Systems, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i8259.c,v 1.20 2018/10/07 16:36:36 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i8259.c,v 1.21 2018/10/08 08:05:08 cherry Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -88,9 +88,6 @@ __KERNEL_RCSID(0, "$NetBSD: i8259.c,v 1.
#include <machine/pic.h>
#include <machine/i8259.h>
-#ifdef XEN
-#include <xen/evtchn.h>
-#endif
#ifndef __x86_64__
#include "mca.h"
@@ -102,7 +99,6 @@ __KERNEL_RCSID(0, "$NetBSD: i8259.c,v 1.
static void i8259_hwmask(struct pic *, int);
static void i8259_hwunmask(struct pic *, int);
static void i8259_setup(struct pic *, struct cpu_info *, int, int, int);
-static void i8259_unsetup(struct pic *, struct cpu_info *, int, int, int);
static void i8259_reinit_irqs(void);
unsigned i8259_imen;
@@ -119,7 +115,7 @@ struct pic i8259_pic = {
.pic_hwmask = i8259_hwmask,
.pic_hwunmask = i8259_hwunmask,
.pic_addroute = i8259_setup,
- .pic_delroute = i8259_unsetup,
+ .pic_delroute = i8259_setup,
.pic_level_stubs = legacy_stubs,
.pic_edge_stubs = legacy_stubs,
};
@@ -256,62 +252,10 @@ static void
i8259_setup(struct pic *pic, struct cpu_info *ci,
int pin, int idtvec, int type)
{
-#if defined(XEN)
- /*
- * This is kludgy, and not the right place, but we can't bind
- * before the routing has been set to the appropriate 'vector'.
- * in x86/intr.c, this is done after idt_vec_set(), where this
- * would have been more appropriate to put this.
- */
-
- int port, irq;
- irq = vect2irq[idtvec];
- KASSERT(irq != 0);
- if (irq2port[irq] != 0) {
- /*
- * Shared interrupt - we can't rebind.
- * The port is shared instead.
- */
- return;
- }
-
- port = bind_pirq_to_evtch(irq);
- KASSERT(port < NR_EVENT_CHANNELS);
- KASSERT(port >= 0);
-
- KASSERT(irq2port[irq] == 0);
- irq2port[irq] = port + 1;
-
- xen_atomic_set_bit(&ci->ci_evtmask[0], port);
-#else
if (CPU_IS_PRIMARY(ci))
i8259_reinit_irqs();
-#endif
}
-static void
-i8259_unsetup(struct pic *pic, struct cpu_info *ci,
- int pin, int idtvec, int type)
-{
-#if defined(XEN)
- int port, irq;
- irq = vect2irq[idtvec];
- port = unbind_pirq_from_evtch(irq);
-
- KASSERT(port < NR_EVENT_CHANNELS);
-
- /* XXX: This is problematic for shared interrupts */
- KASSERT(irq2port[irq] != 0);
- irq2port[irq] = 0;
-
- xen_atomic_clear_bit(&ci->ci_evtmask[0], port);
-#else
- if (CPU_IS_PRIMARY(ci))
- i8259_reinit_irqs();
-#endif
-}
-
-
void
i8259_reinit(void)
{
Index: src/sys/arch/x86/x86/intr.c
diff -u src/sys/arch/x86/x86/intr.c:1.133 src/sys/arch/x86/x86/intr.c:1.134
--- src/sys/arch/x86/x86/intr.c:1.133 Sun Oct 7 05:23:01 2018
+++ src/sys/arch/x86/x86/intr.c Mon Oct 8 08:05:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.c,v 1.133 2018/10/07 05:23:01 cherry Exp $ */
+/* $NetBSD: intr.c,v 1.134 2018/10/08 08:05:08 cherry 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.133 2018/10/07 05:23:01 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.134 2018/10/08 08:05:08 cherry Exp $");
#include "opt_intrdebug.h"
#include "opt_multiprocessor.h"
@@ -1278,12 +1278,24 @@ intr_establish_xname(int legacy_irq, str
vector = xen_vec_alloc(gsi);
- extern struct cpu_info phycpu_info_primary; /* XXX */
- struct cpu_info *ci = &phycpu_info_primary;
- pic->pic_addroute(pic, ci, pin, vector, type);
-
- evtchn = irq2port[vect2irq[vector]];
- KASSERT(evtchn > 0);
+ if (irq2port[gsi] == 0) {
+ extern struct cpu_info phycpu_info_primary; /* XXX */
+ struct cpu_info *ci = &phycpu_info_primary;
+
+ pic->pic_addroute(pic, ci, pin, vector, type);
+
+ evtchn = bind_pirq_to_evtch(gsi);
+ KASSERT(evtchn > 0);
+ KASSERT(evtchn < NR_EVENT_CHANNELS);
+ irq2port[gsi] = evtchn + 1;
+ xen_atomic_set_bit(&ci->ci_evtmask[0], evtchn);
+ } else {
+ /*
+ * Shared interrupt - we can't rebind.
+ * The port is shared instead.
+ */
+ evtchn = irq2port[gsi];
+ }
pih = pirq_establish(gsi, evtchn, handler, arg, level,
intrstr, xname);
@@ -1337,7 +1349,31 @@ intr_disestablish(struct intrhand *ih)
return;
}
#if defined(DOM0OPS)
- pirq_disestablish((struct pintrhand *)ih);
+ /*
+ * Cache state, to prevent a use after free situation with
+ * ih.
+ */
+
+ struct pintrhand *pih = (struct pintrhand *)ih;
+
+ int pirq = pih->pirq;
+ int port = pih->evtch;
+ KASSERT(irq2port[pirq] != 0);
+
+ pirq_disestablish(pih);
+
+ if (evtsource[port] == NULL) {
+ /*
+ * Last handler was removed by
+ * event_remove_handler().
+ *
+ * We can safely unbind the pirq now.
+ */
+
+ port = unbind_pirq_from_evtch(pirq);
+ KASSERT(port == pih->evtch);
+ irq2port[pirq] = 0;
+ }
#endif
return;
#endif /* XEN */
Index: src/sys/arch/x86/x86/ioapic.c
diff -u src/sys/arch/x86/x86/ioapic.c:1.58 src/sys/arch/x86/x86/ioapic.c:1.59
--- src/sys/arch/x86/x86/ioapic.c:1.58 Sun Oct 7 16:36:36 2018
+++ src/sys/arch/x86/x86/ioapic.c Mon Oct 8 08:05:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ioapic.c,v 1.58 2018/10/07 16:36:36 cherry Exp $ */
+/* $NetBSD: ioapic.c,v 1.59 2018/10/08 08:05:08 cherry 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.58 2018/10/07 16:36:36 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.59 2018/10/08 08:05:08 cherry Exp $");
#include "opt_ddb.h"
@@ -564,37 +564,6 @@ ioapic_addroute(struct pic *pic, struct
pp->ip_vector = idtvec;
pp->ip_cpu = ci;
apic_set_redir(sc, pin, idtvec, ci);
-
-#if defined(XEN)
- /*
- * This is kludgy, and not the right place, but we can't bind
- * before the routing has been set to the appropriate 'vector'.
- * in x86/intr.c, this is done after idt_vec_set(), where this
- * would have been more appropriate to put this.
- */
-
- int port, irq;
- irq = vect2irq[idtvec];
- KASSERT(irq != 0);
-
- if (irq2port[irq] != 0) {
- /*
- * Shared interrupt - we can't rebind.
- * The port is shared instead.
- */
- return;
- }
-
- port = bind_pirq_to_evtch(irq);
- KASSERT(port < NR_EVENT_CHANNELS);
- KASSERT(port >= 0);
-
- KASSERT(irq2port[irq] == 0);
- irq2port[irq] = port + 1;
-
- xen_atomic_set_bit(&ci->ci_evtmask[0], port);
-#endif
-
}
static void
@@ -603,22 +572,6 @@ ioapic_delroute(struct pic *pic, struct
{
ioapic_hwmask(pic, pin);
-
-#if defined(XEN)
- int port, irq;
- irq = vect2irq[idtvec];
- port = unbind_pirq_from_evtch(irq);
-
- KASSERT(port < NR_EVENT_CHANNELS);
-
- /* XXX: This is problematic for shared interrupts */
- KASSERT(irq2port[irq] != 0);
- irq2port[irq] = 0;
-
- xen_atomic_clear_bit(&ci->ci_evtmask[0], port);
-
-#endif
-
}
#ifdef DDB