|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFCv2 24/38] x86/hyperlaunch: convert create_dom0 to arch_create_dom
The only consumer of the function domain_cmdline_size() and the acpi_param
parameter is create_dom(). It is therefore reasonable to move
domain_cmdline_size() and the acpi_param parameter along with its parsing code
at the same time as create_dom0() is moved under the domain builder. While
moving create_dom0(), rename it to arch_create_dom() as the function is now
generalized.
Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
---
xen/arch/x86/domain-builder/Makefile | 2 +-
xen/arch/x86/domain-builder/domain.c | 180 +++++++++++++++++++++++++++
xen/arch/x86/setup.c | 174 +-------------------------
xen/include/xen/domain-builder.h | 3 +
4 files changed, 185 insertions(+), 174 deletions(-)
diff --git a/xen/arch/x86/domain-builder/Makefile
b/xen/arch/x86/domain-builder/Makefile
index 0c2e7085e21b..69a7c574a8d8 100644
--- a/xen/arch/x86/domain-builder/Makefile
+++ b/xen/arch/x86/domain-builder/Makefile
@@ -1 +1 @@
-obj-y += domain.init.o
+obj-y += domain.o
diff --git a/xen/arch/x86/domain-builder/domain.c
b/xen/arch/x86/domain-builder/domain.c
index d934b240229f..0a7b40c9a746 100644
--- a/xen/arch/x86/domain-builder/domain.c
+++ b/xen/arch/x86/domain-builder/domain.c
@@ -5,17 +5,25 @@
#include <xen/cpumask.h>
#include <xen/domain.h>
+#include <xen/domain-builder.h>
+#include <xen/err.h>
+#include <xen/grant_table.h>
#include <xen/init.h>
#include <xen/lib.h> /* get types.h for libefl.h */
#include <xen/libelf.h>
#include <xen/nodemask.h>
+#include <xen/param.h>
#include <xen/sched.h>
#include <public/bootfdt.h>
#include <asm/bootinfo.h>
+#include <asm/cpu-policy.h>
#include <asm/dom0_build.h>
+#include <asm/domain-builder.h>
+#include <asm/io_apic.h>
#include <asm/paging.h>
+#include <asm/pv/shim.h>
#include <asm/spec_ctrl.h>
unsigned int __init dom_max_vcpus(struct boot_domain *bd)
@@ -55,6 +63,48 @@ void __init domain_vcpus_create(struct domain *d)
domain_update_node_affinity(d);
}
+bool __read_mostly acpi_disabled;
+bool __initdata acpi_force;
+static char __initdata acpi_param[10] = "";
+
+static int __init cf_check parse_acpi_param(const char *s)
+{
+ /* Interpret the parameter for use within Xen. */
+ if ( !parse_bool(s, NULL) )
+ {
+ disable_acpi();
+ }
+ else if ( !strcmp(s, "force") )
+ {
+ acpi_force = true;
+ acpi_ht = 1;
+ acpi_disabled = false;
+ }
+ else if ( !strcmp(s, "ht") )
+ {
+ if ( !acpi_force )
+ disable_acpi();
+ acpi_ht = 1;
+ }
+ else if ( !strcmp(s, "noirq") )
+ {
+ acpi_noirq_set();
+ }
+ else if ( !strcmp(s, "verbose") )
+ {
+ opt_acpi_verbose = true;
+ return 0;
+ }
+ else
+ return -EINVAL;
+
+ /* Save the parameter so it can be propagated to domain0. */
+ safe_strcpy(acpi_param, s);
+
+ return 0;
+}
+custom_param("acpi", parse_acpi_param);
+
unsigned long __init dom_paging_pages(
const struct boot_domain *bd, unsigned long nr_pages)
{
@@ -141,6 +191,136 @@ unsigned long __init dom_compute_nr_pages(
return bd->mem_pages;
}
+static size_t __init domain_cmdline_size(const struct boot_info *bi,
+ const struct boot_domain *bd)
+{
+ size_t s = bi->kextra ? strlen(bi->kextra) : 0;
+
+
+ /*
+ * Bootloader cmdline takes precedence and replaces the DT provided one.
+ *
+ * In that case, fdt_cmdline is not be populated at all.
+ */
+ if ( bd->kernel->fdt_cmdline )
+ {
+ BUG_ON(!IS_ENABLED(CONFIG_DOMAIN_BUILDER));
+ s += builder_get_cmdline_size(bi, bd->kernel->cmdline_pa);
+ }
+ else if ( bd->kernel->cmdline_pa )
+ s += strlen(__va(bd->kernel->cmdline_pa));
+
+ if ( s == 0 )
+ return s;
+
+ /*
+ * Certain parameters from the Xen command line may be added to the dom0
+ * command line. Add additional space for the possible cases along with one
+ * extra char to hold \0.
+ */
+ s += strlen(" noapic") + strlen(" acpi=") + sizeof(acpi_param) + 1;
+
+ return s;
+}
+
+struct domain *__init arch_create_dom(
+ struct boot_info *bi, struct boot_domain *bd)
+{
+ char *cmdline = NULL;
+ size_t cmdline_size;
+ struct xen_domctl_createdomain dom0_cfg = {
+ .flags = IS_ENABLED(CONFIG_TBOOT) ? XEN_DOMCTL_CDF_s3_integrity : 0,
+ .max_evtchn_port = -1,
+ .max_grant_frames = -1,
+ .max_maptrack_frames = -1,
+ .grant_opts = XEN_DOMCTL_GRANT_version(opt_gnttab_max_version),
+ .max_vcpus = dom_max_vcpus(bd),
+ .arch = {
+ .misc_flags = opt_dom0_msr_relaxed ? XEN_X86_MSR_RELAXED : 0,
+ },
+ };
+ struct domain *d;
+
+ if ( opt_dom0_pvh ||
+ (bi->hyperlaunch_enabled && !(bd->mode & BUILD_MODE_PARAVIRT)) )
+ {
+ dom0_cfg.flags |= (XEN_DOMCTL_CDF_hvm |
+ ((hvm_hap_supported() && !opt_dom0_shadow) ?
+ XEN_DOMCTL_CDF_hap : 0));
+
+ dom0_cfg.arch.emulation_flags |=
+ XEN_X86_EMU_LAPIC | XEN_X86_EMU_IOAPIC | XEN_X86_EMU_VPCI;
+ }
+
+ if ( iommu_enabled && (bd->capabilities & DOMAIN_CAPS_HARDWARE) )
+ dom0_cfg.flags |= XEN_DOMCTL_CDF_iommu;
+
+ if ( bd->domid == DOMID_INVALID )
+ /* Create initial domain. Not d0 for pvshim. */
+ bd->domid = get_initial_domain_id();
+ d = domain_create(bd->domid, &dom0_cfg,
+ ((bd->capabilities & DOMAIN_CAPS_CONTROL) ? CDF_privileged : 0) |
+ ((bd->capabilities & DOMAIN_CAPS_HARDWARE) ? CDF_hardware : 0));
+ if ( IS_ERR(d) )
+ panic("Error creating d%u: %ld\n", bd->domid, PTR_ERR(d));
+
+ bd->d = d;
+
+ if ( has_dom0_caps(bd) )
+ init_dom0_cpuid_policy(bd->d);
+
+ if ( domain_vcpu0_create(bd) == NULL )
+ panic("Error creating %pdv0\n", d);
+
+ cmdline_size = domain_cmdline_size(bi, bd);
+ if ( cmdline_size )
+ {
+ if ( !(cmdline = xzalloc_array(char, cmdline_size)) )
+ panic("Error allocating cmdline buffer for %pd\n", d);
+
+ if ( bd->kernel->fdt_cmdline )
+ {
+ BUG_ON(!IS_ENABLED(CONFIG_DOMAIN_BUILDER));
+ builder_get_cmdline(
+ bi, bd->kernel->cmdline_pa, cmdline, cmdline_size);
+ }
+ else if ( bd->kernel->cmdline_pa )
+ strlcpy(cmdline,
+ cmdline_cook(__va(bd->kernel->cmdline_pa), bi->loader),
+ cmdline_size);
+
+ if ( bi->kextra )
+ /* kextra always includes exactly one leading space. */
+ strlcat(cmdline, bi->kextra, cmdline_size);
+
+ /* Append any extra parameters. */
+ if ( skip_ioapic_setup && !strstr(cmdline, "noapic") )
+ strlcat(cmdline, " noapic", cmdline_size);
+
+ if ( (strlen(acpi_param) == 0) && acpi_disabled )
+ {
+ printk("ACPI is disabled, notifying Domain 0 (acpi=off)\n");
+ safe_strcpy(acpi_param, "off");
+ }
+
+ if ( (strlen(acpi_param) != 0) && !strstr(cmdline, "acpi=") )
+ {
+ strlcat(cmdline, " acpi=", cmdline_size);
+ strlcat(cmdline, acpi_param, cmdline_size);
+ }
+ bd->kernel->cmdline_pa = 0;
+ bd->cmdline = cmdline;
+ }
+
+ if ( construct_dom0(bd) != 0 )
+ panic("Could not construct domain 0\n");
+
+ bd->cmdline = NULL;
+ xfree(cmdline);
+
+ return d;
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index b03284428bb3..2458a43902e6 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -251,48 +251,6 @@ static int __init cf_check parse_smap_param(const char *s)
}
custom_param("smap", parse_smap_param);
-bool __read_mostly acpi_disabled;
-bool __initdata acpi_force;
-static char __initdata acpi_param[10] = "";
-
-static int __init cf_check parse_acpi_param(const char *s)
-{
- /* Interpret the parameter for use within Xen. */
- if ( !parse_bool(s, NULL) )
- {
- disable_acpi();
- }
- else if ( !strcmp(s, "force") )
- {
- acpi_force = true;
- acpi_ht = 1;
- acpi_disabled = false;
- }
- else if ( !strcmp(s, "ht") )
- {
- if ( !acpi_force )
- disable_acpi();
- acpi_ht = 1;
- }
- else if ( !strcmp(s, "noirq") )
- {
- acpi_noirq_set();
- }
- else if ( !strcmp(s, "verbose") )
- {
- opt_acpi_verbose = true;
- return 0;
- }
- else
- return -EINVAL;
-
- /* Save the parameter so it can be propagated to domain0. */
- safe_strcpy(acpi_param, s);
-
- return 0;
-}
-custom_param("acpi", parse_acpi_param);
-
struct boot_info __initdata xen_boot_info = {
.loader = "unknown",
.cmdline = "",
@@ -982,136 +940,6 @@ static unsigned int __init copy_bios_e820(struct
e820entry *map, unsigned int li
return n;
}
-static size_t __init domain_cmdline_size(const struct boot_info *bi,
- const struct boot_domain *bd)
-{
- size_t s = bi->kextra ? strlen(bi->kextra) : 0;
-
-
- /*
- * Bootloader cmdline takes precedence and replaces the DT provided one.
- *
- * In that case, fdt_cmdline is not be populated at all.
- */
- if ( bd->kernel->fdt_cmdline )
- {
- BUG_ON(!IS_ENABLED(CONFIG_DOMAIN_BUILDER));
- s += builder_get_cmdline_size(bi, bd->kernel->cmdline_pa);
- }
- else if ( bd->kernel->cmdline_pa )
- s += strlen(__va(bd->kernel->cmdline_pa));
-
- if ( s == 0 )
- return s;
-
- /*
- * Certain parameters from the Xen command line may be added to the dom0
- * command line. Add additional space for the possible cases along with one
- * extra char to hold \0.
- */
- s += strlen(" noapic") + strlen(" acpi=") + sizeof(acpi_param) + 1;
-
- return s;
-}
-
-static struct domain *__init create_dom0(struct boot_info *bi)
-{
- char *cmdline = NULL;
- size_t cmdline_size;
- struct boot_domain *bd = &bi->domains[0];
- struct xen_domctl_createdomain dom0_cfg = {
- .flags = IS_ENABLED(CONFIG_TBOOT) ? XEN_DOMCTL_CDF_s3_integrity : 0,
- .max_evtchn_port = -1,
- .max_grant_frames = -1,
- .max_maptrack_frames = -1,
- .grant_opts = XEN_DOMCTL_GRANT_version(opt_gnttab_max_version),
- .max_vcpus = dom_max_vcpus(bd),
- .arch = {
- .misc_flags = opt_dom0_msr_relaxed ? XEN_X86_MSR_RELAXED : 0,
- },
- };
- struct domain *d;
-
- if ( opt_dom0_pvh ||
- (bi->hyperlaunch_enabled && !(bd->mode & BUILD_MODE_PARAVIRT)) )
- {
- dom0_cfg.flags |= (XEN_DOMCTL_CDF_hvm |
- ((hvm_hap_supported() && !opt_dom0_shadow) ?
- XEN_DOMCTL_CDF_hap : 0));
-
- dom0_cfg.arch.emulation_flags |=
- XEN_X86_EMU_LAPIC | XEN_X86_EMU_IOAPIC | XEN_X86_EMU_VPCI;
- }
-
- if ( iommu_enabled && (bd->capabilities & DOMAIN_CAPS_HARDWARE) )
- dom0_cfg.flags |= XEN_DOMCTL_CDF_iommu;
-
- if ( bd->domid == DOMID_INVALID )
- /* Create initial domain. Not d0 for pvshim. */
- bd->domid = get_initial_domain_id();
- d = domain_create(bd->domid, &dom0_cfg,
- ((bd->capabilities & DOMAIN_CAPS_CONTROL) ? CDF_privileged : 0) |
- ((bd->capabilities & DOMAIN_CAPS_HARDWARE) ? CDF_hardware : 0));
- if ( IS_ERR(d) )
- panic("Error creating d%u: %ld\n", bd->domid, PTR_ERR(d));
-
- bd->d = d;
-
- if ( has_dom0_caps(bd) )
- init_dom0_cpuid_policy(bd->d);
-
- if ( domain_vcpu0_create(bd) == NULL )
- panic("Error creating %pdv0\n", d);
-
- cmdline_size = domain_cmdline_size(bi, bd);
- if ( cmdline_size )
- {
- if ( !(cmdline = xzalloc_array(char, cmdline_size)) )
- panic("Error allocating cmdline buffer for %pd\n", d);
-
- if ( bd->kernel->fdt_cmdline )
- {
- BUG_ON(!IS_ENABLED(CONFIG_DOMAIN_BUILDER));
- builder_get_cmdline(
- bi, bd->kernel->cmdline_pa, cmdline, cmdline_size);
- }
- else if ( bd->kernel->cmdline_pa )
- strlcpy(cmdline,
- cmdline_cook(__va(bd->kernel->cmdline_pa), bi->loader),
- cmdline_size);
-
- if ( bi->kextra )
- /* kextra always includes exactly one leading space. */
- strlcat(cmdline, bi->kextra, cmdline_size);
-
- /* Append any extra parameters. */
- if ( skip_ioapic_setup && !strstr(cmdline, "noapic") )
- strlcat(cmdline, " noapic", cmdline_size);
-
- if ( (strlen(acpi_param) == 0) && acpi_disabled )
- {
- printk("ACPI is disabled, notifying Domain 0 (acpi=off)\n");
- safe_strcpy(acpi_param, "off");
- }
-
- if ( (strlen(acpi_param) != 0) && !strstr(cmdline, "acpi=") )
- {
- strlcat(cmdline, " acpi=", cmdline_size);
- strlcat(cmdline, acpi_param, cmdline_size);
- }
- bd->kernel->cmdline_pa = 0;
- bd->cmdline = cmdline;
- }
-
- if ( construct_dom0(bd) != 0 )
- panic("Could not construct domain 0\n");
-
- bd->cmdline = NULL;
- xfree(cmdline);
-
- return d;
-}
-
/* How much of the directmap is prebuilt at compile time. */
#define PREBUILT_MAP_LIMIT (1 << L2_PAGETABLE_SHIFT)
@@ -2198,7 +2026,7 @@ void asmlinkage __init noreturn __start_xen(void)
* 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.
*/
- dom0 = create_dom0(bi);
+ dom0 = arch_create_dom(bi, &bi->domains[0]);
if ( !dom0 )
panic("Could not set up DOM0 guest OS\n");
diff --git a/xen/include/xen/domain-builder.h b/xen/include/xen/domain-builder.h
index 79e4c50ddf85..a9df326682ac 100644
--- a/xen/include/xen/domain-builder.h
+++ b/xen/include/xen/domain-builder.h
@@ -40,4 +40,7 @@ unsigned int dom_max_vcpus(struct boot_domain *bd);
struct vcpu *domain_vcpu0_create(struct boot_domain *bd);
void domain_vcpus_create(struct domain *d);
+struct domain *arch_create_dom(
+ struct boot_info *bi, struct boot_domain *bd);
+
#endif /* __XEN_DOMAIN_BUILDER_H__ */
--
2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |