File xsa435-0-54.patch of Package xen.36400

# Commit f1652ccc9093d50c20a74ac5765feecc9724d9a9
# Date 2023-08-03 19:14:19 +0100
# Author Roger Pau Monne <roger.pau@citrix.com>
# Committer Andrew Cooper <andrew.cooper3@citrix.com>
libxl: add support for parsing MSR features

Introduce support for handling MSR features in
libxl_cpuid_parse_config().  The MSR policies are added to the
libxl_cpuid_policy like the CPUID one, which gets passed to
xc_cpuid_apply_policy().

This allows existing users of libxl to provide MSR related features as
key=value pairs to libxl_cpuid_parse_config() without requiring the
usage of a different API.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
(cherry picked from commit 6d21cedbaa34b3a3856f964189e911112c732b21)

# Commit 26a5e35fd81ac97ff9b49bfaf932f67aa2a26e76
# Date 2023-08-03 19:14:19 +0100
# Author Jan Beulich <jbeulich@suse.com>
# Committer Andrew Cooper <andrew.cooper3@citrix.com>
libxl: avoid shadowing of index()

Because of -Wshadow the build otherwise fails with old enough glibc.

While there also obey line length limits for msr_add().

Fixes: 6d21cedbaa34 ("libxl: add support for parsing MSR features")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
(cherry picked from commit 4f6afde88be3e8960eb311d16ac41d44ab71ed10)

--- a/tools/libxl/libxl_cpuid.c
+++ b/tools/libxl/libxl_cpuid.c
@@ -142,6 +142,41 @@ static int cpuid_add(libxl_cpuid_policy_
     return 0;
 }
 
+static int msr_add(libxl_cpuid_policy_list *policy, uint32_t idx,
+                   unsigned int bit, const char *val)
+{
+    struct libxl__cpuid_policy *entry = cpuid_find_match(policy, XC_X86_MSR_LEAF,
+                                                         idx);
+
+    if (entry->policy[0] == NULL) {
+        entry->policy[0] = strdup("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+        entry->policy[3] = strdup("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+    }
+
+    /* Only allow options taking a character for MSRs, no values allowed. */
+    if (strlen(val) != 1)
+        return 3;
+
+    switch (val[0]) {
+    case '0':
+    case '1':
+    case 'x':
+    case 'k':
+        entry->policy[bit < 32 ? 0 : 3][31 - bit % 32] = val[0];
+        break;
+
+    case 's':
+        /* Translate s -> k as xc_msr doesn't support the deprecated 's'. */
+        entry->policy[bit < 32 ? 0 : 3][31 - bit % 32] = 'k';
+        break;
+
+    default:
+        return 3;
+    }
+
+    return 0;
+}
+
 struct feature_name {
     const char *name;
     unsigned int bit;
@@ -324,7 +359,15 @@ int libxl_cpuid_parse_config(libxl_cpuid
     }
 
     case FEAT_MSR:
-        return 2;
+    {
+        unsigned int bit = feat->bit % 32;
+
+        if (feature_to_policy[feat->bit / 32].u.msr.reg == CPUID_REG_EDX)
+            bit += 32;
+
+        return msr_add(cpuid, feature_to_policy[feat->bit / 32].u.msr.index,
+                       bit, val);
+    }
     }
 
     return 2;
openSUSE Build Service is sponsored by