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);

Reply via email to