mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/cpuid: Split dom0 handling out of init_domain_cpuid_policy()
To implement dom0-cpuid= support, the special cases would need extending. However there is already a problem with late hwdom where the special cases override toolstack settings, which is unintended and poor behaviour. Introduce a new init_dom0_cpuid_policy() for the purpose, moving the ITSC and ARCH_CAPS logic. The is_hardware_domain() can be dropped, and for now there is no need to rerun recalculate_cpuid_policy(); this is a relatively expensive operation, and will become more-so over time. Rearrange the logic in create_dom0() to make room for a call to init_dom0_cpuid_policy(). The AMX plans for having variable sized XSAVE states require that modifications to the policy happen before vCPUs are created. Additionally, factor out domid into a variable so we can be slightly more correct in the case of a failure, and also print the error from domain_create(). This will at least help distinguish -EINVAL from -ENOMEM. No practical change in behaviour. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
b1e37d8402
commit
c17072fc16
3 files changed
+29
-14
No files matched your search
+15
-10
@@ -727,23 +727,28 @@ int init_domain_cpuid_policy(struct domain *d)
|
||||
if ( !p )
|
||||
return -ENOMEM;
|
||||
|
||||
/* The hardware domain can't migrate. Give it ITSC if available. */
|
||||
if ( is_hardware_domain(d) )
|
||||
p->extd.itsc = cpu_has_itsc;
|
||||
d->arch.cpuid = p;
|
||||
|
||||
recalculate_cpuid_policy(d);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init init_dom0_cpuid_policy(struct domain *d)
|
||||
{
|
||||
struct cpuid_policy *p = d->arch.cpuid;
|
||||
|
||||
/* dom0 can't migrate. Give it ITSC if available. */
|
||||
if ( cpu_has_itsc )
|
||||
p->extd.itsc = true;
|
||||
|
||||
/*
|
||||
* Expose the "hardware speculation behaviour" bits of ARCH_CAPS to dom0,
|
||||
* so dom0 can turn off workarounds as appropriate. Temporary, until the
|
||||
* domain policy logic gains a better understanding of MSRs.
|
||||
*/
|
||||
if ( is_hardware_domain(d) && cpu_has_arch_caps )
|
||||
if ( cpu_has_arch_caps )
|
||||
p->feat.arch_caps = true;
|
||||
|
||||
d->arch.cpuid = p;
|
||||
|
||||
recalculate_cpuid_policy(d);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void guest_cpuid(const struct vcpu *v, uint32_t leaf,
|
||||
|
||||
@@ -59,6 +59,9 @@ bool recheck_cpu_features(unsigned int cpu);
|
||||
/* Allocate and initialise a CPUID policy suitable for the domain. */
|
||||
int init_domain_cpuid_policy(struct domain *d);
|
||||
|
||||
/* Apply dom0-specific tweaks to the CPUID policy. */
|
||||
void init_dom0_cpuid_policy(struct domain *d);
|
||||
|
||||
/* Clamp the CPUID policy to reality. */
|
||||
void recalculate_cpuid_policy(struct domain *d);
|
||||
|
||||
|
||||
+11
-4
@@ -772,6 +772,7 @@ static struct domain *__init create_dom0(const module_t *image,
|
||||
};
|
||||
struct domain *d;
|
||||
char *cmdline;
|
||||
domid_t domid;
|
||||
|
||||
if ( opt_dom0_pvh )
|
||||
{
|
||||
@@ -786,10 +787,16 @@ static struct domain *__init create_dom0(const module_t *image,
|
||||
if ( iommu_enabled )
|
||||
dom0_cfg.flags |= XEN_DOMCTL_CDF_iommu;
|
||||
|
||||
/* Create initial domain 0. */
|
||||
d = domain_create(get_initial_domain_id(), &dom0_cfg, !pv_shim);
|
||||
if ( IS_ERR(d) || (alloc_dom0_vcpu0(d) == NULL) )
|
||||
panic("Error creating domain 0\n");
|
||||
/* Create initial domain. Not d0 for pvshim. */
|
||||
domid = get_initial_domain_id();
|
||||
d = domain_create(domid, &dom0_cfg, !pv_shim);
|
||||
if ( IS_ERR(d) )
|
||||
panic("Error creating d%u: %ld\n", domid, PTR_ERR(d));
|
||||
|
||||
init_dom0_cpuid_policy(d);
|
||||
|
||||
if ( alloc_dom0_vcpu0(d) == NULL )
|
||||
panic("Error creating d%uv0\n", domid);
|
||||
|
||||
/* Grab the DOM0 command line. */
|
||||
cmdline = image->string ? __va(image->string) : NULL;
|
||||
|
||||