In a follow-up patch we will need to unallocate the boot modules
before heap_init_late() is called.
The modules will contain the domUs kernel and initramfs. Therefore Xen
will need to create extra domUs (used by dom0less) before heap_init_late().
This has two consequences on dom0less:
1) Domains will not be unpaused as soon as they are created but
once all have been created. However, Xen doesn't guarantee an order
to unpause, so this is not something one could rely on.
2) The memory allocated for a domU will not be scrubbed anymore when an
admin select bootscrub=on. This is not something we advertised, but if
this is a concern we can introduce either force scrub for all domUs or
a per-domain flag in the DT. The behavior for bootscrub=off and
bootscrub=idle (default) has not changed.
This is part of XSA-372 / CVE-2021-28693.
Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Tested-by: Stefano Stabellini <sstabellini@kernel.org>
if ( construct_domU(d, node) != 0 )
panic("Could not set up domain %s\n", dt_node_name(node));
-
- domain_unpause_by_systemcontroller(d);
}
}
return construct_domain(d, &kinfo);
}
-struct domain* __init create_dom0(void)
+void __init create_dom0(void)
{
struct domain *dom0;
struct xen_domctl_createdomain dom0_cfg = {
if ( construct_dom0(dom0) != 0)
panic("Could not set up DOM0 guest OS\n");
-
- return dom0;
}
/*
int cpus, i;
const char *cmdline;
struct bootmodule *xen_bootmodule;
- struct domain *dom0 = NULL;
+ struct domain *d;
int rc;
dcache_line_bytes = read_dcache_line_bytes();
/* Create initial domain 0. */
if ( !is_dom0less_mode() )
- dom0 = create_dom0();
+ create_dom0();
else
printk(XENLOG_INFO "Xen dom0less mode detected\n");
+ if ( acpi_disabled )
+ create_domUs();
+
heap_init_late();
init_trace_bufs();
system_state = SYS_STATE_active;
- if ( acpi_disabled )
- create_domUs();
-
- if ( dom0 )
- domain_unpause_by_systemcontroller(dom0);
+ for_each_domain( d )
+ domain_unpause_by_systemcontroller(d);
/* Switch on to the dynamically allocated stack for the idle vcpu
* since the static one we're running on is about to be freed. */
int acpi_make_efi_nodes(void *fdt, struct membank tbl_add[]);
void create_domUs(void);
-struct domain* create_dom0(void);
+void create_dom0(void);
void discard_initial_modules(void);
void fw_unreserved_regions(paddr_t s, paddr_t e,