diff --git a/tools/misc/xen-cpuid.c b/tools/misc/xen-cpuid.c index 7726c4ed3c..f55b67640a 100644 --- a/tools/misc/xen-cpuid.c +++ b/tools/misc/xen-cpuid.c @@ -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); diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index 4a76f0f47f..59a384023b 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -33,7 +33,7 @@ #include #include -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; diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 7e43bfe1bd..4dfba39ed8 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -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