Module Name: src
Committed By: bouyer
Date: Sun Apr 19 19:39:11 UTC 2020
Modified Files:
src/sys/arch/x86/include [bouyer-xenpvh]: intr.h pic.h
src/sys/arch/x86/pci [bouyer-xenpvh]: msipic.c
src/sys/arch/x86/x86 [bouyer-xenpvh]: i8259.c intr.c ioapic.c lapic.c
src/sys/arch/xen/include [bouyer-xenpvh]: intr.h
src/sys/arch/xen/x86 [bouyer-xenpvh]: xen_intr.c
src/sys/arch/xen/xen [bouyer-xenpvh]: evtchn.c xen_clock.c
Log Message:
Add per-PIC callbacks for interrupt_get_devname(), interrupt_get_assigned()
and interrupt_get_count(). Implement Xen-specific callbacks for
PIC_XEN and use the x86 one for others.
In event_set_handler(), call intr_allocate_io_intrsource() so that
events appears in interrupt list (intrctl list).
To generate a diff of this commit:
cvs rdiff -u -r1.61.6.4 -r1.61.6.5 src/sys/arch/x86/include/intr.h
cvs rdiff -u -r1.9 -r1.9.14.1 src/sys/arch/x86/include/pic.h
cvs rdiff -u -r1.20 -r1.20.6.1 src/sys/arch/x86/pci/msipic.c
cvs rdiff -u -r1.23.10.1 -r1.23.10.2 src/sys/arch/x86/x86/i8259.c
cvs rdiff -u -r1.150.6.4 -r1.150.6.5 src/sys/arch/x86/x86/intr.c
cvs rdiff -u -r1.63 -r1.63.8.1 src/sys/arch/x86/x86/ioapic.c
cvs rdiff -u -r1.76.6.3 -r1.76.6.4 src/sys/arch/x86/x86/lapic.c
cvs rdiff -u -r1.53.6.2 -r1.53.6.3 src/sys/arch/xen/include/intr.h
cvs rdiff -u -r1.21.2.6 -r1.21.2.7 src/sys/arch/xen/x86/xen_intr.c
cvs rdiff -u -r1.88.2.7 -r1.88.2.8 src/sys/arch/xen/xen/evtchn.c
cvs rdiff -u -r1.1.2.3 -r1.1.2.4 src/sys/arch/xen/xen/xen_clock.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/include/intr.h
diff -u src/sys/arch/x86/include/intr.h:1.61.6.4 src/sys/arch/x86/include/intr.h:1.61.6.5
--- src/sys/arch/x86/include/intr.h:1.61.6.4 Sun Apr 19 11:40:30 2020
+++ src/sys/arch/x86/include/intr.h Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.61.6.4 2020/04/19 11:40:30 bouyer Exp $ */
+/* $NetBSD: intr.h,v 1.61.6.5 2020/04/19 19:39:10 bouyer Exp $ */
/*-
* Copyright (c) 1998, 2001, 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
@@ -39,6 +39,7 @@
#ifdef _KERNEL
#include <sys/types.h>
+#include <sys/kcpuset.h>
#else
#include <stdbool.h>
#endif
@@ -237,6 +238,10 @@ int x86_send_ipi(struct cpu_info *, int)
void x86_broadcast_ipi(int);
void x86_ipi_handler(void);
+void x86_intr_get_devname(const char *, char *, size_t);
+void x86_intr_get_assigned(const char *, kcpuset_t *);
+uint64_t x86_intr_get_count(const char *, u_int);
+
#ifndef XENPV
extern void (* const ipifunc[X86_NIPI])(struct cpu_info *);
#endif
Index: src/sys/arch/x86/include/pic.h
diff -u src/sys/arch/x86/include/pic.h:1.9 src/sys/arch/x86/include/pic.h:1.9.14.1
--- src/sys/arch/x86/include/pic.h:1.9 Sat Nov 4 10:26:14 2017
+++ src/sys/arch/x86/include/pic.h Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pic.h,v 1.9 2017/11/04 10:26:14 cherry Exp $ */
+/* $NetBSD: pic.h,v 1.9.14.1 2020/04/19 19:39:10 bouyer Exp $ */
#ifndef _X86_PIC_H
#define _X86_PIC_H
@@ -23,6 +23,10 @@ struct pic {
struct intrstub *pic_edge_stubs;
struct ioapic_softc *pic_ioapic; /* if pic_type == PIC_IOAPIC */
struct msipic *pic_msipic; /* if (pic_type == PIC_MSI) || (pic_type == PIC_MSIX) */
+ /* interface for subr_interrupt.c */
+ void (*pic_intr_get_devname)(const char *, char *, size_t);
+ void (*pic_intr_get_assigned)(const char *, kcpuset_t *);
+ uint64_t (*pic_intr_get_count)(const char *, u_int);
};
/*
Index: src/sys/arch/x86/pci/msipic.c
diff -u src/sys/arch/x86/pci/msipic.c:1.20 src/sys/arch/x86/pci/msipic.c:1.20.6.1
--- src/sys/arch/x86/pci/msipic.c:1.20 Mon Dec 2 03:06:51 2019
+++ src/sys/arch/x86/pci/msipic.c Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: msipic.c,v 1.20 2019/12/02 03:06:51 msaitoh Exp $ */
+/* $NetBSD: msipic.c,v 1.20.6.1 2020/04/19 19:39:10 bouyer Exp $ */
/*
* Copyright (c) 2015 Internet Initiative Japan Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msipic.c,v 1.20 2019/12/02 03:06:51 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msipic.c,v 1.20.6.1 2020/04/19 19:39:10 bouyer Exp $");
#include "opt_intrdebug.h"
@@ -436,6 +436,9 @@ static struct pic msi_pic_tmpl = {
.pic_hwunmask = msi_hwunmask,
.pic_addroute = msi_addroute,
.pic_delroute = msi_delroute,
+ .pic_intr_get_devname = x86_intr_get_devname,
+ .pic_intr_get_assigned = x86_intr_get_assigned,
+ .pic_intr_get_count = x86_intr_get_count,
};
/*
@@ -611,6 +614,9 @@ static struct pic msix_pic_tmpl = {
.pic_hwunmask = msix_hwunmask,
.pic_addroute = msix_addroute,
.pic_delroute = msix_delroute,
+ .pic_intr_get_devname = x86_intr_get_devname,
+ .pic_intr_get_assigned = x86_intr_get_assigned,
+ .pic_intr_get_count = x86_intr_get_count,
};
struct pic *
Index: src/sys/arch/x86/x86/i8259.c
diff -u src/sys/arch/x86/x86/i8259.c:1.23.10.1 src/sys/arch/x86/x86/i8259.c:1.23.10.2
--- src/sys/arch/x86/x86/i8259.c:1.23.10.1 Sun Apr 12 17:25:52 2020
+++ src/sys/arch/x86/x86/i8259.c Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: i8259.c,v 1.23.10.1 2020/04/12 17:25:52 bouyer Exp $ */
+/* $NetBSD: i8259.c,v 1.23.10.2 2020/04/19 19:39:10 bouyer Exp $ */
/*
* Copyright 2002 (c) Wasabi Systems, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i8259.c,v 1.23.10.1 2020/04/12 17:25:52 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i8259.c,v 1.23.10.2 2020/04/19 19:39:10 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -118,6 +118,9 @@ struct pic i8259_pic = {
.pic_delroute = i8259_setup,
.pic_level_stubs = legacy_stubs,
.pic_edge_stubs = legacy_stubs,
+ .pic_intr_get_devname = x86_intr_get_devname,
+ .pic_intr_get_assigned = x86_intr_get_assigned,
+ .pic_intr_get_count = x86_intr_get_count,
};
void
Index: src/sys/arch/x86/x86/intr.c
diff -u src/sys/arch/x86/x86/intr.c:1.150.6.4 src/sys/arch/x86/x86/intr.c:1.150.6.5
--- src/sys/arch/x86/x86/intr.c:1.150.6.4 Sun Apr 19 11:40:30 2020
+++ src/sys/arch/x86/x86/intr.c Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.c,v 1.150.6.4 2020/04/19 11:40:30 bouyer Exp $ */
+/* $NetBSD: intr.c,v 1.150.6.5 2020/04/19 19:39:10 bouyer Exp $ */
/*
* Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -133,7 +133,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.150.6.4 2020/04/19 11:40:30 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.150.6.5 2020/04/19 19:39:10 bouyer Exp $");
#include "opt_intrdebug.h"
#include "opt_multiprocessor.h"
@@ -1962,11 +1962,8 @@ intr_get_handler(const char *intrid)
return isp->is_handlers;
}
-/*
- * MI interface for subr_interrupt.c
- */
uint64_t
-interrupt_get_count(const char *intrid, u_int cpu_idx)
+x86_intr_get_count(const char *intrid, u_int cpu_idx)
{
struct cpu_info *ci;
struct intrsource *isp;
@@ -1976,11 +1973,10 @@ interrupt_get_count(const char *intrid,
int i, slot;
uint64_t count = 0;
+ KASSERT(mutex_owned(&cpu_lock));
ci = cpu_lookup(cpu_idx);
cpuid = ci->ci_cpuid;
- mutex_enter(&cpu_lock);
-
ih = intr_get_handler(intrid);
if (ih == NULL) {
count = 0;
@@ -2003,31 +1999,75 @@ interrupt_get_count(const char *intrid,
}
out:
- mutex_exit(&cpu_lock);
return count;
}
-/*
- * MI interface for subr_interrupt.c
- */
void
-interrupt_get_assigned(const char *intrid, kcpuset_t *cpuset)
+x86_intr_get_assigned(const char *intrid, kcpuset_t *cpuset)
{
struct cpu_info *ci;
struct intrhand *ih;
+ KASSERT(mutex_owned(&cpu_lock));
kcpuset_zero(cpuset);
- mutex_enter(&cpu_lock);
-
ih = intr_get_handler(intrid);
if (ih == NULL)
- goto out;
+ return;
ci = ih->ih_cpu;
kcpuset_set(cpuset, cpu_index(ci));
+}
- out:
+void
+x86_intr_get_devname(const char *intrid, char *buf, size_t len)
+{
+ struct intrsource *isp;
+ struct intrhand *ih;
+ int slot;
+
+ KASSERT(mutex_owned(&cpu_lock));
+
+ ih = intr_get_handler(intrid);
+ if (ih == NULL) {
+ buf[0] = '\0';
+ return;
+ }
+ slot = ih->ih_slot;
+ isp = ih->ih_cpu->ci_isources[slot];
+ strlcpy(buf, isp->is_xname, len);
+
+}
+
+/*
+ * MI interface for subr_interrupt.c
+ */
+uint64_t
+interrupt_get_count(const char *intrid, u_int cpu_idx)
+{
+ struct intrsource *isp;
+ uint64_t count = 0;
+
+ mutex_enter(&cpu_lock);
+ isp = intr_get_io_intrsource(intrid);
+ if (isp != NULL)
+ count = isp->is_pic->pic_intr_get_count(intrid, cpu_idx);
+ mutex_exit(&cpu_lock);
+ return count;
+}
+
+/*
+ * MI interface for subr_interrupt.c
+ */
+void
+interrupt_get_assigned(const char *intrid, kcpuset_t *cpuset)
+{
+ struct intrsource *isp;
+
+ mutex_enter(&cpu_lock);
+ isp = intr_get_io_intrsource(intrid);
+ if (isp != NULL)
+ isp->is_pic->pic_intr_get_assigned(intrid, cpuset);
mutex_exit(&cpu_lock);
}
@@ -2058,21 +2098,17 @@ void
interrupt_get_devname(const char *intrid, char *buf, size_t len)
{
struct intrsource *isp;
- struct intrhand *ih;
- int slot;
mutex_enter(&cpu_lock);
-
- ih = intr_get_handler(intrid);
- if (ih == NULL) {
- buf[0] = '\0';
- goto out;
+ isp = intr_get_io_intrsource(intrid);
+ if (isp != NULL) {
+ if (isp->is_pic->pic_intr_get_devname == NULL) {
+ printf("NULL get_devname intrid %s pic %s\n",
+ intrid, isp->is_pic->pic_name);
+ } else {
+ isp->is_pic->pic_intr_get_devname(intrid, buf, len);
+ }
}
- slot = ih->ih_slot;
- isp = ih->ih_cpu->ci_isources[slot];
- strlcpy(buf, isp->is_xname, len);
-
- out:
mutex_exit(&cpu_lock);
}
Index: src/sys/arch/x86/x86/ioapic.c
diff -u src/sys/arch/x86/x86/ioapic.c:1.63 src/sys/arch/x86/x86/ioapic.c:1.63.8.1
--- src/sys/arch/x86/x86/ioapic.c:1.63 Wed Jun 19 06:32:46 2019
+++ src/sys/arch/x86/x86/ioapic.c Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ioapic.c,v 1.63 2019/06/19 06:32:46 msaitoh Exp $ */
+/* $NetBSD: ioapic.c,v 1.63.8.1 2020/04/19 19:39:10 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.63 2019/06/19 06:32:46 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.63.8.1 2020/04/19 19:39:10 bouyer Exp $");
#include "opt_ddb.h"
@@ -301,6 +301,9 @@ ioapic_attach(device_t parent, device_t
sc->sc_pic.pic_trymask = ioapic_trymask;
sc->sc_pic.pic_edge_stubs = ioapic_edge_stubs;
sc->sc_pic.pic_level_stubs = ioapic_level_stubs;
+ sc->sc_pic.pic_intr_get_devname = x86_intr_get_devname;
+ sc->sc_pic.pic_intr_get_assigned = x86_intr_get_assigned;
+ sc->sc_pic.pic_intr_get_count = x86_intr_get_count;
apic_id = (ioapic_read(sc, IOAPIC_ID) & IOAPIC_ID_MASK)
>> IOAPIC_ID_SHIFT;
Index: src/sys/arch/x86/x86/lapic.c
diff -u src/sys/arch/x86/x86/lapic.c:1.76.6.3 src/sys/arch/x86/x86/lapic.c:1.76.6.4
--- src/sys/arch/x86/x86/lapic.c:1.76.6.3 Sat Apr 18 14:47:56 2020
+++ src/sys/arch/x86/x86/lapic.c Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: lapic.c,v 1.76.6.3 2020/04/18 14:47:56 bouyer Exp $ */
+/* $NetBSD: lapic.c,v 1.76.6.4 2020/04/19 19:39:10 bouyer Exp $ */
/*-
* Copyright (c) 2000, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lapic.c,v 1.76.6.3 2020/04/18 14:47:56 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lapic.c,v 1.76.6.4 2020/04/19 19:39:10 bouyer Exp $");
#include "acpica.h"
#include "ioapic.h"
@@ -115,6 +115,9 @@ struct pic local_pic = {
.pic_hwunmask = lapic_hwunmask,
.pic_addroute = lapic_setup,
.pic_delroute = lapic_setup,
+ .pic_intr_get_devname = x86_intr_get_devname,
+ .pic_intr_get_assigned = x86_intr_get_assigned,
+ .pic_intr_get_count = x86_intr_get_count,
};
static int i82489_ipi(int vec, int target, int dl);
Index: src/sys/arch/xen/include/intr.h
diff -u src/sys/arch/xen/include/intr.h:1.53.6.2 src/sys/arch/xen/include/intr.h:1.53.6.3
--- src/sys/arch/xen/include/intr.h:1.53.6.2 Thu Apr 16 08:46:35 2020
+++ src/sys/arch/xen/include/intr.h Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.53.6.2 2020/04/16 08:46:35 bouyer Exp $ */
+/* $NetBSD: intr.h,v 1.53.6.3 2020/04/19 19:39:10 bouyer Exp $ */
/* NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp */
/*-
@@ -58,8 +58,9 @@ struct evtsource {
struct intrhand *ev_handlers; /* handler chain */
struct evcnt ev_evcnt; /* interrupt counter */
struct cpu_info *ev_cpu; /* cpu on which this event is bound */
- char ev_intrname[32]; /* interrupt string */
- char ev_xname[64]; /* handler device list */
+ char ev_intrname[INTRIDBUF]; /* interrupt string */
+ char ev_xname[INTRDEVNAMEBUF]; /* handler device list */
+ struct intrsource *ev_isl; /* entry in intr sources list */
};
extern struct intrstub xenev_stubs[];
Index: src/sys/arch/xen/x86/xen_intr.c
diff -u src/sys/arch/xen/x86/xen_intr.c:1.21.2.6 src/sys/arch/xen/x86/xen_intr.c:1.21.2.7
--- src/sys/arch/xen/x86/xen_intr.c:1.21.2.6 Sun Apr 19 11:40:30 2020
+++ src/sys/arch/xen/x86/xen_intr.c Sun Apr 19 19:39:10 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xen_intr.c,v 1.21.2.6 2020/04/19 11:40:30 bouyer Exp $ */
+/* $NetBSD: xen_intr.c,v 1.21.2.7 2020/04/19 19:39:10 bouyer Exp $ */
/*-
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v 1.21.2.6 2020/04/19 11:40:30 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v 1.21.2.7 2020/04/19 19:39:10 bouyer Exp $");
#include "opt_multiprocessor.h"
@@ -142,7 +142,7 @@ xen_intr_establish_xname(int legacy_irq,
intrstr, xname, known_mpsafe);
if (rih == NULL) {
- printf("%s: can't establish interrupt", __func__);
+ printf("%s: can't establish interrupt\n", __func__);
return NULL;
}
@@ -481,7 +481,7 @@ xen_intr_create_intrid(int legacy_irq, s
return NULL; /* No pic found! */
}
-#if !defined(XENPVHVM)
+#if defined(XENPV)
__strong_alias(x86_read_psl, xen_read_psl);
__strong_alias(x86_write_psl, xen_write_psl);
@@ -495,4 +495,4 @@ __strong_alias(intr_disestablish, xen_in
__strong_alias(cpu_intr_redistribute, xen_cpu_intr_redistribute);
__strong_alias(cpu_intr_count, xen_cpu_intr_count);
__strong_alias(cpu_intr_init, xen_cpu_intr_init);
-#endif /* !XENPVHVM */
+#endif /* XENPV */
Index: src/sys/arch/xen/xen/evtchn.c
diff -u src/sys/arch/xen/xen/evtchn.c:1.88.2.7 src/sys/arch/xen/xen/evtchn.c:1.88.2.8
--- src/sys/arch/xen/xen/evtchn.c:1.88.2.7 Sun Apr 19 11:40:30 2020
+++ src/sys/arch/xen/xen/evtchn.c Sun Apr 19 19:39:11 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: evtchn.c,v 1.88.2.7 2020/04/19 11:40:30 bouyer Exp $ */
+/* $NetBSD: evtchn.c,v 1.88.2.8 2020/04/19 19:39:11 bouyer Exp $ */
/*
* Copyright (c) 2006 Manuel Bouyer.
@@ -54,7 +54,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.88.2.7 2020/04/19 11:40:30 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.88.2.8 2020/04/19 19:39:11 bouyer Exp $");
#include "opt_xen.h"
#include "isa.h"
@@ -121,7 +121,9 @@ static void xen_evtchn_unmask(struct pic
static void xen_evtchn_addroute(struct pic *, struct cpu_info *, int, int, int);
static void xen_evtchn_delroute(struct pic *, struct cpu_info *, int, int, int);
static bool xen_evtchn_trymask(struct pic *, int);
-
+static void xen_intr_get_devname(const char *, char *, size_t);
+static void xen_intr_get_assigned(const char *, kcpuset_t *);
+static uint64_t xen_intr_get_count(const char *, u_int);
struct pic xen_pic = {
.pic_name = "xenev0",
@@ -136,6 +138,9 @@ struct pic xen_pic = {
.pic_trymask = xen_evtchn_trymask,
.pic_level_stubs = xenev_stubs,
.pic_edge_stubs = xenev_stubs,
+ .pic_intr_get_devname = xen_intr_get_devname,
+ .pic_intr_get_assigned = xen_intr_get_assigned,
+ .pic_intr_get_count = xen_intr_get_count,
};
/*
@@ -365,6 +370,8 @@ evtchn_do_event(int evtch, struct intrfr
}
ci->ci_ilevel = evtsource[evtch]->ev_maxlevel;
iplmask = evtsource[evtch]->ev_imask;
+ KASSERT(ci->ci_ilevel >= IPL_VM);
+ KASSERT(cpu_intr_p());
x86_enable_intr();
mutex_spin_enter(&evtlock[evtch]);
ih = evtsource[evtch]->ev_handlers;
@@ -418,7 +425,6 @@ xen_evtchn_mask(struct pic *pic, int pin
KASSERT(evtchn < NR_EVENT_CHANNELS);
hypervisor_mask_event(evtchn);
-
}
static void
@@ -732,7 +738,7 @@ pirq_establish(int pirq, int evtch, int
ih->arg = arg;
if (event_set_handler(evtch, pirq_interrupt, ih, level, intrname,
- xname, known_mpsafe) != 0) {
+ xname, known_mpsafe) == NULL) {
kmem_free(ih, sizeof(struct pintrhand));
return NULL;
}
@@ -885,6 +891,11 @@ event_set_handler(int evtch, int (*func)
}
}
mutex_spin_exit(&evtlock[evtch]);
+#ifndef XENPV
+ mutex_enter(&cpu_lock);
+ evts->ev_isl->is_handlers = evts->ev_handlers;
+ mutex_exit(&cpu_lock);
+#endif
}
@@ -895,6 +906,16 @@ event_set_handler(int evtch, int (*func)
intr_calculatemasks(evts, evtch, ci);
splx(s);
+#ifndef XENPV
+ mutex_enter(&cpu_lock);
+ if (evts->ev_isl == NULL) {
+ evts->ev_isl = intr_allocate_io_intrsource(intrname);
+ evts->ev_isl->is_pic = &xen_pic;
+ }
+ evts->ev_isl->is_handlers = evts->ev_handlers;
+ mutex_exit(&cpu_lock);
+#endif
+
return ih;
}
@@ -968,8 +989,19 @@ event_remove_handler(int evtch, int (*fu
panic("event_remove_handler");
*ihp = ih->ih_next;
mutex_spin_exit(&evtlock[evtch]);
+#ifndef XENPV
+ mutex_enter(&cpu_lock);
+ evts->ev_isl->is_handlers = evts->ev_handlers;
+ mutex_exit(&cpu_lock);
+#endif
kmem_free(ih, sizeof (struct intrhand));
if (evts->ev_handlers == NULL) {
+#ifndef XENPV
+ KASSERT(evts->ev_isl->is_handlers == NULL);
+ mutex_enter(&cpu_lock);
+ intr_free_io_intrsource(evts->ev_intrname);
+ mutex_exit(&cpu_lock);
+#endif
xen_atomic_clear_bit(&ci->ci_evtmask[0], evtch);
evcnt_detach(&evts->ev_evcnt);
kmem_free(evts, sizeof (struct evtsource));
@@ -1055,7 +1087,6 @@ xen_debug_handler(void *arg)
return 0;
}
-#ifdef XENPV
static struct evtsource *
event_get_handler(const char *intrid)
{
@@ -1072,11 +1103,8 @@ event_get_handler(const char *intrid)
return NULL;
}
-/*
- * MI interface for subr_interrupt.c
- */
-uint64_t
-interrupt_get_count(const char *intrid, u_int cpu_idx)
+static uint64_t
+xen_intr_get_count(const char *intrid, u_int cpu_idx)
{
int count = 0;
struct evtsource *evp;
@@ -1092,11 +1120,8 @@ interrupt_get_count(const char *intrid,
return count;
}
-/*
- * MI interface for subr_interrupt.c
- */
-void
-interrupt_get_assigned(const char *intrid, kcpuset_t *cpuset)
+static void
+xen_intr_get_assigned(const char *intrid, kcpuset_t *cpuset)
{
struct evtsource *evp;
@@ -1111,11 +1136,8 @@ interrupt_get_assigned(const char *intri
mutex_spin_exit(&evtchn_lock);
}
-/*
- * MI interface for subr_interrupt.c
- */
-void
-interrupt_get_devname(const char *intrid, char *buf, size_t len)
+static void
+xen_intr_get_devname(const char *intrid, char *buf, size_t len)
{
struct evtsource *evp;
@@ -1127,6 +1149,7 @@ interrupt_get_devname(const char *intrid
mutex_spin_exit(&evtchn_lock);
}
+#ifdef XENPV
/*
* MI interface for subr_interrupt.
*/
@@ -1180,7 +1203,12 @@ interrupt_construct_intrids(const kcpuse
off++;
}
mutex_spin_exit(&evtchn_lock);
-
return ii_handler;
}
+__strong_alias(interrupt_get_count, xen_intr_get_count);
+__strong_alias(interrupt_get_assigned, xen_intr_get_assigned);
+__strong_alias(interrupt_get_devname, xen_intr_get_devname);
+__strong_alias(x86_intr_get_count, xen_intr_get_count);
+__strong_alias(x86_intr_get_assigned, xen_intr_get_assigned);
+__strong_alias(x86_intr_get_devname, xen_intr_get_devname);
#endif /* XENPV */
Index: src/sys/arch/xen/xen/xen_clock.c
diff -u src/sys/arch/xen/xen/xen_clock.c:1.1.2.3 src/sys/arch/xen/xen/xen_clock.c:1.1.2.4
--- src/sys/arch/xen/xen/xen_clock.c:1.1.2.3 Sat Apr 18 15:06:18 2020
+++ src/sys/arch/xen/xen/xen_clock.c Sun Apr 19 19:39:11 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xen_clock.c,v 1.1.2.3 2020/04/18 15:06:18 bouyer Exp $ */
+/* $NetBSD: xen_clock.c,v 1.1.2.4 2020/04/19 19:39:11 bouyer Exp $ */
/*-
* Copyright (c) 2017, 2018 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_clock.c,v 1.1.2.3 2020/04/18 15:06:18 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_clock.c,v 1.1.2.4 2020/04/19 19:39:11 bouyer Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -636,7 +636,7 @@ xen_resumeclocks(struct cpu_info *ci)
/* XXX sketchy function pointer cast -- fix the API, please */
if (event_set_handler(evtch,
__FPTRCAST(int (*)(void *), xen_timer_handler),
- ci, IPL_CLOCK, NULL, intr_xname, true, false) != 0)
+ ci, IPL_CLOCK, NULL, intr_xname, true, false) == NULL)
panic("failed to establish timer interrupt handler");
hypervisor_unmask_event(evtch);