diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 4707f4213b..8ae15481ec 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -2306,6 +2307,51 @@ static int __init construct_domain(struct domain *d, struct kernel_info *kinfo) return 0; } +static int __init construct_domU(struct domain *d, + const struct dt_device_node *node) +{ + return -ENOSYS; +} + +void __init create_domUs(void) +{ + struct dt_device_node *node; + const struct dt_device_node *chosen = dt_find_node_by_path("/chosen"); + + BUG_ON(chosen == NULL); + dt_for_each_child_node(chosen, node) + { + struct domain *d; + struct xen_domctl_createdomain d_cfg = { + .arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE, + .arch.nr_spis = 0, + .flags = XEN_DOMCTL_CDF_hvm_guest | XEN_DOMCTL_CDF_hap, + .max_vcpus = 1, + .max_evtchn_port = -1, + .max_grant_frames = 64, + .max_maptrack_frames = 1024, + }; + + if ( !dt_device_is_compatible(node, "xen,domain") ) + continue; + + if ( dt_property_read_bool(node, "vpl011") ) + d_cfg.arch.nr_spis = GUEST_VPL011_SPI - 32 + 1; + dt_property_read_u32(node, "cpus", &d_cfg.max_vcpus); + + d = domain_create(++max_init_domid, &d_cfg, false); + if ( IS_ERR(d) ) + panic("Error creating domain %s", dt_node_name(node)); + + d->is_console = true; + + if ( construct_domU(d, node) != 0 ) + panic("Could not set up domain %s", dt_node_name(node)); + + domain_unpause_by_systemcontroller(d); + } +} + int __init construct_dom0(struct domain *d) { struct kernel_info kinfo = {}; @@ -2356,10 +2402,7 @@ int __init construct_dom0(struct domain *d) if ( rc < 0 ) return rc; - rc = construct_domain(d, &kinfo); - discard_initial_modules(); - - return rc; + return construct_domain(d, &kinfo); } /* diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index f4e403a88b..e83221ab79 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -64,11 +64,14 @@ static unsigned long opt_xenheap_megabytes __initdata; integer_param("xenheap_megabytes", opt_xenheap_megabytes); #endif +domid_t __read_mostly max_init_domid; + static __used void init_done(void) { /* Must be done past setting system_state. */ unregister_init_virtual_region(); + discard_initial_modules(); free_init_memory(); startup_cpu_idle_loop(); } @@ -964,6 +967,8 @@ void __init start_xen(unsigned long boot_phys_offset, system_state = SYS_STATE_active; + create_domUs(); + domain_unpause_by_systemcontroller(dom0); /* Switch on to the dynamically allocated stack for the idle vcpu diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h index 5418f92112..48187e1e7c 100644 --- a/xen/include/asm-arm/setup.h +++ b/xen/include/asm-arm/setup.h @@ -75,6 +75,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); @@ -91,6 +93,7 @@ void acpi_create_efi_mmap_table(struct domain *d, int acpi_make_efi_nodes(void *fdt, struct membank tbl_add[]); int construct_dom0(struct domain *d); +void create_domUs(void); void discard_initial_modules(void); void dt_unreserved_regions(paddr_t s, paddr_t e, diff --git a/xen/include/asm-x86/setup.h b/xen/include/asm-x86/setup.h index 42fddebcc8..1c8078340d 100644 --- a/xen/include/asm-x86/setup.h +++ b/xen/include/asm-x86/setup.h @@ -66,4 +66,6 @@ extern bool opt_dom0_shadow; #endif extern bool dom0_pvh; +#define max_init_domid (0) + #endif