mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/cpuid: Introduce dom0-cpuid command line option
Specifically, this lets the user opt in to non-default features.
Collect all dom0 settings together in dom0_{en,dis}able_feat[], and apply it
to dom0's policy when other tweaks are being made.
As recalculate_cpuid_policy() is an expensive action, and dom0-cpuid= is
likely to only be used by the x86 maintainers for development purposes, forgo
the recalculation in the general case.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
94c3df9188
commit
5bd2b82df2
2 files changed
+53
No files matched your search
@@ -801,6 +801,22 @@ Controls for how dom0 is constructed on x86 systems.
|
||||
|
||||
If using this option is necessary to fix an issue, please report a bug.
|
||||
|
||||
### dom0-cpuid
|
||||
= List of comma separated booleans
|
||||
|
||||
Applicability: x86
|
||||
|
||||
This option allows for fine tuning of the facilities dom0 will use, after
|
||||
accounting for hardware capabilities and Xen settings as enumerated via CPUID.
|
||||
|
||||
Options are accepted in positive and negative form, to enable or disable
|
||||
specific features. All selections via this mechanism are subject to normal
|
||||
CPU Policy safety and dependency logic.
|
||||
|
||||
This option is intended for developers to opt dom0 into non-default features,
|
||||
and is not intended for use in production circumstances. If using this option
|
||||
is necessary to fix an issue, please report a bug.
|
||||
|
||||
### dom0-iommu
|
||||
= List of [ passthrough=<bool>, strict=<bool>, map-inclusive=<bool>,
|
||||
map-reserved=<bool>, none ]
|
||||
|
||||
@@ -116,6 +116,24 @@ static int __init parse_xen_cpuid(const char *s)
|
||||
}
|
||||
custom_param("cpuid", parse_xen_cpuid);
|
||||
|
||||
static bool __initdata dom0_cpuid_cmdline;
|
||||
static uint32_t __initdata dom0_enable_feat[FSCAPINTS];
|
||||
static uint32_t __initdata dom0_disable_feat[FSCAPINTS];
|
||||
|
||||
static void __init _parse_dom0_cpuid(unsigned int feat, bool val)
|
||||
{
|
||||
__set_bit (feat, val ? dom0_enable_feat : dom0_disable_feat);
|
||||
__clear_bit(feat, val ? dom0_disable_feat : dom0_enable_feat );
|
||||
}
|
||||
|
||||
static int __init parse_dom0_cpuid(const char *s)
|
||||
{
|
||||
dom0_cpuid_cmdline = true;
|
||||
|
||||
return parse_cpuid(s, _parse_dom0_cpuid);
|
||||
}
|
||||
custom_param("dom0-cpuid", parse_dom0_cpuid);
|
||||
|
||||
#define EMPTY_LEAF ((struct cpuid_leaf){})
|
||||
static void zero_leaves(struct cpuid_leaf *l,
|
||||
unsigned int first, unsigned int last)
|
||||
@@ -768,6 +786,25 @@ void __init init_dom0_cpuid_policy(struct domain *d)
|
||||
*/
|
||||
if ( cpu_has_arch_caps )
|
||||
p->feat.arch_caps = true;
|
||||
|
||||
/* Apply dom0-cpuid= command line settings, if provided. */
|
||||
if ( dom0_cpuid_cmdline )
|
||||
{
|
||||
uint32_t fs[FSCAPINTS];
|
||||
unsigned int i;
|
||||
|
||||
cpuid_policy_to_featureset(p, fs);
|
||||
|
||||
for ( i = 0; i < ARRAY_SIZE(fs); ++i )
|
||||
{
|
||||
fs[i] |= dom0_enable_feat [i];
|
||||
fs[i] &= ~dom0_disable_feat[i];
|
||||
}
|
||||
|
||||
cpuid_featureset_to_policy(fs, p);
|
||||
|
||||
recalculate_cpuid_policy(d);
|
||||
}
|
||||
}
|
||||
|
||||
void guest_cpuid(const struct vcpu *v, uint32_t leaf,
|
||||
|
||||