|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] device-tree: Move Arm's static-evtchn feature to common
commit 902db088395b13ce620f5a201a751556b760c0ef
Author: Michal Orzel <michal.orzel@xxxxxxx>
AuthorDate: Tue May 27 10:21:17 2025 +0200
Commit: Michal Orzel <michal.orzel@xxxxxxx>
CommitDate: Fri May 30 08:41:12 2025 +0200
device-tree: Move Arm's static-evtchn feature to common
There's nothing Arm specific about this feature. Move it to common as
part of a larger activity to commonalize device tree related features.
For now, select it only for ARM until others (e.g. RISC-V) verify it
works for them too.
Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
---
xen/arch/arm/Kconfig | 8 --
xen/arch/arm/Makefile | 1 -
xen/arch/arm/include/asm/static-evtchn.h | 25 -----
xen/arch/arm/setup.c | 2 +-
xen/arch/arm/static-evtchn.c | 161 -------------------------------
xen/common/Kconfig | 8 ++
xen/common/device-tree/Makefile | 1 +
xen/common/device-tree/static-evtchn.c | 160 ++++++++++++++++++++++++++++++
xen/include/xen/static-evtchn.h | 25 +++++
9 files changed, 195 insertions(+), 196 deletions(-)
diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig
index a5aad97a68..57919d8b3a 100644
--- a/xen/arch/arm/Kconfig
+++ b/xen/arch/arm/Kconfig
@@ -253,14 +253,6 @@ config STATIC_SHM
help
This option enables statically shared memory on a dom0less system.
-config STATIC_EVTCHN
- bool "Static event channel support on a dom0less system"
- depends on DOM0LESS_BOOT
- default y
- help
- This option enables establishing static event channel communication
- between domains on a dom0less system (domU-domU as well as domU-dom0).
-
config PARTIAL_EMULATION
bool "Enable partial emulation of system/coprocessor registers"
default y
diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile
index 129a109d6e..eeeac4e653 100644
--- a/xen/arch/arm/Makefile
+++ b/xen/arch/arm/Makefile
@@ -51,7 +51,6 @@ obj-y += setup.o
obj-y += shutdown.o
obj-y += smp.o
obj-y += smpboot.o
-obj-$(CONFIG_STATIC_EVTCHN) += static-evtchn.init.o
obj-$(CONFIG_STATIC_MEMORY) += static-memory.init.o
obj-$(CONFIG_STATIC_SHM) += static-shmem.init.o
obj-y += sysctl.o
diff --git a/xen/arch/arm/include/asm/static-evtchn.h
b/xen/arch/arm/include/asm/static-evtchn.h
deleted file mode 100644
index f964522f6a..0000000000
--- a/xen/arch/arm/include/asm/static-evtchn.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#ifndef __ASM_STATIC_EVTCHN_H_
-#define __ASM_STATIC_EVTCHN_H_
-
-#ifdef CONFIG_STATIC_EVTCHN
-
-void alloc_static_evtchn(void);
-
-#else /* !CONFIG_STATIC_EVTCHN */
-
-static inline void alloc_static_evtchn(void) {};
-
-#endif /* CONFIG_STATIC_EVTCHN */
-
-#endif /* __ASM_STATIC_EVTCHN_H_ */
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 10b46d0684..734e23da44 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -31,6 +31,7 @@
#include <xen/version.h>
#include <xen/vmap.h>
#include <xen/stack-protector.h>
+#include <xen/static-evtchn.h>
#include <xen/trace.h>
#include <xen/libfdt/libfdt-xen.h>
#include <xen/acpi.h>
@@ -39,7 +40,6 @@
#include <asm/alternative.h>
#include <asm/dom0less-build.h>
#include <asm/page.h>
-#include <asm/static-evtchn.h>
#include <asm/current.h>
#include <asm/setup.h>
#include <asm/gic.h>
diff --git a/xen/arch/arm/static-evtchn.c b/xen/arch/arm/static-evtchn.c
deleted file mode 100644
index 49db08d5c6..0000000000
--- a/xen/arch/arm/static-evtchn.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#include <xen/event.h>
-
-#include <asm/static-evtchn.h>
-
-#define STATIC_EVTCHN_NODE_SIZE_CELLS 2
-
-static int __init get_evtchn_dt_property(const struct dt_device_node *np,
- uint32_t *port, uint32_t *phandle)
-{
- const __be32 *prop = NULL;
- uint32_t len;
-
- prop = dt_get_property(np, "xen,evtchn", &len);
- if ( !prop )
- {
- printk(XENLOG_ERR "xen,evtchn property should not be empty.\n");
- return -EINVAL;
- }
-
- if ( !len || len < dt_cells_to_size(STATIC_EVTCHN_NODE_SIZE_CELLS) )
- {
- printk(XENLOG_ERR "xen,evtchn property value is not valid.\n");
- return -EINVAL;
- }
-
- *port = dt_next_cell(1, &prop);
- *phandle = dt_next_cell(1, &prop);
-
- return 0;
-}
-
-static int __init alloc_domain_evtchn(struct dt_device_node *node)
-{
- int rc;
- uint32_t domU1_port, domU2_port, remote_phandle;
- struct dt_device_node *remote_node;
- const struct dt_device_node *p1_node, *p2_node;
- struct evtchn_alloc_unbound alloc_unbound;
- struct evtchn_bind_interdomain bind_interdomain;
- struct domain *d1 = NULL, *d2 = NULL;
-
- if ( !dt_device_is_compatible(node, "xen,evtchn-v1") )
- return 0;
-
- /*
- * Event channel is already created while parsing the other side of
- * evtchn node.
- */
- if ( dt_device_static_evtchn_created(node) )
- return 0;
-
- rc = get_evtchn_dt_property(node, &domU1_port, &remote_phandle);
- if ( rc )
- return rc;
-
- remote_node = dt_find_node_by_phandle(remote_phandle);
- if ( !remote_node )
- {
- printk(XENLOG_ERR
- "evtchn: could not find remote evtchn phandle\n");
- return -EINVAL;
- }
-
- rc = get_evtchn_dt_property(remote_node, &domU2_port, &remote_phandle);
- if ( rc )
- return rc;
-
- if ( node->phandle != remote_phandle )
- {
- printk(XENLOG_ERR "xen,evtchn property is not setup correctly.\n");
- return -EINVAL;
- }
-
- p1_node = dt_get_parent(node);
- if ( !p1_node )
- {
- printk(XENLOG_ERR "evtchn: evtchn parent node is NULL\n" );
- return -EINVAL;
- }
-
- p2_node = dt_get_parent(remote_node);
- if ( !p2_node )
- {
- printk(XENLOG_ERR "evtchn: remote parent node is NULL\n" );
- return -EINVAL;
- }
-
- d1 = get_domain_by_id(p1_node->used_by);
- d2 = get_domain_by_id(p2_node->used_by);
-
- if ( !d1 || !d2 )
- {
- printk(XENLOG_ERR "evtchn: could not find domains\n" );
- return -EINVAL;
- }
-
- alloc_unbound.dom = d1->domain_id;
- alloc_unbound.remote_dom = d2->domain_id;
-
- rc = evtchn_alloc_unbound(&alloc_unbound, domU1_port);
- if ( rc < 0 )
- {
- printk(XENLOG_ERR
- "evtchn_alloc_unbound() failure (Error %d) \n", rc);
- return rc;
- }
-
- bind_interdomain.remote_dom = d1->domain_id;
- bind_interdomain.remote_port = domU1_port;
-
- rc = evtchn_bind_interdomain(&bind_interdomain, d2, domU2_port);
- if ( rc < 0 )
- {
- printk(XENLOG_ERR
- "evtchn_bind_interdomain() failure (Error %d) \n", rc);
- return rc;
- }
-
- dt_device_set_static_evtchn_created(node);
- dt_device_set_static_evtchn_created(remote_node);
-
- return 0;
-}
-
-void __init alloc_static_evtchn(void)
-{
- struct dt_device_node *node, *evtchn_node;
- struct dt_device_node *chosen = dt_find_node_by_path("/chosen");
-
- BUG_ON(chosen == NULL);
-
- if ( hardware_domain )
- dt_device_set_used_by(chosen, hardware_domain->domain_id);
-
- dt_for_each_child_node(chosen, node)
- {
- if ( hardware_domain )
- {
- if ( alloc_domain_evtchn(node) != 0 )
- panic("Could not set up domains evtchn\n");
- }
-
- dt_for_each_child_node(node, evtchn_node)
- {
- if ( alloc_domain_evtchn(evtchn_node) != 0 )
- panic("Could not set up domains evtchn\n");
- }
- }
-}
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/xen/common/Kconfig b/xen/common/Kconfig
index 3d66d09397..0951d4c2f2 100644
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -162,6 +162,14 @@ config STATIC_MEMORY
If unsure, say N.
+config STATIC_EVTCHN
+ bool "Static event channel support on a dom0less system"
+ depends on DOM0LESS_BOOT && ARM
+ default y
+ help
+ This option enables establishing static event channel communication
+ between domains on a dom0less system (domU-domU as well as domU-dom0).
+
menu "Speculative hardening"
config INDIRECT_THUNK
diff --git a/xen/common/device-tree/Makefile b/xen/common/device-tree/Makefile
index ff54a8ef2b..57b9e6ca00 100644
--- a/xen/common/device-tree/Makefile
+++ b/xen/common/device-tree/Makefile
@@ -6,3 +6,4 @@ obj-$(CONFIG_DOM0LESS_BOOT) += dom0less-build.init.o
obj-$(CONFIG_OVERLAY_DTB) += dt-overlay.o
obj-y += intc.o
obj-$(CONFIG_DOMAIN_BUILD_HELPERS) += kernel.o
+obj-$(CONFIG_STATIC_EVTCHN) += static-evtchn.init.o
diff --git a/xen/common/device-tree/static-evtchn.c
b/xen/common/device-tree/static-evtchn.c
new file mode 100644
index 0000000000..8b82e6b3d8
--- /dev/null
+++ b/xen/common/device-tree/static-evtchn.c
@@ -0,0 +1,160 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <xen/event.h>
+#include <xen/static-evtchn.h>
+
+#define STATIC_EVTCHN_NODE_SIZE_CELLS 2
+
+static int __init get_evtchn_dt_property(const struct dt_device_node *np,
+ uint32_t *port, uint32_t *phandle)
+{
+ const __be32 *prop = NULL;
+ uint32_t len;
+
+ prop = dt_get_property(np, "xen,evtchn", &len);
+ if ( !prop )
+ {
+ printk(XENLOG_ERR "xen,evtchn property should not be empty.\n");
+ return -EINVAL;
+ }
+
+ if ( !len || len < dt_cells_to_size(STATIC_EVTCHN_NODE_SIZE_CELLS) )
+ {
+ printk(XENLOG_ERR "xen,evtchn property value is not valid.\n");
+ return -EINVAL;
+ }
+
+ *port = dt_next_cell(1, &prop);
+ *phandle = dt_next_cell(1, &prop);
+
+ return 0;
+}
+
+static int __init alloc_domain_evtchn(struct dt_device_node *node)
+{
+ int rc;
+ uint32_t domU1_port, domU2_port, remote_phandle;
+ struct dt_device_node *remote_node;
+ const struct dt_device_node *p1_node, *p2_node;
+ struct evtchn_alloc_unbound alloc_unbound;
+ struct evtchn_bind_interdomain bind_interdomain;
+ struct domain *d1 = NULL, *d2 = NULL;
+
+ if ( !dt_device_is_compatible(node, "xen,evtchn-v1") )
+ return 0;
+
+ /*
+ * Event channel is already created while parsing the other side of
+ * evtchn node.
+ */
+ if ( dt_device_static_evtchn_created(node) )
+ return 0;
+
+ rc = get_evtchn_dt_property(node, &domU1_port, &remote_phandle);
+ if ( rc )
+ return rc;
+
+ remote_node = dt_find_node_by_phandle(remote_phandle);
+ if ( !remote_node )
+ {
+ printk(XENLOG_ERR
+ "evtchn: could not find remote evtchn phandle\n");
+ return -EINVAL;
+ }
+
+ rc = get_evtchn_dt_property(remote_node, &domU2_port, &remote_phandle);
+ if ( rc )
+ return rc;
+
+ if ( node->phandle != remote_phandle )
+ {
+ printk(XENLOG_ERR "xen,evtchn property is not setup correctly.\n");
+ return -EINVAL;
+ }
+
+ p1_node = dt_get_parent(node);
+ if ( !p1_node )
+ {
+ printk(XENLOG_ERR "evtchn: evtchn parent node is NULL\n" );
+ return -EINVAL;
+ }
+
+ p2_node = dt_get_parent(remote_node);
+ if ( !p2_node )
+ {
+ printk(XENLOG_ERR "evtchn: remote parent node is NULL\n" );
+ return -EINVAL;
+ }
+
+ d1 = get_domain_by_id(p1_node->used_by);
+ d2 = get_domain_by_id(p2_node->used_by);
+
+ if ( !d1 || !d2 )
+ {
+ printk(XENLOG_ERR "evtchn: could not find domains\n" );
+ return -EINVAL;
+ }
+
+ alloc_unbound.dom = d1->domain_id;
+ alloc_unbound.remote_dom = d2->domain_id;
+
+ rc = evtchn_alloc_unbound(&alloc_unbound, domU1_port);
+ if ( rc < 0 )
+ {
+ printk(XENLOG_ERR
+ "evtchn_alloc_unbound() failure (Error %d) \n", rc);
+ return rc;
+ }
+
+ bind_interdomain.remote_dom = d1->domain_id;
+ bind_interdomain.remote_port = domU1_port;
+
+ rc = evtchn_bind_interdomain(&bind_interdomain, d2, domU2_port);
+ if ( rc < 0 )
+ {
+ printk(XENLOG_ERR
+ "evtchn_bind_interdomain() failure (Error %d) \n", rc);
+ return rc;
+ }
+
+ dt_device_set_static_evtchn_created(node);
+ dt_device_set_static_evtchn_created(remote_node);
+
+ return 0;
+}
+
+void __init alloc_static_evtchn(void)
+{
+ struct dt_device_node *node, *evtchn_node;
+ struct dt_device_node *chosen = dt_find_node_by_path("/chosen");
+
+ BUG_ON(chosen == NULL);
+
+ if ( hardware_domain )
+ dt_device_set_used_by(chosen, hardware_domain->domain_id);
+
+ dt_for_each_child_node(chosen, node)
+ {
+ if ( hardware_domain )
+ {
+ if ( alloc_domain_evtchn(node) != 0 )
+ panic("Could not set up domains evtchn\n");
+ }
+
+ dt_for_each_child_node(node, evtchn_node)
+ {
+ if ( alloc_domain_evtchn(evtchn_node) != 0 )
+ panic("Could not set up domains evtchn\n");
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/xen/static-evtchn.h b/xen/include/xen/static-evtchn.h
new file mode 100644
index 0000000000..31ae92741a
--- /dev/null
+++ b/xen/include/xen/static-evtchn.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef XEN_STATIC_EVTCHN_H
+#define XEN_STATIC_EVTCHN_H
+
+#ifdef CONFIG_STATIC_EVTCHN
+
+void alloc_static_evtchn(void);
+
+#else /* !CONFIG_STATIC_EVTCHN */
+
+static inline void alloc_static_evtchn(void) {};
+
+#endif /* CONFIG_STATIC_EVTCHN */
+
+#endif /* XEN_STATIC_EVTCHN_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |