Hi,
On 13/06/18 23:15, Stefano Stabellini wrote:
Similar to construct_dom0, construct_domU creates a barebone DomU guest.
Default to 1 max vcpu and 64MB of memory if not specified otherwise.
The device tree node passed as argument is compatible "xen,domU", see
docs/misc/arm/device-tree/booting.txt.
Allocate all vcpus on cpu0 initially.
I don't think this comment is true. __construct_domain will allocate
vCPUs in cycle.
Signed-off-by: Stefano Stabellini <stefa...@xilinx.com>
---
xen/arch/arm/domain_build.c | 37 +++++++++++++++++++++++++++++++++++++
xen/include/asm-arm/setup.h | 2 ++
2 files changed, 39 insertions(+)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index b31c563..02a7f94 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -2187,6 +2187,43 @@ int __init __construct_domain(struct domain *d, struct
kernel_info *kinfo)
return 0;
}
+int __init construct_domU(struct domain *d, struct dt_device_node *node)
+{
+ struct kernel_info kinfo = {};
+ int rc;
+ const char *cpus = NULL, *mem = NULL;
+
+ printk("*** LOADING DOMU ***\n");
+
+ d->max_vcpus = 1;
+ rc = dt_property_read_string(node, "cpus", &cpus);
+ if ( !rc )
+ d->max_vcpus = simple_strtoul(cpus, &cpus, 0);
+
+ kinfo.unassigned_mem = MB(64);
+ rc = dt_property_read_string(node, "mem", &mem);
+ if ( !rc )
+ kinfo.unassigned_mem = parse_size_and_unit(mem, &mem);
+
+ d->vcpu = xzalloc_array(struct vcpu *, d->max_vcpus);
+ if ( !d->vcpu )
+ return -ENOMEM;;
+ if ( alloc_vcpu(d, 0, 0) == NULL )
+ return -ENOMEM;
+ d->max_pages = ~0U;
+
+ kinfo.d = d;
+
+ rc = kernel_probe_domU(&kinfo, node);
+ if ( rc < 0 )
+ return rc;
+
+ d->arch.type = kinfo.type;
+ allocate_memory(d, &kinfo);
allocate_memory() will allocate direct mapped memory but you impose a
static memory layout for the guest. Both are not going to work very well
together.
So you probably want to extend allocate_memory to support allocating
memory for a given region.
+
+ return __construct_domain(d, &kinfo);
+}
+
int __init construct_dom0(struct domain *d)
{
struct kernel_info kinfo = {};
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index 903782f..e9f9905 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -2,6 +2,7 @@
#define __ARM_SETUP_H_
#include <public/version.h>
+#include <xen/device_tree.h>
#define MIN_FDT_ALIGN 8
#define MAX_FDT_SIZE SZ_2M
@@ -71,6 +72,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);
+int construct_domU(struct domain *d, struct dt_device_node *node);
void discard_initial_modules(void);
void dt_unreserved_regions(paddr_t s, paddr_t e,
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel