[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 14/15] xen/arm: call construct_domU from start_xen and start DomU VMs
Introduce support for the "xen,domU" compatible node on device tree. Create new DomU VMs based on the information found on device tree under "xen,domU". Introduce a simple global variable named max_init_domid to keep track of the initial allocated domids. Move the discard_initial_modules after DomUs have been built Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> --- xen/arch/arm/domain_build.c | 2 -- xen/arch/arm/setup.c | 35 ++++++++++++++++++++++++++++++++++- xen/include/asm-arm/setup.h | 2 ++ xen/include/asm-x86/setup.h | 2 ++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 97f14ca..e2d370f 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -2545,8 +2545,6 @@ int __init construct_dom0(struct domain *d) if ( rc < 0 ) return rc; - discard_initial_modules(); - return __construct_domain(d, &kinfo); } diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 98bdb24..3723704 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -63,6 +63,8 @@ static unsigned long opt_xenheap_megabytes __initdata; integer_param("xenheap_megabytes", opt_xenheap_megabytes); #endif +domid_t __read_mostly max_init_domid = 0; + static __used void init_done(void) { free_init_memory(); @@ -711,6 +713,8 @@ void __init start_xen(unsigned long boot_phys_offset, struct bootmodule *xen_bootmodule; struct domain *dom0; struct xen_domctl_createdomain dom0_cfg = {}; + struct dt_device_node *chosen; + struct dt_device_node *node; dcache_line_bytes = read_dcache_line_bytes(); @@ -860,7 +864,7 @@ void __init start_xen(unsigned long boot_phys_offset, dom0_cfg.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; dom0_cfg.arch.nr_spis = gic_number_lines() - 32; - dom0 = domain_create(0, &dom0_cfg); + dom0 = domain_create(max_init_domid++, &dom0_cfg); if ( IS_ERR(dom0) || (alloc_dom0_vcpu0(dom0) == NULL) ) panic("Error creating domain 0"); @@ -886,6 +890,35 @@ void __init start_xen(unsigned long boot_phys_offset, domain_unpause_by_systemcontroller(dom0); + chosen = dt_find_node_by_name(dt_host, "chosen"); + if ( chosen != NULL ) + { + dt_for_each_child_node(chosen, node) + { + struct domain *d; + struct xen_domctl_createdomain d_cfg = {}; + + if ( !dt_device_is_compatible(node, "xen,domU") ) + continue; + + d_cfg.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; + d_cfg.arch.nr_spis = gic_number_lines() - 32; + + d = domain_create(max_init_domid++, &d_cfg); + if ( IS_ERR(d)) + panic("Error creating domU"); + + d->is_privileged = 0; + d->target = NULL; + + if ( construct_domU(d, node) != 0) + printk("Could not set up DOMU guest OS"); + + domain_unpause_by_systemcontroller(d); + } + } + discard_initial_modules(); + /* Switch on to the dynamically allocated stack for the idle vcpu * since the static one we're running on is about to be freed. */ memcpy(idle_vcpu[0]->arch.cpu_info, get_cpu_info(), diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h index e9f9905..578f3b9 100644 --- a/xen/include/asm-arm/setup.h +++ b/xen/include/asm-arm/setup.h @@ -56,6 +56,8 @@ struct bootinfo { extern struct bootinfo bootinfo; +extern domid_t max_init_domid; + void arch_init_memory(void); void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len); diff --git a/xen/include/asm-x86/setup.h b/xen/include/asm-x86/setup.h index 19232af..2fb9529 100644 --- a/xen/include/asm-x86/setup.h +++ b/xen/include/asm-x86/setup.h @@ -73,4 +73,6 @@ extern bool opt_dom0_shadow; #endif extern bool dom0_pvh; +#define max_init_domid (1) + #endif -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |