From patchwork Fri Dec 28 20:01:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Mammedov X-Patchwork-Id: 208575 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 5BF9F2C00DE for ; Sat, 29 Dec 2012 07:35:26 +1100 (EST) Received: from localhost ([::1]:43137 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tog9E-00061g-FS for incoming@patchwork.ozlabs.org; Fri, 28 Dec 2012 15:03:16 -0500 Received: from eggs.gnu.org ([208.118.235.92]:40604) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tog8h-00057a-D8 for qemu-devel@nongnu.org; Fri, 28 Dec 2012 15:02:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tog8f-0003VU-WB for qemu-devel@nongnu.org; Fri, 28 Dec 2012 15:02:43 -0500 Received: from mx1.redhat.com ([209.132.183.28]:47750) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tog8f-0003VB-Ob for qemu-devel@nongnu.org; Fri, 28 Dec 2012 15:02:41 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qBSK2f14030671 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Dec 2012 15:02:41 -0500 Received: from dell-pet610-01.lab.eng.brq.redhat.com (dell-pet610-01.lab.eng.brq.redhat.com [10.34.42.20]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qBSK2Ows012028; Fri, 28 Dec 2012 15:02:40 -0500 From: Igor Mammedov To: qemu-devel@nongnu.org Date: Fri, 28 Dec 2012 21:01:27 +0100 Message-Id: <1356724895-24118-13-git-send-email-imammedo@redhat.com> In-Reply-To: <1356724895-24118-1-git-send-email-imammedo@redhat.com> References: <1356724895-24118-1-git-send-email-imammedo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: ehabkost@redhat.com, afaerber@suse.de Subject: [Qemu-devel] [PATCH 12/20] target-i386: prepare cpu_x86_parse_featurestr() to return a set of key, value property pairs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org It prepares for converting "+feature,-feature,feature=foo,feature" into a set of key,value property pairs that will be applied to CPU by cpu_x86_set_props(). It separates legacy format parsing from property setting, later it could be transformed into code that sets global properties for a given CPU type. Each feature handled by cpu_x86_parse_featurestr() will be converted into foo,val pair and a corresponding property setter by following patches. Signed-off-by: Igor Mammedov Reviewed-by: Eduardo Habkost --- target-i386/cpu.c | 33 +++++++++++++++++++++++++++------ 1 files changed, 27 insertions(+), 6 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 0a39632..eb0dcc2 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1245,9 +1245,25 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *name) return 0; } +/* Set features on X86CPU object based on a provide key,value list */ +static void cpu_x86_set_props(X86CPU *cpu, QDict *features, Error **errp) +{ + const QDictEntry *ent; + + for (ent = qdict_first(features); ent; ent = qdict_next(features, ent)) { + const QString *qval = qobject_to_qstring(qdict_entry_value(ent)); + object_property_parse(OBJECT(cpu), qstring_get_str(qval), + qdict_entry_key(ent), errp); + if (error_is_set(errp)) { + return; + } + } +} + /* Parse "+feature,-feature,feature=foo" CPU feature string */ -static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) +static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features, + QDict **props) { char *featurestr; /* Single 'key=value" string being parsed */ /* Features to be added */ @@ -1261,10 +1277,11 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) uint32_t minus_kvm_features = 0, minus_svm_features = 0; uint32_t minus_7_0_ebx_features = 0; uint32_t numvalue; + gchar **feat_array = g_strsplit(features ? features : "", ",", 0); + *props = qdict_new(); + int j = 0; - featurestr = features ? strtok(features, ",") : NULL; - - while (featurestr) { + while ((featurestr = feat_array[j++])) { char *val; if (featurestr[0] == '+') { add_flagname_to_bitmaps(featurestr + 1, &plus_features, @@ -1361,7 +1378,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) fprintf(stderr, "feature string `%s' not in format (+feature|-feature|feature=xyz)\n", featurestr); goto error; } - featurestr = strtok(NULL, ","); } x86_cpu_def->features |= plus_features; x86_cpu_def->ext_features |= plus_ext_features; @@ -1377,9 +1393,11 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) x86_cpu_def->kvm_features &= ~minus_kvm_features; x86_cpu_def->svm_features &= ~minus_svm_features; x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_7_0_ebx_features; + g_strfreev(feat_array); return 0; error: + g_strfreev(feat_array); return -1; } @@ -1487,6 +1505,7 @@ static void filter_features_for_kvm(X86CPU *cpu) int cpu_x86_register(X86CPU *cpu, const char *cpu_model) { x86_def_t def1, *def = &def1; + QDict *props = NULL; Error *error = NULL; char *name, *features; gchar **model_pieces; @@ -1512,14 +1531,16 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) &def->ext3_features, &def->kvm_features, &def->svm_features, &def->cpuid_7_0_ebx_features); - if (cpu_x86_parse_featurestr(def, features) < 0) { + if (cpu_x86_parse_featurestr(def, features, &props) < 0) { error_setg(&error, "Invalid cpu_model string format: %s", cpu_model); goto out; } cpudef_2_x86_cpu(cpu, def, &error); + cpu_x86_set_props(cpu, props, &error); out: + QDECREF(props); g_strfreev(model_pieces); if (error) { fprintf(stderr, "%s\n", error_get_pretty(error));