Message ID | 1357870231-26762-8-git-send-email-imammedo@redhat.com |
---|---|
State | New |
Headers | show |
On Fri, Jan 11, 2013 at 03:10:21AM +0100, Igor Mammedov wrote: > It prepares for converting "+feature,-feature,feature=foo,feature" into > a set of key,value property pairs that will be applied to CPU by > x86_cpu_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 in following patches. > > Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> > --- > v2: > - rebased with "target-i386: move out CPU features initialization > in separate func" patch dropped > - renamed cpu_x86_set_props() to x86_cpu_set_props() > - rebased on top of "disable kvm_mmu + -cpu "enforce" fixes (v3)" > --- > target-i386/cpu.c | 34 ++++++++++++++++++++++++++++------ > 1 files changed, 28 insertions(+), 6 deletions(-) > > diff --git a/target-i386/cpu.c b/target-i386/cpu.c > index 4250c77..c55f137 100644 > --- a/target-i386/cpu.c > +++ b/target-i386/cpu.c > @@ -1301,9 +1301,26 @@ 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 provided key,value list */ > +static void x86_cpu_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)); > + /* TODO: switch to using global properties after subclasses are done */ > + 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 */ > @@ -1311,10 +1328,11 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) > /* Features to be removed */ > FeatureWordArray minus_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); > @@ -1405,7 +1423,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[FEAT_1_EDX]; > x86_cpu_def->ext_features |= plus_features[FEAT_1_ECX]; > @@ -1423,9 +1440,11 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) > x86_cpu_def->kvm_features &= ~minus_features[FEAT_KVM]; > x86_cpu_def->svm_features &= ~minus_features[FEAT_SVM]; > x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_features[FEAT_7_0_EBX]; > + g_strfreev(feat_array); > return 0; > > error: > + g_strfreev(feat_array); > return -1; > } > > @@ -1534,6 +1553,7 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) > { > CPUX86State *env = &cpu->env; > x86_def_t def1, *def = &def1; > + QDict *props = NULL; > Error *error = NULL; > char *name, *features; > gchar **model_pieces; > @@ -1556,7 +1576,7 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) > def->kvm_features |= kvm_default_features; > def->ext_features |= CPUID_EXT_HYPERVISOR; > > - 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; > } > @@ -1580,8 +1600,10 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) > "tsc-frequency", &error); > > object_property_set_str(OBJECT(cpu), def->model_id, "model-id", &error); > + x86_cpu_set_props(cpu, props, &error); > > out: > + QDECREF(props); > g_strfreev(model_pieces); > if (error) { > fprintf(stderr, "%s\n", error_get_pretty(error)); > -- > 1.7.1 > >
diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 4250c77..c55f137 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1301,9 +1301,26 @@ 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 provided key,value list */ +static void x86_cpu_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)); + /* TODO: switch to using global properties after subclasses are done */ + 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 */ @@ -1311,10 +1328,11 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) /* Features to be removed */ FeatureWordArray minus_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); @@ -1405,7 +1423,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[FEAT_1_EDX]; x86_cpu_def->ext_features |= plus_features[FEAT_1_ECX]; @@ -1423,9 +1440,11 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) x86_cpu_def->kvm_features &= ~minus_features[FEAT_KVM]; x86_cpu_def->svm_features &= ~minus_features[FEAT_SVM]; x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_features[FEAT_7_0_EBX]; + g_strfreev(feat_array); return 0; error: + g_strfreev(feat_array); return -1; } @@ -1534,6 +1553,7 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) { CPUX86State *env = &cpu->env; x86_def_t def1, *def = &def1; + QDict *props = NULL; Error *error = NULL; char *name, *features; gchar **model_pieces; @@ -1556,7 +1576,7 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) def->kvm_features |= kvm_default_features; def->ext_features |= CPUID_EXT_HYPERVISOR; - 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; } @@ -1580,8 +1600,10 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) "tsc-frequency", &error); object_property_set_str(OBJECT(cpu), def->model_id, "model-id", &error); + x86_cpu_set_props(cpu, props, &error); out: + QDECREF(props); g_strfreev(model_pieces); if (error) { fprintf(stderr, "%s\n", error_get_pretty(error));
It prepares for converting "+feature,-feature,feature=foo,feature" into a set of key,value property pairs that will be applied to CPU by x86_cpu_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 in following patches. Signed-off-by: Igor Mammedov <imammedo@redhat.com> --- v2: - rebased with "target-i386: move out CPU features initialization in separate func" patch dropped - renamed cpu_x86_set_props() to x86_cpu_set_props() - rebased on top of "disable kvm_mmu + -cpu "enforce" fixes (v3)" --- target-i386/cpu.c | 34 ++++++++++++++++++++++++++++------ 1 files changed, 28 insertions(+), 6 deletions(-)