|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 11/18] x86: initial conversion to domain builder
On 06.07.2022 23:04, Daniel P. Smith wrote:
> This commit is the first step in adopting domain builder. It goes through the
> dom0 creation and construction functions, converting them over to consume
> struct boot_domaain and changes the startup sequence to use the domain builder
> to create and construct dom0.
>
> Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
> Reviewed-by: Christopher Clark <christopher.clark@xxxxxxxxxx>
> ---
> xen/arch/x86/dom0_build.c | 30 +++----
> xen/arch/x86/hvm/dom0_build.c | 10 +--
> xen/arch/x86/include/asm/dom0_build.h | 8 +-
> xen/arch/x86/include/asm/setup.h | 5 +-
> xen/arch/x86/pv/dom0_build.c | 39 ++++-----
> xen/arch/x86/setup.c | 114 +++++++++++++++-----------
> 6 files changed, 109 insertions(+), 97 deletions(-)
>
> diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
> index e44f7f3c43..216c9e3590 100644
> --- a/xen/arch/x86/dom0_build.c
> +++ b/xen/arch/x86/dom0_build.c
> @@ -6,6 +6,7 @@
>
> #include <xen/bootdomain.h>
> #include <xen/bootinfo.h>
> +#include <xen/domain_builder.h>
> #include <xen/init.h>
> #include <xen/iocap.h>
> #include <xen/libelf.h>
> @@ -556,31 +557,32 @@ int __init dom0_setup_permissions(struct domain *d)
> return rc;
> }
>
> -int __init construct_dom0(
> - struct domain *d, const struct boot_module *image,
> - struct boot_module *initrd, char *cmdline)
> +int __init construct_domain(struct boot_domain *bd)
> {
> - int rc;
> + int rc = 0;
>
> /* Sanity! */
> - BUG_ON(!pv_shim && d->domain_id != 0);
> - BUG_ON(d->vcpu[0] == NULL);
> - BUG_ON(d->vcpu[0]->is_initialised);
> + BUG_ON(!pv_shim && bd->domid != 0);
> + BUG_ON(bd->domain->vcpu[0] == NULL);
> + BUG_ON(bd->domain->vcpu[0]->is_initialised);
>
> process_pending_softirqs();
>
> - if ( is_hvm_domain(d) )
> - rc = dom0_construct_pvh(d, image, initrd, cmdline);
> - else if ( is_pv_domain(d) )
> - rc = dom0_construct_pv(d, image, initrd, cmdline);
> - else
> - panic("Cannot construct Dom0. No guest interface available\n");
> + if ( builder_is_initdom(bd) )
> + {
> + if ( is_hvm_domain(bd->domain) )
> + rc = dom0_construct_pvh(bd);
> + else if ( is_pv_domain(bd->domain) )
> + rc = dom0_construct_pv(bd);
> + else
> + panic("Cannot construct Dom0. No guest interface available\n");
> + }
Isn't there an "else" missing here, even if just to ASSERT_UNREACHABLE()
and set rc to, say, -EOPNOTSUPP?
> @@ -311,11 +310,12 @@ int __init dom0_construct_pv(
> unsigned long count;
> struct page_info *page = NULL;
> start_info_t *si;
> + struct domain *d = bd->domain;
> struct vcpu *v = d->vcpu[0];
> - void *image_base = bootstrap_map(image);
> - unsigned long image_len = image->size;
> - void *image_start = image_base + image->arch->headroom;
> - unsigned long initrd_len = initrd ? initrd->size : 0;
> + void *image_base = bootstrap_map(bd->kernel);
> + unsigned long image_len = bd->kernel->size;
> + void *image_start = image_base + bd->kernel->arch->headroom;
> + unsigned long initrd_len = bd->ramdisk ? bd->ramdisk->size : 0;
> l4_pgentry_t *l4tab = NULL, *l4start = NULL;
> l3_pgentry_t *l3tab = NULL, *l3start = NULL;
> l2_pgentry_t *l2tab = NULL, *l2start = NULL;
> @@ -355,7 +355,7 @@ int __init dom0_construct_pv(
> d->max_pages = ~0U;
>
> if ( (rc =
> - bzimage_parse(image_base, &image_start, image->arch->headroom,
> + bzimage_parse(image_base, &image_start, bd->kernel->arch->headroom,
> &image_len)) != 0 )
> return rc;
>
> @@ -545,7 +545,7 @@ int __init dom0_construct_pv(
> initrd_pfn = vinitrd_start ?
> (vinitrd_start - v_start) >> PAGE_SHIFT :
> domain_tot_pages(d);
> - initrd_mfn = mfn = mfn_x(initrd->mfn);
> + initrd_mfn = mfn = mfn_x(bd->ramdisk->mfn);
> count = PFN_UP(initrd_len);
> if ( d->arch.physaddr_bitsize &&
> ((mfn + count - 1) >> (d->arch.physaddr_bitsize - PAGE_SHIFT)) )
> @@ -560,13 +560,13 @@ int __init dom0_construct_pv(
> free_domheap_pages(page, order);
> page += 1UL << order;
> }
> - memcpy(page_to_virt(page), maddr_to_virt(initrd->start),
> + memcpy(page_to_virt(page), maddr_to_virt(bd->ramdisk->start),
> initrd_len);
> - mpt_alloc = initrd->start;
> + mpt_alloc = bd->ramdisk->start;
> init_domheap_pages(mpt_alloc,
> mpt_alloc + PAGE_ALIGN(initrd_len));
> - bootmodule_update_mfn(initrd, page_to_mfn(page));
> - initrd_mfn = mfn_x(initrd->mfn);
> + bootmodule_update_mfn(bd->ramdisk, page_to_mfn(page));
> + initrd_mfn = mfn_x(bd->ramdisk->mfn);
> }
> else
> {
> @@ -574,7 +574,7 @@ int __init dom0_construct_pv(
> if ( assign_pages(mfn_to_page(_mfn(mfn++)), 1, d, 0) )
> BUG();
> }
> - initrd->size = 0;
> + bd->ramdisk->size = 0;
>From an abstract pov: Is it legitimate to alter values under bd-> ? I
would have assumed bd and everything under it is r/o at this point
(and could/should be const-qualified).
> @@ -272,6 +271,24 @@ static int __init cf_check parse_acpi_param(const char
> *s)
> }
> custom_param("acpi", parse_acpi_param);
>
> +void __init arch_builder_apply_cmdline(
> + struct boot_info *info, struct boot_domain *bd)
> +{
> + if ( skip_ioapic_setup && !strstr(bd->kernel->string.bytes, "noapic") )
> + strlcat(bd->kernel->string.bytes, " noapic", MAX_GUEST_CMDLINE);
> + if ( (strlen(acpi_param) == 0) && acpi_disabled )
> + {
> + printk("ACPI is disabled, notifying Domain 0 (acpi=off)\n");
> + strlcpy(acpi_param, "off", sizeof(acpi_param));
> + }
> + if ( (strlen(acpi_param) != 0) &&
> + !strstr(bd->kernel->string.bytes, "acpi=") )
> + {
> + strlcat(bd->kernel->string.bytes, " acpi=", MAX_GUEST_CMDLINE);
> + strlcat(bd->kernel->string.bytes, acpi_param, MAX_GUEST_CMDLINE);
> + }
> +}
This duplicates existing code rather than replacing it. How do
you envision the two to remain in sync? Such things should live in
exactly one place imo.
> @@ -816,7 +831,7 @@ static struct domain *__init create_dom0(const struct
> boot_info *bi)
> write_cr4(read_cr4() & ~X86_CR4_SMAP);
> }
>
> - if ( construct_dom0(d, image, initrd, cmdline) != 0 )
> + if ( construct_domain(bd) != 0 )
> panic("Could not construct domain 0\n");
You leave the log message text in place here, but ...
> @@ -1905,22 +1912,29 @@ void __init noreturn __start_xen(unsigned long bi_p)
> cpu_has_nx ? XENLOG_INFO : XENLOG_WARNING "Warning: ",
> cpu_has_nx ? "" : "not ");
>
> - initrdidx = bootmodule_next_idx_by_kind(boot_info, BOOTMOD_UNKNOWN, 0);
> - if ( initrdidx < boot_info->nr_mods )
> - boot_info->mods[initrdidx].kind = BOOTMOD_RAMDISK;
> -
> - if ( bootmodule_count_by_kind(boot_info, BOOTMOD_UNKNOWN) > 1 )
> - printk(XENLOG_WARNING
> - "Multiple initrd candidates, picking module #%u\n",
> - initrdidx);
> -
> /*
> - * We're going to setup domain0 using the module(s) that we stashed
> safely
> - * above our heap. The second module, if present, is an initrd ramdisk.
> + * Boot description not provided, check to see if there are any remaining
> + * boot modules, the first one found will be provided as the ramdisk.
> */
> - dom0 = create_dom0(boot_info);
> + if ( ! boot_info->builder->fdt_enabled )
> + {
> + initrdidx = bootmodule_next_idx_by_kind(boot_info, BOOTMOD_UNKNOWN,
> 0);
> + if ( initrdidx < boot_info->nr_mods )
> + {
> + boot_info->builder->domains[0].ramdisk =
> &boot_info->mods[initrdidx];
> + boot_info->mods[initrdidx].kind = BOOTMOD_RAMDISK;
> + }
> + if ( bootmodule_count_by_kind(boot_info, BOOTMOD_UNKNOWN) > 1 )
> + printk(XENLOG_WARNING
> + "Multiple initrd candidates, picking module #%u\n",
> + initrdidx);
> + }
> +
> + builder_create_domains(boot_info);
> +
> + dom0 = builder_get_hwdom(boot_info);
> if ( !dom0 )
> - panic("Could not set up DOM0 guest OS\n");
> + panic("No hardware domain was built\n");
... you change it here, neglecting that in the late-hwdom case what is
being built here is only Dom0, not hwdom. This may also affect the name
of the function that you call.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |