Blame SOURCES/kvm-target-i386-handle-filtered_features-in-a-new-functi.patch

Pablo Greco e6a3ae
From d7362c761ef55b7f665c4dff61d9e58b153ff11c Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
Date: Fri, 22 Nov 2019 11:53:39 +0000
Pablo Greco e6a3ae
Subject: [PATCH 06/16] target/i386: handle filtered_features in a new function
Pablo Greco e6a3ae
 mark_unavailable_features
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
Message-id: <20191122115348.25000-7-pbonzini@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 92600
Pablo Greco e6a3ae
O-Subject: [RHEL8.2/rhel qemu-kvm PATCH 06/15] target/i386: handle filtered_features in a new function mark_unavailable_features
Pablo Greco e6a3ae
Bugzilla: 1689270
Pablo Greco e6a3ae
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
The next patch will add a different reason for filtering features, unrelated
Pablo Greco e6a3ae
to host feature support.  Extract a new function that takes care of disabling
Pablo Greco e6a3ae
the features and optionally reporting them.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 245edd0cfb1481b7a0398cce45df23db50f00034)
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 target/i386/cpu.c | 87 ++++++++++++++++++++++++++++++-------------------------
Pablo Greco e6a3ae
 1 file changed, 48 insertions(+), 39 deletions(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
Pablo Greco e6a3ae
index d0c48c2..b06ce9d 100644
Pablo Greco e6a3ae
--- a/target/i386/cpu.c
Pablo Greco e6a3ae
+++ b/target/i386/cpu.c
Pablo Greco e6a3ae
@@ -3121,17 +3121,41 @@ static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
Pablo Greco e6a3ae
     return NULL;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-static void report_unavailable_features(FeatureWord w, uint32_t mask)
Pablo Greco e6a3ae
+static bool x86_cpu_have_filtered_features(X86CPU *cpu)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
+    FeatureWord w;
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    for (w = 0; w < FEATURE_WORDS; w++) {
Pablo Greco e6a3ae
+        if (cpu->filtered_features[w]) {
Pablo Greco e6a3ae
+            return true;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    return false;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint32_t mask,
Pablo Greco e6a3ae
+                                      const char *verbose_prefix)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    CPUX86State *env = &cpu->env;
Pablo Greco e6a3ae
     FeatureWordInfo *f = &feature_word_info[w];
Pablo Greco e6a3ae
     int i;
Pablo Greco e6a3ae
     char *feat_word_str;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+    if (!cpu->force_features) {
Pablo Greco e6a3ae
+        env->features[w] &= ~mask;
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
+    cpu->filtered_features[w] |= mask;
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    if (!verbose_prefix) {
Pablo Greco e6a3ae
+        return;
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
     for (i = 0; i < 32; ++i) {
Pablo Greco e6a3ae
         if ((1UL << i) & mask) {
Pablo Greco e6a3ae
             feat_word_str = feature_word_description(f, i);
Pablo Greco e6a3ae
-            warn_report("%s doesn't support requested feature: %s%s%s [bit %d]",
Pablo Greco e6a3ae
-                        accel_uses_host_cpuid() ? "host" : "TCG",
Pablo Greco e6a3ae
+            warn_report("%s: %s%s%s [bit %d]",
Pablo Greco e6a3ae
+                        verbose_prefix,
Pablo Greco e6a3ae
                         feat_word_str,
Pablo Greco e6a3ae
                         f->feat_names[i] ? "." : "",
Pablo Greco e6a3ae
                         f->feat_names[i] ? f->feat_names[i] : "", i);
Pablo Greco e6a3ae
@@ -3577,7 +3601,7 @@ static void x86_cpu_parse_featurestr(const char *typename, char *features,
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
Pablo Greco e6a3ae
-static int x86_cpu_filter_features(X86CPU *cpu);
Pablo Greco e6a3ae
+static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 /* Build a list with the name of all features on a feature word array */
Pablo Greco e6a3ae
 static void x86_cpu_list_feature_names(FeatureWordArray features,
Pablo Greco e6a3ae
@@ -3642,7 +3666,7 @@ static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
Pablo Greco e6a3ae
         next = &new->next;
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-    x86_cpu_filter_features(xc);
Pablo Greco e6a3ae
+    x86_cpu_filter_features(xc, false);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     x86_cpu_list_feature_names(xc->filtered_features, next);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
@@ -3811,15 +3835,6 @@ static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
Pablo Greco e6a3ae
     return r;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-static void x86_cpu_report_filtered_features(X86CPU *cpu)
Pablo Greco e6a3ae
-{
Pablo Greco e6a3ae
-    FeatureWord w;
Pablo Greco e6a3ae
-
Pablo Greco e6a3ae
-    for (w = 0; w < FEATURE_WORDS; w++) {
Pablo Greco e6a3ae
-        report_unavailable_features(w, cpu->filtered_features[w]);
Pablo Greco e6a3ae
-    }
Pablo Greco e6a3ae
-}
Pablo Greco e6a3ae
-
Pablo Greco e6a3ae
 static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     PropValue *pv;
Pablo Greco e6a3ae
@@ -5042,24 +5057,24 @@ out:
Pablo Greco e6a3ae
  *
Pablo Greco e6a3ae
  * Returns: 0 if all flags are supported by the host, non-zero otherwise.
Pablo Greco e6a3ae
  */
Pablo Greco e6a3ae
-static int x86_cpu_filter_features(X86CPU *cpu)
Pablo Greco e6a3ae
+static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     CPUX86State *env = &cpu->env;
Pablo Greco e6a3ae
     FeatureWord w;
Pablo Greco e6a3ae
-    int rv = 0;
Pablo Greco e6a3ae
+    const char *prefix = NULL;
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    if (verbose) {
Pablo Greco e6a3ae
+        prefix = accel_uses_host_cpuid()
Pablo Greco e6a3ae
+                 ? "host doesn't support requested feature"
Pablo Greco e6a3ae
+                 : "TCG doesn't support requested feature";
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     for (w = 0; w < FEATURE_WORDS; w++) {
Pablo Greco e6a3ae
         uint32_t host_feat =
Pablo Greco e6a3ae
             x86_cpu_get_supported_feature_word(w, false);
Pablo Greco e6a3ae
         uint32_t requested_features = env->features[w];
Pablo Greco e6a3ae
-        uint32_t available_features = requested_features & host_feat;
Pablo Greco e6a3ae
-        if (!cpu->force_features) {
Pablo Greco e6a3ae
-            env->features[w] = available_features;
Pablo Greco e6a3ae
-        }
Pablo Greco e6a3ae
-        cpu->filtered_features[w] = requested_features & ~available_features;
Pablo Greco e6a3ae
-        if (cpu->filtered_features[w]) {
Pablo Greco e6a3ae
-            rv = 1;
Pablo Greco e6a3ae
-        }
Pablo Greco e6a3ae
+        uint32_t unavailable_features = requested_features & ~host_feat;
Pablo Greco e6a3ae
+        mark_unavailable_features(cpu, w, unavailable_features, prefix);
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
Pablo Greco e6a3ae
@@ -5085,13 +5100,9 @@ static int x86_cpu_filter_features(X86CPU *cpu)
Pablo Greco e6a3ae
              * host can't emulate the capabilities we report on
Pablo Greco e6a3ae
              * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
Pablo Greco e6a3ae
              */
Pablo Greco e6a3ae
-            env->features[FEAT_7_0_EBX] &= ~CPUID_7_0_EBX_INTEL_PT;
Pablo Greco e6a3ae
-            cpu->filtered_features[FEAT_7_0_EBX] |= CPUID_7_0_EBX_INTEL_PT;
Pablo Greco e6a3ae
-            rv = 1;
Pablo Greco e6a3ae
+            mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
Pablo Greco e6a3ae
         }
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
-
Pablo Greco e6a3ae
-    return rv;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
Pablo Greco e6a3ae
@@ -5120,16 +5131,14 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
Pablo Greco e6a3ae
         goto out;
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-    if (x86_cpu_filter_features(cpu) &&
Pablo Greco e6a3ae
-        (cpu->check_cpuid || cpu->enforce_cpuid)) {
Pablo Greco e6a3ae
-        x86_cpu_report_filtered_features(cpu);
Pablo Greco e6a3ae
-        if (cpu->enforce_cpuid) {
Pablo Greco e6a3ae
-            error_setg(&local_err,
Pablo Greco e6a3ae
-                       accel_uses_host_cpuid() ?
Pablo Greco e6a3ae
-                           "Host doesn't support requested features" :
Pablo Greco e6a3ae
-                           "TCG doesn't support requested features");
Pablo Greco e6a3ae
-            goto out;
Pablo Greco e6a3ae
-        }
Pablo Greco e6a3ae
+    x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
Pablo Greco e6a3ae
+        error_setg(&local_err,
Pablo Greco e6a3ae
+                   accel_uses_host_cpuid() ?
Pablo Greco e6a3ae
+                       "Host doesn't support requested features" :
Pablo Greco e6a3ae
+                       "TCG doesn't support requested features");
Pablo Greco e6a3ae
+        goto out;
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae