|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 27/27] 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 currently perform no
additional work but allow the generic dom0less code to build and run
on RISC-V.
Introduce max_init_domid as a runtime variable rather than a constant
so that it can be updated during dom0less domain creation.
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 in the public
RISC-V interface.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
Open questions:
- Move declaration of p2m_set_allocation() to xen/fdt-domain-build.h or
xen/dom0less-build.h as it is used in common code of Dom0less and
there is not too much sense in declaration of it for each arch which
supports Dom0less. It could be ifdef-ed in common header as, at the
momemnt, it is used only for Dom0less.
- Shouldn't declaration/defintion of max_init_domid move to common code
instead of having it for each architecture separately? If yes, then what
would be the best place.
---
---
xen/arch/riscv/Kconfig | 1 +
xen/arch/riscv/dom0less-build.c | 18 ++++++++++++++++++
xen/arch/riscv/domain-build.c | 13 +++++++++++++
xen/arch/riscv/include/asm/domain.h | 8 ++++++++
xen/arch/riscv/include/asm/p2m.h | 2 ++
xen/arch/riscv/include/asm/setup.h | 4 +++-
xen/arch/riscv/setup.c | 2 ++
xen/include/public/arch-riscv.h | 3 +++
8 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/xen/arch/riscv/Kconfig b/xen/arch/riscv/Kconfig
index 091510380949..abd579aa6a54 100644
--- a/xen/arch/riscv/Kconfig
+++ b/xen/arch/riscv/Kconfig
@@ -6,6 +6,7 @@ config RISCV
select GENERIC_BUG_FRAME
select GENERIC_UART_INIT
select HAS_DEVICE_TREE_DISCOVERY
+ select HAS_DOM0LESS
select HAS_PMAP
select HAS_UBSAN
select HAS_VMAP
diff --git a/xen/arch/riscv/dom0less-build.c b/xen/arch/riscv/dom0less-build.c
index 43c8bdc52300..865311ec7037 100644
--- a/xen/arch/riscv/dom0less-build.c
+++ b/xen/arch/riscv/dom0less-build.c
@@ -43,3 +43,21 @@ int __init make_arch_nodes(struct kernel_info *kinfo)
return 0;
}
+
+void __init set_domain_type(struct domain *d, struct kernel_info *kinfo)
+{
+ /* Nothing to do */
+}
+
+int __init arch_parse_dom0less_node(struct dt_device_node *node,
+ struct boot_domain *bd)
+{
+ /* Nothing to do */
+ return 0;
+}
+
+int __init arch_handle_passthrough_prop(struct kernel_info *kinfo,
+ struct dt_device_node *node)
+{
+ return 0;
+}
diff --git a/xen/arch/riscv/domain-build.c b/xen/arch/riscv/domain-build.c
index ae26faed09ed..20735f41d646 100644
--- a/xen/arch/riscv/domain-build.c
+++ b/xen/arch/riscv/domain-build.c
@@ -154,9 +154,22 @@ int __init make_cpus_node(const struct domain *d, void
*fdt)
return res;
}
+int __init construct_hwdom(struct kernel_info *kinfo,
+ const struct dt_device_node *node)
+{
+ 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)
+{
+ return -EOPNOTSUPP;
+}
diff --git a/xen/arch/riscv/include/asm/domain.h
b/xen/arch/riscv/include/asm/domain.h
index 21a3e6876f36..a8342ca7c5bf 100644
--- a/xen/arch/riscv/include/asm/domain.h
+++ b/xen/arch/riscv/include/asm/domain.h
@@ -20,6 +20,14 @@ struct hvm_domain
uint64_t params[HVM_NR_PARAMS];
};
+#ifdef CONFIG_RISCV_64
+#define is_32bit_domain(d) (0)
+#define is_64bit_domain(d) (1)
+#else
+#define is_32bit_domain(d) (1)
+#define is_64bit_domain(d) (0)
+#endif
+
struct arch_vcpu_io {
};
diff --git a/xen/arch/riscv/include/asm/p2m.h b/xen/arch/riscv/include/asm/p2m.h
index 4441c0400b83..d97c8d13ef6b 100644
--- a/xen/arch/riscv/include/asm/p2m.h
+++ b/xen/arch/riscv/include/asm/p2m.h
@@ -259,6 +259,8 @@ void p2m_ctxt_switch_from(struct vcpu *p);
void p2m_ctxt_switch_to(struct vcpu *n);
void p2m_handle_vmenter(void);
+int p2m_set_allocation(struct domain *d, unsigned long pages, bool *preempted);
+
#endif /* ASM__RISCV__P2M_H */
/*
diff --git a/xen/arch/riscv/include/asm/setup.h
b/xen/arch/riscv/include/asm/setup.h
index 1c23043f409f..2e3f8931d01b 100644
--- a/xen/arch/riscv/include/asm/setup.h
+++ b/xen/arch/riscv/include/asm/setup.h
@@ -5,11 +5,13 @@
#include <xen/types.h>
+#include <public/xen.h>
+
struct domain;
struct dt_device_node;
struct rangeset;
-#define max_init_domid (0)
+extern domid_t max_init_domid;
void setup_mm(void);
diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
index 5bc34e41fe55..513f94777f38 100644
--- a/xen/arch/riscv/setup.c
+++ b/xen/arch/riscv/setup.c
@@ -32,6 +32,8 @@
#include <asm/traps.h>
#include <asm/vsbi.h>
+domid_t max_init_domid = 0;
+
/* Xen stack for bringing up the first CPU. */
unsigned char __initdata cpu0_boot_stack[STACK_SIZE]
__aligned(STACK_SIZE);
diff --git a/xen/include/public/arch-riscv.h b/xen/include/public/arch-riscv.h
index 91cee3096041..3c0c786c57ac 100644
--- a/xen/include/public/arch-riscv.h
+++ b/xen/include/public/arch-riscv.h
@@ -58,6 +58,9 @@ typedef uint64_t xen_ulong_t;
#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE }
#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE }
+#define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000)
+#define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000)
+
struct vcpu_guest_context {
};
typedef struct vcpu_guest_context vcpu_guest_context_t;
--
2.53.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |