From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52472) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b899R-0005Lh-0U for qemu-devel@nongnu.org; Wed, 01 Jun 2016 12:37:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b899O-0007tP-Oy for qemu-devel@nongnu.org; Wed, 01 Jun 2016 12:37:47 -0400 From: Igor Mammedov Date: Wed, 1 Jun 2016 18:37:23 +0200 Message-Id: <1464799050-11002-2-git-send-email-imammedo@redhat.com> In-Reply-To: <1464799050-11002-1-git-send-email-imammedo@redhat.com> References: <1464799050-11002-1-git-send-email-imammedo@redhat.com> Subject: [Qemu-devel] [PATCH RFC 1/8] target-i386: cpu: move features logic that requires CPUState to realize time List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, pbonzini@redhat.com, rth@twiddle.net, ehabkost@redhat.com, blauwirbel@gmail.com, mark.cave-ayland@ilande.co.uk, qemu-arm@nongnu.org it will allow to make x86_cpu_parse_featurestr() a pure convertor of legacy features string into global properties. That way -cpu FOOCPU,feat1=x,feat2=y,... is parsed only once and as result of x86_cpu_parse_featurestr() a corresponding set of global properties for specified CPU type are registered. So whenever a CPU device is created, generic device machinery will apply that global properties for us. Signed-off-by: Igor Mammedov --- target-i386/cpu.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 3fbc6f3..6159a7f 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1932,6 +1932,11 @@ static inline void feat2prop(char *s) } } +/* Features to be added */ +static FeatureWordArray plus_features = { 0 }; +/* Features to be removed */ +static FeatureWordArray minus_features = { 0 }; + /* Parse "+feature,-feature,feature=foo" CPU feature string */ static void x86_cpu_parse_featurestr(CPUState *cs, char *features, @@ -1939,13 +1944,7 @@ static void x86_cpu_parse_featurestr(CPUState *cs, char *features, { X86CPU *cpu = X86_CPU(cs); char *featurestr; /* Single 'key=value" string being parsed */ - FeatureWord w; - /* Features to be added */ - FeatureWordArray plus_features = { 0 }; - /* Features to be removed */ - FeatureWordArray minus_features = { 0 }; uint32_t numvalue; - CPUX86State *env = &cpu->env; Error *local_err = NULL; featurestr = features ? strtok(features, ",") : NULL; @@ -2019,18 +2018,6 @@ static void x86_cpu_parse_featurestr(CPUState *cs, char *features, } featurestr = strtok(NULL, ","); } - - if (cpu->host_features) { - for (w = 0; w < FEATURE_WORDS; w++) { - env->features[w] = - x86_cpu_get_supported_feature_word(w, cpu->migratable); - } - } - - for (w = 0; w < FEATURE_WORDS; w++) { - env->features[w] |= plus_features[w]; - env->features[w] &= ~minus_features[w]; - } } /* Print all cpuid feature names in featureset @@ -2912,12 +2899,25 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) CPUX86State *env = &cpu->env; Error *local_err = NULL; static bool ht_warned; + FeatureWord w; if (cpu->apic_id < 0) { error_setg(errp, "apic-id property was not initialized properly"); return; } + if (cpu->host_features) { + for (w = 0; w < FEATURE_WORDS; w++) { + env->features[w] = + x86_cpu_get_supported_feature_word(w, cpu->migratable); + } + } + + for (w = 0; w < FEATURE_WORDS; w++) { + cpu->env.features[w] |= plus_features[w]; + cpu->env.features[w] &= ~minus_features[w]; + } + if (env->features[FEAT_7_0_EBX] && env->cpuid_level < 7) { env->cpuid_level = 7; } -- 1.8.3.1