]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
x86/sysctl: Don't return cpu policy data for compiled-out support
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 25 Feb 2020 16:57:03 +0000 (16:57 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 26 Feb 2020 12:13:10 +0000 (12:13 +0000)
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>
tools/misc/xen-cpuid.c
xen/arch/x86/sysctl.c
xen/include/public/sysctl.h

index 7726c4ed3c92136b0096f1a31dcf1d7b966c49de..f55b67640ac860ad89b48f86f91eb28f94a60474 100644 (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);
index 4a76f0f47fa2ba0b4accf5bfcd084aac362b71d7..59a384023b809d52949f106c8357ce3782d17ac3 100644 (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;
index 7e43bfe1bd298d9c1265272772c1e9fa9760431d..4dfba39ed8f8b0569b8fe8bc9720bcbfd4d40b36 100644 (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