From 61aa52146679fb00f976bc1eb7884f1ddcf7342c Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Thu, 29 Aug 2019 20:55:31 +0100 Subject: [PATCH 04/10] i386: x86_cpu_list_feature_names() function RH-Author: Eduardo Habkost Message-id: <20190829205532.8302-2-ehabkost@redhat.com> Patchwork-id: 90200 O-Subject: [RHEL-8.1.0 qemu-kvm PATCH 1/2] i386: x86_cpu_list_feature_names() function Bugzilla: 1747185 RH-Acked-by: Thomas Huth RH-Acked-by: Dr. David Alan Gilbert RH-Acked-by: Michael S. Tsirkin Extract feature name listing code from x86_cpu_class_check_missing_features(). It will be reused to return information about CPU filtered features at runtime. Message-Id: <20190422234742.15780-2-ehabkost@redhat.com> Signed-off-by: Eduardo Habkost (cherry picked from commit 5a853fc57a0860da4a55d1448a77845f97e7a9be) Signed-off-by: Eduardo Habkost Signed-off-by: Danilo C. L. de Paula --- target/i386/cpu.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index f71b044..934f11b 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -3559,6 +3559,27 @@ static void x86_cpu_parse_featurestr(const char *typename, char *features, static void x86_cpu_expand_features(X86CPU *cpu, Error **errp); static int x86_cpu_filter_features(X86CPU *cpu); +/* Build a list with the name of all features on a feature word array */ +static void x86_cpu_list_feature_names(FeatureWordArray features, + strList **feat_names) +{ + FeatureWord w; + strList **next = feat_names; + + for (w = 0; w < FEATURE_WORDS; w++) { + uint32_t filtered = features[w]; + int i; + for (i = 0; i < 32; i++) { + if (filtered & (1UL << i)) { + strList *new = g_new0(strList, 1); + new->value = g_strdup(x86_cpu_feature_name(w, i)); + *next = new; + next = &new->next; + } + } + } +} + /* Check for missing features that may prevent the CPU class from * running using the current machine and accelerator. */ @@ -3566,7 +3587,6 @@ static void x86_cpu_class_check_missing_features(X86CPUClass *xcc, strList **missing_feats) { X86CPU *xc; - FeatureWord w; Error *err = NULL; strList **next = missing_feats; @@ -3593,18 +3613,7 @@ static void x86_cpu_class_check_missing_features(X86CPUClass *xcc, x86_cpu_filter_features(xc); - for (w = 0; w < FEATURE_WORDS; w++) { - uint32_t filtered = xc->filtered_features[w]; - int i; - for (i = 0; i < 32; i++) { - if (filtered & (1UL << i)) { - strList *new = g_new0(strList, 1); - new->value = g_strdup(x86_cpu_feature_name(w, i)); - *next = new; - next = &new->next; - } - } - } + x86_cpu_list_feature_names(xc->filtered_features, next); object_unref(OBJECT(xc)); } -- 1.8.3.1