Implement construct_domain() function for RISC-V, which performs initial setup for the domain's first vCPU, loads the kernel, initrd, and device tree, and sets up guest CPU registers for boot.
It also creates additional vCPUs up to max_vcpus and assigns the device tree address and boot cpuid in registers. Signed-off-by: Oleksii Kurochko <[email protected]> --- xen/arch/riscv/domain-build.c | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 xen/arch/riscv/domain-build.c diff --git a/xen/arch/riscv/domain-build.c b/xen/arch/riscv/domain-build.c new file mode 100644 index 000000000000..0ce903a911ae --- /dev/null +++ b/xen/arch/riscv/domain-build.c @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include <xen/fdt-domain-build.h> +#include <xen/fdt-kernel.h> +#include <xen/init.h> +#include <xen/sched.h> + +#include <asm/current.h> +#include <asm/guest_access.h> + +int __init construct_domain(struct domain *d, struct kernel_info *kinfo) +{ + struct vcpu *v = d->vcpu[0]; + struct cpu_user_regs *regs = vcpu_guest_cpu_user_regs(v); + + BUG_ON(d->vcpu[0] == NULL); + BUG_ON(v->is_initialised); + + kernel_load(kinfo); + initrd_load(kinfo, copy_to_guest_phys); + dtb_load(kinfo, copy_to_guest_phys); + + regs->sepc = kinfo->entry; + + /* Guest boot cpuid = 0 */ + regs->a0 = 0; + regs->a1 = kinfo->dtb_paddr; + + for ( unsigned int i = 1; i < d->max_vcpus; i++ ) + { + if ( vcpu_create(d, i) == NULL ) + { + printk("Failed to allocate %pd v%d\n", d, i); + break; + } + + printk("Created vcpu %d for %pd\n", i, d); + } + + domain_update_node_affinity(d); + + v->is_initialised = 1; + clear_bit(_VPF_down, &v->pause_flags); + + return 0; +} -- 2.53.0
