x86/sysctl: Don't return cpu policy data for compiled-out support

Policy objects aren't tiny, and the derivation logic isn't trivial.  We are
about to increase the number of policy objects, so will have the opportunity
to drop logic and storage space based on CONFIG_{PV,HVM}.

Start by causing XEN_SYSCTL_get_cpu_policy to fail with -EOPNOTSUPP when
requesting data for a compiled-out subsystem.  Update xen-cpuid to cope and
continue to further system policies, seeing as the indicies are interleaved.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2020-02-26 12:13:10 +00:00
1 parent 6094a3c4fe
commit 96dc77b4b1
3 files changed
+26 -5

No files matched your search

+9
View File
@@ -480,7 +480,16 @@ int main(int argc, char **argv)
if ( xc_get_system_cpu_policy(xch, i, &nr_leaves, leaves,
&nr_msrs, msrs) )
{
if ( errno == EOPNOTSUPP )
{
printf("%s policy not supported by Xen\n",
sys_policies[i]);
continue;
}
err(1, "xc_get_system_cpu_policy(, %s,,)", sys_policies[i]);
}
print_policy(sys_policies[i], leaves, nr_leaves,
msrs, nr_msrs);
+15 -5
View File
@@ -33,7 +33,7 @@
#include <asm/psr.h>
#include <asm/cpuid.h>
const struct cpu_policy system_policies[] = {
const struct cpu_policy system_policies[6] = {
[ XEN_SYSCTL_cpu_policy_raw ] = {
&raw_cpuid_policy,
&raw_msr_policy,
@@ -42,22 +42,26 @@ const struct cpu_policy system_policies[] = {
&host_cpuid_policy,
&host_msr_policy,
},
#ifdef CONFIG_PV
[ XEN_SYSCTL_cpu_policy_pv_max ] = {
&pv_max_cpuid_policy,
&pv_max_msr_policy,
},
[ XEN_SYSCTL_cpu_policy_hvm_max ] = {
&hvm_max_cpuid_policy,
&hvm_max_msr_policy,
},
[ XEN_SYSCTL_cpu_policy_pv_default ] = {
&pv_max_cpuid_policy,
&pv_max_msr_policy,
},
#endif
#ifdef CONFIG_HVM
[ XEN_SYSCTL_cpu_policy_hvm_max ] = {
&hvm_max_cpuid_policy,
&hvm_max_msr_policy,
},
[ XEN_SYSCTL_cpu_policy_hvm_default ] = {
&hvm_max_cpuid_policy,
&hvm_max_msr_policy,
},
#endif
};
struct l3_cache_info {
@@ -426,6 +430,12 @@ long arch_do_sysctl(
array_index_nospec(sysctl->u.cpu_policy.index,
ARRAY_SIZE(system_policies))];
if ( !policy->cpuid || !policy->msr )
{
ret = -EOPNOTSUPP;
break;
}
/* Process the CPUID leaves. */
if ( guest_handle_is_null(sysctl->u.cpu_policy.cpuid_policy) )
sysctl->u.cpu_policy.nr_leaves = CPUID_MAX_SERIALISED_LEAVES;
+2
View File
@@ -1051,6 +1051,8 @@ struct xen_sysctl_set_parameter {
* experimental features outside of security support.
* - Default_*: Default set of features a PV or HVM guest can use. This is
* the security supported set.
* May fail with -EOPNOTSUPP if querying for PV or HVM data when support is
* compiled out of Xen.
*/
struct xen_sysctl_cpu_policy {
#define XEN_SYSCTL_cpu_policy_raw 0
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.