Page MenuHomeFreeBSD

D31062.id98837.diff
No OneTemporary

D31062.id98837.diff

Index: sys/arm64/include/xen/arch-intr.h
===================================================================
--- /dev/null
+++ sys/arm64/include/xen/arch-intr.h
@@ -0,0 +1,68 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2015 Julien Grall
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_XEN_ARCH_INTR_H_
+#define _MACHINE_XEN_ARCH_INTR_H_
+
+typedef struct intr_event *xen_arch_isrc_t;
+
+#include <xen/arch-intr.h>
+
+/****************************** ARCH wrappers ********************************/
+
+static inline bool
+xen_arch_intr_has_handlers(struct xenisrc *isrc)
+{
+
+ return (!CK_SLIST_EMPTY(&isrc->xi_arch->ie_handlers));
+}
+
+bool xen_arch_intr_execute_handlers(struct xenisrc *isrc,
+ struct trapframe *frame);
+int xen_arch_intr_add_handler(const char *name, driver_filter_t filter,
+ driver_intr_t handler, void *arg, enum intr_type flags,
+ struct xenisrc *isrc, void **cookiep);
+
+static inline int
+xen_arch_intr_describe(struct xenisrc *isrc, void *cookie, const char *descr)
+{
+
+ return (intr_event_describe_handler(isrc->xi_arch, cookie, descr));
+}
+
+int xen_arch_intr_remove_handler(struct xenisrc *isrc, void *cookie);
+
+static inline int
+xen_arch_intr_event_bind(struct xenisrc *isrc, u_int cpu)
+{
+
+ return (intr_event_bind(isrc->xi_arch, cpu));
+}
+
+#endif /* _MACHINE_XEN_ARCH_INTR_H_ */
Index: sys/arm64/xen/xen_arch_intr.c
===================================================================
--- /dev/null
+++ sys/arm64/xen/xen_arch_intr.c
@@ -0,0 +1,153 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2015 Julien Grall
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/limits.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/interrupt.h>
+#include <sys/pcpu.h>
+#include <sys/smp.h>
+#include <sys/syslog.h>
+
+#include <xen/xen-os.h>
+#include <machine/xen/arch-intr.h>
+
+static void
+xen_intr_arch_disable_source(void *arg)
+{
+ struct xenisrc *isrc;
+
+ isrc = arg;
+ xen_intr_disable_source(isrc, true);
+}
+
+static void
+xen_intr_arch_enable_source(void *arg)
+{
+ struct xenisrc *isrc;
+
+ isrc = arg;
+ xen_intr_enable_source(isrc);
+}
+
+static void
+xen_intr_arch_eoi_source(void *arg)
+{
+ struct xenisrc *isrc;
+
+ isrc = arg;
+ xen_intr_eoi_source(isrc);
+}
+
+static int
+xen_intr_arch_assign_cpu(void *arg, int cpuid)
+{
+ struct xenisrc *isrc;
+
+ isrc = arg;
+ return (xen_intr_assign_cpu(isrc, cpuid));
+}
+
+void
+xen_arch_intr_init(void)
+{
+ /* Nothing to do */
+}
+
+int
+xen_arch_intr_setup(struct xenisrc *isrc)
+{
+
+ return (intr_event_create(&isrc->xi_arch, isrc, 0,
+ isrc->xi_vector /* IRQ */,
+ xen_intr_arch_disable_source /* mask */,
+ xen_intr_arch_enable_source /* unmask */,
+ xen_intr_arch_eoi_source /* EOI */,
+ xen_intr_arch_assign_cpu /* cpu assign */,
+ "xen%d", isrc->xi_port));
+}
+
+bool
+xen_arch_intr_execute_handlers(struct xenisrc *isrc, struct trapframe *frame)
+{
+ int error;
+
+ error = intr_event_handle(isrc->xi_arch, frame);
+ if (error != 0) {
+ xen_intr_disable_source(isrc, true);
+ log(LOG_ERR, "Stray evchn%d: %d\n",
+ isrc->xi_port, error);
+ return (false);
+ }
+ return (true);
+}
+
+int
+xen_arch_intr_add_handler(const char *name, driver_filter_t filter,
+ driver_intr_t handler, void *arg, enum intr_type flags,
+ struct xenisrc *isrc, void **cookiep)
+{
+ int error;
+
+ KASSERT(!xen_arch_intr_has_handlers(isrc),
+ ("Only one handler is allowed per event channel"));
+
+ error = intr_event_add_handler(isrc->xi_arch, name, filter, handler,
+ arg, intr_priority(flags), flags, cookiep);
+ if (error != 0)
+ return (error);
+
+ /* Enable the event channel */
+ xen_intr_enable_intr(isrc);
+ xen_intr_enable_source(isrc);
+
+ return (0);
+}
+
+int
+xen_arch_intr_remove_handler(struct xenisrc *isrc, void *cookie)
+{
+ int error;
+
+ error = intr_event_remove_handler(cookie);
+ if (error != 0)
+ return (error);
+
+ /* Disable the event channel */
+ xen_intr_disable_source(isrc, true);
+ xen_intr_disable_intr(isrc);
+
+ return (0);
+}
Index: sys/conf/files.arm64
===================================================================
--- sys/conf/files.arm64
+++ sys/conf/files.arm64
@@ -574,6 +574,7 @@
# Xen
arm64/xen/hypercall.S optional xenhvm
+arm64/xen/xen_arch_intr.c optional xenhvm
# Xilinx
arm/xilinx/uart_dev_cdnc.c optional uart soc_xilinx_zynq

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 27, 11:29 AM (17 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16867846
Default Alt Text
D31062.id98837.diff (7 KB)

Event Timeline