|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [[UNIKRAFT PATCH] v4 4/4] plat/xen: Made xen event handler interrupt-context-safe
From: Cristian Vijelie <cristianvijelie@xxxxxxxxx>
I have moved 'do_event' function into a separate source file, 'isr.c'
along with another function, which is called by 'do_event',
'clear_eventchn'. I also added a header file 'internal/isr.h', which
contains definitions needed in both events.c and the newlycreated
source file.
Signed-off-by: Cristian Vijelie <cristianvijelie@xxxxxxxxx>
---
plat/xen/Makefile.uk | 1 +
plat/xen/events.c | 49 ++------------------------------
plat/xen/internal/isr.h | 51 +++++++++++++++++++++++++++++++++
plat/xen/isr.c | 63 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 117 insertions(+), 47 deletions(-)
create mode 100644 plat/xen/internal/isr.h
create mode 100644 plat/xen/isr.c
diff --git a/plat/xen/Makefile.uk b/plat/xen/Makefile.uk
index 2a8cdbf..c6e5a05 100644
--- a/plat/xen/Makefile.uk
+++ b/plat/xen/Makefile.uk
@@ -94,6 +94,7 @@ LIBXENPLAT_SRCS-y +=
$(LIBXENPLAT_BASE)/emg_console.c
endif
LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/shutdown.c
LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/events.c
+LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/isr.c|isr
ifeq ($(CONFIG_XEN_GNTTAB),y)
LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/gnttab.c
diff --git a/plat/xen/events.c b/plat/xen/events.c
index 3a1d155..bf9707d 100644
--- a/plat/xen/events.c
+++ b/plat/xen/events.c
@@ -32,24 +32,10 @@
* Deals with events received on event channels
* Ported from Mini-OS
*/
-#include <stdlib.h>
-#include <stdint.h>
-#include <common/hypervisor.h>
-#include <common/events.h>
+#include "internal/isr.h"
#include <xen/xen.h>
-#include <uk/print.h>
-#include <uk/bitops.h>
-#define NR_EVS 1024
-
-/* this represents a event handler. Chaining or sharing is not allowed */
-typedef struct _ev_action_t {
- evtchn_handler_t handler;
- void *data;
- uint32_t count;
-} ev_action_t;
-
-static ev_action_t ev_actions[NR_EVS];
+ev_action_t ev_actions[NR_EVS];
static void default_handler(evtchn_port_t port, struct __regs *regs,
void *data);
@@ -78,30 +64,6 @@ void unbind_all_ports(void)
vcpu_info->evtchn_pending_sel = 0;
}
-/*
- * Demux events to different handlers.
- */
-int do_event(evtchn_port_t port, struct __regs *regs)
-{
- ev_action_t *action;
-
- clear_evtchn(port);
-
- if (port >= NR_EVS) {
- uk_pr_err("%s: Port number too large: %d\n", __func__, port);
- return 1;
- }
-
- action = &ev_actions[port];
- action->count++;
-
- /* call the handler */
- action->handler(port, regs, action->data);
-
- return 1;
-
-}
-
evtchn_port_t bind_evtchn(evtchn_port_t port, evtchn_handler_t handler,
void *data)
{
@@ -321,13 +283,6 @@ inline void unmask_evtchn(evtchn_port_t port)
}
}
-inline void clear_evtchn(evtchn_port_t port)
-{
- shared_info_t *s = HYPERVISOR_shared_info;
-
- uk_clear_bit(port, &s->evtchn_pending[0]);
-}
-
struct uk_alloc;
int ukplat_irq_init(struct uk_alloc *a __unused)
diff --git a/plat/xen/internal/isr.h b/plat/xen/internal/isr.h
new file mode 100644
index 0000000..9a23d69
--- /dev/null
+++ b/plat/xen/internal/isr.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Authors: Rolf Neugebauer <neugebar@xxxxxxxxxxxxx>
+ * Grzegorz Milos <gm281@xxxxxxxxx>
+ * Costin Lupu <costin.lupu@xxxxxxxxx>
+ *
+ * Copyright (c) 2003-2005, Intel Research Cambridge
+ * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation.
+ *
+ * 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 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 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.
+ */
+
+#ifndef XEN_ISR_H
+#define XEN_ISR_H
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <common/events.h>
+#include <uk/print.h>
+#include <common/hypervisor.h>
+#include <uk/bitops.h>
+
+#define NR_EVS 1024
+
+/* this represents a event handler. Chaining or sharing is not allowed */
+typedef struct _ev_action_t {
+ evtchn_handler_t handler;
+ void *data;
+ uint32_t count;
+} ev_action_t;
+
+#endif /* XEN_ISR_H */
diff --git a/plat/xen/isr.c b/plat/xen/isr.c
new file mode 100644
index 0000000..9aad3ac
--- /dev/null
+++ b/plat/xen/isr.c
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Authors: Rolf Neugebauer <neugebar@xxxxxxxxxxxxx>
+ * Grzegorz Milos <gm281@xxxxxxxxx>
+ * Costin Lupu <costin.lupu@xxxxxxxxx>
+ *
+ * Copyright (c) 2003-2005, Intel Research Cambridge
+ * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation.
+ *
+ * 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 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 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 "internal/isr.h"
+
+extern ev_action_t *ev_actions;
+
+inline void clear_evtchn(evtchn_port_t port)
+{
+ shared_info_t *s = HYPERVISOR_shared_info;
+
+ uk_clear_bit(port, &s->evtchn_pending[0]);
+}
+
+/*
+ * Demux events to different handlers.
+ */
+int do_event(evtchn_port_t port, struct __regs *regs)
+{
+ ev_action_t *action;
+
+ clear_evtchn(port);
+
+ if (port >= NR_EVS) {
+ uk_pr_err("%s: Port number too large: %d\n", __func__, port);
+ return 1;
+ }
+
+ action = &ev_actions[port];
+ action->count++;
+
+ /* call the handler */
+ action->handler(port, regs, action->data);
+
+ return 1;
+}
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |