mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86: Out-of-inline the policy<->featureset convertors
These are already getting over-large for being inline functions, and are only
going to grow further over time. Out of line them, yielding the following net
delta from bloat-o-meter:
add/remove: 2/0 grow/shrink: 0/4 up/down: 276/-1877 (-1601)
Switch to the newer cpu_policy terminology while doing so.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
(cherry picked from commit 1027df4c00)
This commit is contained in:
1 parent
bdcc1765f1
commit
4ff61b27a3
5 files changed
+68
-58
No files matched your search
@@ -568,7 +568,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, bool restore,
|
||||
}
|
||||
}
|
||||
|
||||
cpuid_featureset_to_policy(feat, p);
|
||||
x86_cpu_featureset_to_policy(feat, p);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+14
-14
@@ -367,7 +367,7 @@ static void __init calculate_host_policy(void)
|
||||
p->extd.max_leaf = 0x80000000 | min_t(uint32_t, max_extd_leaf & 0xffff,
|
||||
ARRAY_SIZE(p->extd.raw) - 1);
|
||||
|
||||
cpuid_featureset_to_policy(boot_cpu_data.x86_capability, p);
|
||||
x86_cpu_featureset_to_policy(boot_cpu_data.x86_capability, p);
|
||||
recalculate_xstate(p);
|
||||
recalculate_misc(p);
|
||||
|
||||
@@ -449,7 +449,7 @@ static void __init calculate_pv_max_policy(void)
|
||||
unsigned int i;
|
||||
|
||||
*p = host_cpu_policy;
|
||||
cpuid_policy_to_featureset(p, pv_featureset);
|
||||
x86_cpu_policy_to_featureset(p, pv_featureset);
|
||||
|
||||
for ( i = 0; i < ARRAY_SIZE(pv_featureset); ++i )
|
||||
pv_featureset[i] &= pv_max_featuremask[i];
|
||||
@@ -467,7 +467,7 @@ static void __init calculate_pv_max_policy(void)
|
||||
guest_common_feature_adjustments(pv_featureset);
|
||||
|
||||
sanitise_featureset(pv_featureset);
|
||||
cpuid_featureset_to_policy(pv_featureset, p);
|
||||
x86_cpu_featureset_to_policy(pv_featureset, p);
|
||||
recalculate_xstate(p);
|
||||
|
||||
p->extd.raw[0xa] = EMPTY_LEAF; /* No SVM for PV guests. */
|
||||
@@ -480,7 +480,7 @@ static void __init calculate_pv_def_policy(void)
|
||||
unsigned int i;
|
||||
|
||||
*p = pv_max_cpu_policy;
|
||||
cpuid_policy_to_featureset(p, pv_featureset);
|
||||
x86_cpu_policy_to_featureset(p, pv_featureset);
|
||||
|
||||
for ( i = 0; i < ARRAY_SIZE(pv_featureset); ++i )
|
||||
pv_featureset[i] &= pv_def_featuremask[i];
|
||||
@@ -489,7 +489,7 @@ static void __init calculate_pv_def_policy(void)
|
||||
guest_common_default_feature_adjustments(pv_featureset);
|
||||
|
||||
sanitise_featureset(pv_featureset);
|
||||
cpuid_featureset_to_policy(pv_featureset, p);
|
||||
x86_cpu_featureset_to_policy(pv_featureset, p);
|
||||
recalculate_xstate(p);
|
||||
}
|
||||
|
||||
@@ -501,7 +501,7 @@ static void __init calculate_hvm_max_policy(void)
|
||||
const uint32_t *hvm_featuremask;
|
||||
|
||||
*p = host_cpu_policy;
|
||||
cpuid_policy_to_featureset(p, hvm_featureset);
|
||||
x86_cpu_policy_to_featureset(p, hvm_featureset);
|
||||
|
||||
hvm_featuremask = hvm_hap_supported() ?
|
||||
hvm_hap_max_featuremask : hvm_shadow_max_featuremask;
|
||||
@@ -551,7 +551,7 @@ static void __init calculate_hvm_max_policy(void)
|
||||
guest_common_feature_adjustments(hvm_featureset);
|
||||
|
||||
sanitise_featureset(hvm_featureset);
|
||||
cpuid_featureset_to_policy(hvm_featureset, p);
|
||||
x86_cpu_featureset_to_policy(hvm_featureset, p);
|
||||
recalculate_xstate(p);
|
||||
}
|
||||
|
||||
@@ -563,7 +563,7 @@ static void __init calculate_hvm_def_policy(void)
|
||||
const uint32_t *hvm_featuremask;
|
||||
|
||||
*p = hvm_max_cpu_policy;
|
||||
cpuid_policy_to_featureset(p, hvm_featureset);
|
||||
x86_cpu_policy_to_featureset(p, hvm_featureset);
|
||||
|
||||
hvm_featuremask = hvm_hap_supported() ?
|
||||
hvm_hap_def_featuremask : hvm_shadow_def_featuremask;
|
||||
@@ -575,7 +575,7 @@ static void __init calculate_hvm_def_policy(void)
|
||||
guest_common_default_feature_adjustments(hvm_featureset);
|
||||
|
||||
sanitise_featureset(hvm_featureset);
|
||||
cpuid_featureset_to_policy(hvm_featureset, p);
|
||||
x86_cpu_featureset_to_policy(hvm_featureset, p);
|
||||
recalculate_xstate(p);
|
||||
}
|
||||
|
||||
@@ -645,8 +645,8 @@ void recalculate_cpuid_policy(struct domain *d)
|
||||
? CPUID_GUEST_NR_EXTD_AMD
|
||||
: CPUID_GUEST_NR_EXTD_INTEL) - 1);
|
||||
|
||||
cpuid_policy_to_featureset(p, fs);
|
||||
cpuid_policy_to_featureset(max, max_fs);
|
||||
x86_cpu_policy_to_featureset(p, fs);
|
||||
x86_cpu_policy_to_featureset(max, max_fs);
|
||||
|
||||
if ( is_hvm_domain(d) )
|
||||
{
|
||||
@@ -711,7 +711,7 @@ void recalculate_cpuid_policy(struct domain *d)
|
||||
(cpufeat_mask(X86_FEATURE_FDP_EXCP_ONLY) |
|
||||
cpufeat_mask(X86_FEATURE_NO_FPU_SEL)));
|
||||
|
||||
cpuid_featureset_to_policy(fs, p);
|
||||
x86_cpu_featureset_to_policy(fs, p);
|
||||
|
||||
/* Pass host cacheline size through to guests. */
|
||||
p->basic.clflush_size = max->basic.clflush_size;
|
||||
@@ -777,7 +777,7 @@ void __init init_dom0_cpuid_policy(struct domain *d)
|
||||
uint32_t fs[FSCAPINTS];
|
||||
unsigned int i;
|
||||
|
||||
cpuid_policy_to_featureset(p, fs);
|
||||
x86_cpu_policy_to_featureset(p, fs);
|
||||
|
||||
for ( i = 0; i < ARRAY_SIZE(fs); ++i )
|
||||
{
|
||||
@@ -785,7 +785,7 @@ void __init init_dom0_cpuid_policy(struct domain *d)
|
||||
fs[i] &= ~dom0_disable_feat[i];
|
||||
}
|
||||
|
||||
cpuid_featureset_to_policy(fs, p);
|
||||
x86_cpu_featureset_to_policy(fs, p);
|
||||
|
||||
recalculate_cpuid_policy(d);
|
||||
}
|
||||
|
||||
@@ -369,7 +369,7 @@ long arch_do_sysctl(
|
||||
ret = -EINVAL;
|
||||
|
||||
if ( !ret )
|
||||
cpuid_policy_to_featureset(p, featureset);
|
||||
x86_cpu_policy_to_featureset(p, featureset);
|
||||
|
||||
/* Copy the requested featureset into place. */
|
||||
if ( !ret && copy_to_guest(sysctl->u.cpu_featureset.features,
|
||||
|
||||
@@ -387,49 +387,17 @@ struct cpu_policy_errors
|
||||
|
||||
#define INIT_CPU_POLICY_ERRORS { -1, -1, -1 }
|
||||
|
||||
/* Fill in a featureset bitmap from a CPUID policy. */
|
||||
static inline void cpuid_policy_to_featureset(
|
||||
const struct cpuid_policy *p, uint32_t fs[FEATURESET_NR_ENTRIES])
|
||||
{
|
||||
fs[FEATURESET_1d] = p->basic._1d;
|
||||
fs[FEATURESET_1c] = p->basic._1c;
|
||||
fs[FEATURESET_e1d] = p->extd.e1d;
|
||||
fs[FEATURESET_e1c] = p->extd.e1c;
|
||||
fs[FEATURESET_Da1] = p->xstate.Da1;
|
||||
fs[FEATURESET_7b0] = p->feat._7b0;
|
||||
fs[FEATURESET_7c0] = p->feat._7c0;
|
||||
fs[FEATURESET_e7d] = p->extd.e7d;
|
||||
fs[FEATURESET_e8b] = p->extd.e8b;
|
||||
fs[FEATURESET_7d0] = p->feat._7d0;
|
||||
fs[FEATURESET_7a1] = p->feat._7a1;
|
||||
fs[FEATURESET_e21a] = p->extd.e21a;
|
||||
fs[FEATURESET_7b1] = p->feat._7b1;
|
||||
fs[FEATURESET_7d2] = p->feat._7d2;
|
||||
fs[FEATURESET_7c1] = p->feat._7c1;
|
||||
fs[FEATURESET_7d1] = p->feat._7d1;
|
||||
}
|
||||
/**
|
||||
* Copy the featureset words out of a cpu_policy object.
|
||||
*/
|
||||
void x86_cpu_policy_to_featureset(const struct cpu_policy *p,
|
||||
uint32_t fs[FEATURESET_NR_ENTRIES]);
|
||||
|
||||
/* Fill in a CPUID policy from a featureset bitmap. */
|
||||
static inline void cpuid_featureset_to_policy(
|
||||
const uint32_t fs[FEATURESET_NR_ENTRIES], struct cpuid_policy *p)
|
||||
{
|
||||
p->basic._1d = fs[FEATURESET_1d];
|
||||
p->basic._1c = fs[FEATURESET_1c];
|
||||
p->extd.e1d = fs[FEATURESET_e1d];
|
||||
p->extd.e1c = fs[FEATURESET_e1c];
|
||||
p->xstate.Da1 = fs[FEATURESET_Da1];
|
||||
p->feat._7b0 = fs[FEATURESET_7b0];
|
||||
p->feat._7c0 = fs[FEATURESET_7c0];
|
||||
p->extd.e7d = fs[FEATURESET_e7d];
|
||||
p->extd.e8b = fs[FEATURESET_e8b];
|
||||
p->feat._7d0 = fs[FEATURESET_7d0];
|
||||
p->feat._7a1 = fs[FEATURESET_7a1];
|
||||
p->extd.e21a = fs[FEATURESET_e21a];
|
||||
p->feat._7b1 = fs[FEATURESET_7b1];
|
||||
p->feat._7d2 = fs[FEATURESET_7d2];
|
||||
p->feat._7c1 = fs[FEATURESET_7c1];
|
||||
p->feat._7d1 = fs[FEATURESET_7d1];
|
||||
}
|
||||
/**
|
||||
* Copy the featureset words back into a cpu_policy object.
|
||||
*/
|
||||
void x86_cpu_featureset_to_policy(const uint32_t fs[FEATURESET_NR_ENTRIES],
|
||||
struct cpu_policy *p);
|
||||
|
||||
static inline uint64_t cpuid_policy_xcr0_max(const struct cpuid_policy *p)
|
||||
{
|
||||
|
||||
@@ -60,6 +60,48 @@ const char *x86_cpuid_vendor_to_str(unsigned int vendor)
|
||||
}
|
||||
}
|
||||
|
||||
void x86_cpu_policy_to_featureset(
|
||||
const struct cpu_policy *p, uint32_t fs[FEATURESET_NR_ENTRIES])
|
||||
{
|
||||
fs[FEATURESET_1d] = p->basic._1d;
|
||||
fs[FEATURESET_1c] = p->basic._1c;
|
||||
fs[FEATURESET_e1d] = p->extd.e1d;
|
||||
fs[FEATURESET_e1c] = p->extd.e1c;
|
||||
fs[FEATURESET_Da1] = p->xstate.Da1;
|
||||
fs[FEATURESET_7b0] = p->feat._7b0;
|
||||
fs[FEATURESET_7c0] = p->feat._7c0;
|
||||
fs[FEATURESET_e7d] = p->extd.e7d;
|
||||
fs[FEATURESET_e8b] = p->extd.e8b;
|
||||
fs[FEATURESET_7d0] = p->feat._7d0;
|
||||
fs[FEATURESET_7a1] = p->feat._7a1;
|
||||
fs[FEATURESET_e21a] = p->extd.e21a;
|
||||
fs[FEATURESET_7b1] = p->feat._7b1;
|
||||
fs[FEATURESET_7d2] = p->feat._7d2;
|
||||
fs[FEATURESET_7c1] = p->feat._7c1;
|
||||
fs[FEATURESET_7d1] = p->feat._7d1;
|
||||
}
|
||||
|
||||
void x86_cpu_featureset_to_policy(
|
||||
const uint32_t fs[FEATURESET_NR_ENTRIES], struct cpu_policy *p)
|
||||
{
|
||||
p->basic._1d = fs[FEATURESET_1d];
|
||||
p->basic._1c = fs[FEATURESET_1c];
|
||||
p->extd.e1d = fs[FEATURESET_e1d];
|
||||
p->extd.e1c = fs[FEATURESET_e1c];
|
||||
p->xstate.Da1 = fs[FEATURESET_Da1];
|
||||
p->feat._7b0 = fs[FEATURESET_7b0];
|
||||
p->feat._7c0 = fs[FEATURESET_7c0];
|
||||
p->extd.e7d = fs[FEATURESET_e7d];
|
||||
p->extd.e8b = fs[FEATURESET_e8b];
|
||||
p->feat._7d0 = fs[FEATURESET_7d0];
|
||||
p->feat._7a1 = fs[FEATURESET_7a1];
|
||||
p->extd.e21a = fs[FEATURESET_e21a];
|
||||
p->feat._7b1 = fs[FEATURESET_7b1];
|
||||
p->feat._7d2 = fs[FEATURESET_7d2];
|
||||
p->feat._7c1 = fs[FEATURESET_7c1];
|
||||
p->feat._7d1 = fs[FEATURESET_7d1];
|
||||
}
|
||||
|
||||
void x86_cpuid_policy_recalc_synth(struct cpuid_policy *p)
|
||||
{
|
||||
p->x86_vendor = x86_cpuid_lookup_vendor(
|
||||
|
||||