|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4 25/25] xen/riscv: add initial dom0less infrastructure support
Enable dom0less support for RISC-V by selecting HAS_DOM0LESS and
providing the minimal architecture hooks required by the common
dom0less infrastructure.
Add stub implementations for architecture-specific helpers used when
building domains from the device tree. These allow the generic
dom0less code to build and let a basic DomU be constructed on RISC-V.
construct_hwdom() and make_hypervisor_node() are still stubs returning
an error: Dom0/hwdom construction isn't supported yet, and the
hypervisor node generation (needed by domains with
DOM0LESS_ENHANCED_NO_XS set) is not implemented. Both are marked with
a TODO and are not reached by the currently supported configurations.
Provide missing helpers and definitions required by the domain
construction code, including domain bitness helpers and the
p2m_set_allocation() prototype.
Additionally define the guest magic memory region (GUEST_MAGIC_BASE /
GUEST_MAGIC_SIZE) in asm/guest-layout.h. The base is arbitrary; the
only constraint is that the region must not overlap guest RAM or the
emulated device regions. It is placed in the unused gap below
GUEST_RAM0_BASE (0x80000000); the constraints are documented next to
the #define-s.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
Changes in v4:
- Reword the description: the stubs do not let dom0less fully "run"
since construct_hwdom() and make_hypervisor_node() return an error;
spell out these limitations instead.
- Add a TODO comment to construct_hwdom() explaining that Dom0/hwdom
construction isn't supported yet.
- Add a TODO comment to make_hypervisor_node() explaining that
returning an error breaks building of domains with
DOM0LESS_ENHANCED_NO_XS set, and why that is harmless for now.
- Document the constraints on GUEST_MAGIC_BASE/GUEST_MAGIC_SIZE next
to the #define-s and drop the QEMU-based justification (QEMU is not
involved); the base is simply an arbitrary non-overlapping address.
Changes in v3:
- Add /* Nothing specific to do for now */ comment to
arch_handle_passthrough_prop().
- Use _ULL() instead of xen_mk_ullong() for GUEST_MAGIC_BASE and
GUEST_MAGIC_SIZE (xen_mk_ullong() is intended for public headers only).
- Fix GUEST_MAGIC_BASE from 0x39000000 to 0x79000000 to avoid the
QEMU RISC-V virt machine PCIE_ECAM range.
- Drop CONFIG_STATIC_MEMORY=n from the CI randconfig; now redundant
since STATIC_MEMORY depends on HAS_STATIC_MEMORY which RISC-V does
not select.
Changes in v2:
- Move declaration of p2m_set_allocation() to p2m-common.h.
- Add __initdata for max_init_domid and drop initalizer for it.
- Add CONFIG_STATIC_MEMORY=n to CI's randconfig to avoid
compilation error because of guest_physmap_add_pages()
isn't provided.
---
xen/arch/riscv/Kconfig | 2 ++
xen/arch/riscv/dom0less-build.c | 7 ++++++
xen/arch/riscv/domain-build.c | 28 +++++++++++++++++++++++
xen/arch/riscv/include/asm/guest-layout.h | 12 ++++++++++
4 files changed, 49 insertions(+)
diff --git a/xen/arch/riscv/Kconfig b/xen/arch/riscv/Kconfig
index 48520588fe40..d8a348c0cf07 100644
--- a/xen/arch/riscv/Kconfig
+++ b/xen/arch/riscv/Kconfig
@@ -6,6 +6,8 @@ config RISCV
select GENERIC_BUG_FRAME
select GENERIC_UART_INIT
select HAS_DEVICE_TREE_DISCOVERY
+ select HAS_DOM0LESS
+ select HAS_DOMAIN_TYPE
select HAS_EX_TABLE
select HAS_PMAP
select HAS_UBSAN
diff --git a/xen/arch/riscv/dom0less-build.c b/xen/arch/riscv/dom0less-build.c
index d1a51b92936a..0801d7e25059 100644
--- a/xen/arch/riscv/dom0less-build.c
+++ b/xen/arch/riscv/dom0less-build.c
@@ -102,3 +102,10 @@ int __init arch_parse_dom0less_node(struct dt_device_node
*node,
return 0;
}
+
+int __init arch_handle_passthrough_prop(struct kernel_info *kinfo,
+ struct dt_device_node *node)
+{
+ /* Nothing specific to do for now */
+ return 0;
+}
diff --git a/xen/arch/riscv/domain-build.c b/xen/arch/riscv/domain-build.c
index 54ecd301c49c..84923b8f7b10 100644
--- a/xen/arch/riscv/domain-build.c
+++ b/xen/arch/riscv/domain-build.c
@@ -156,9 +156,37 @@ int __init make_cpus_node(const struct domain *d, struct
kernel_info *kinfo)
return fdt_end_node(fdt);
}
+int __init construct_hwdom(struct kernel_info *kinfo,
+ const struct dt_device_node *node)
+{
+ /*
+ * TODO: Dom0/hwdom construction isn't supported on RISC-V yet, so this
+ * is a stub returning an error. It must be implemented before a hardware
+ * domain can be built from the device tree.
+ */
+
+ return -EOPNOTSUPP;
+}
+
int __init make_timer_node(const struct kernel_info *kinfo)
{
/* There is no need for timer node for RISC-V. */
return 0;
}
+
+int __init make_hypervisor_node(struct domain *d,
+ const struct kernel_info *kinfo,
+ int addrcells, int sizecells)
+{
+ /*
+ * TODO: Generating the hypervisor node isn't implemented yet. Returning
+ * an error here breaks building of any domain (DomU included) whose
+ * dom0less_feature has DOM0LESS_ENHANCED_NO_XS set. This is harmless for
+ * now because Dom0/hwdom construction isn't supported on RISC-V yet
+ * either, and no RISC-V DomU sets that flag, so this path is never taken.
+ * It must be implemented before DOM0LESS_ENHANCED_NO_XS is used.
+ */
+
+ return -EOPNOTSUPP;
+}
diff --git a/xen/arch/riscv/include/asm/guest-layout.h
b/xen/arch/riscv/include/asm/guest-layout.h
index 90603f06bb91..add42d566597 100644
--- a/xen/arch/riscv/include/asm/guest-layout.h
+++ b/xen/arch/riscv/include/asm/guest-layout.h
@@ -32,4 +32,16 @@
#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE }
#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE }
+/*
+ * The guest magic region holds Xen-reserved pages mapped into the guest's
+ * physical address space (shared info, grant table, etc.). The only real
+ * constraint is that the GUEST_MAGIC_SIZE-byte region must not overlap
+ * guest RAM (the GUEST_RAMx banks) or the emulated device regions defined
+ * above; the exact base is otherwise arbitrary. Here it is placed in the
+ * unused gap below GUEST_RAM0_BASE (0x80000000), but a hole after a RAM
+ * bank would work equally well.
+ */
+#define GUEST_MAGIC_BASE _UL(0x79000000)
+#define GUEST_MAGIC_SIZE _UL(0x01000000)
+
#endif /* ASM_RISCV_GUEST_LAYOUT_H */
--
2.54.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |