Do in cpu_x86_find_by_name() only what name implies. i.e. leave only cpudef search and copy/fill passed in x86_def_t structure.
and move out of it cpu_model parsing and CPU initializing into cpu_x86_register(). Plus add hints to where blocks should go when cpu_x86_register() is disbanded. Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- target-i386/cpu.c | 50 +++++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 8d7718c..4bc02e7 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1409,41 +1409,20 @@ static int cpu_x86_find_by_name(X86CPU *cpu, x86_def_t *x86_cpu_def, const char *cpu_model, Error **errp) { x86_def_t *def; - QDict *features = NULL; - char *name = NULL; - - compat_normalize_cpu_model(cpu_model, &name, &features, errp); - if (error_is_set(errp)) { - goto error; - } - for (def = x86_defs; def; def = def->next) - if (name && !strcmp(name, def->name)) + if (!strcmp(cpu_model, def->name)) { break; - if (kvm_enabled() && name && strcmp(name, "host") == 0) { + } + if (kvm_enabled() && strcmp(cpu_model, "host") == 0) { cpu_x86_fill_host(x86_cpu_def); } else if (!def) { - goto error; + error_setg(errp, "CPU device '%s' not found", cpu_model); + return -1; } else { memcpy(x86_cpu_def, def, sizeof(*def)); } - cpu_x86_set_props(cpu, features, errp); - if (error_is_set(errp)) { - goto error; - } - - g_free(name); - QDECREF(features); return 0; - -error: - g_free(name); - QDECREF(features); - if (!error_is_set(errp)) { - error_set(errp, QERR_INVALID_PARAMETER_COMBINATION); - } - return -1; } #define LIST_FLAGS(_typename, _state, _field) \ @@ -1508,16 +1487,29 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) { x86_def_t def1, *def = &def1; Error *error = NULL; + QDict *features = NULL; + char *name = NULL; - memset(def, 0, sizeof(*def)); - - if (cpu_x86_find_by_name(cpu, def, cpu_model, &error) < 0) { + /* for CPU subclasses should go into cpu_x86_init() before object_new() */ + compat_normalize_cpu_model(cpu_model, &name, &features, &error); + if (error) { goto out; } + /* this block should be replaced by CPU subclasses */ + memset(def, 0, sizeof(*def)); + if (cpu_x86_find_by_name(cpu, def, name, &error) < 0) { + goto out; + } cpudef_2_x86_cpu(cpu, def, &error); + /* for CPU subclasses should go between object_new() and + * x86_cpu_realize() */ + cpu_x86_set_props(cpu, features, &error); + out: + g_free(name); + QDECREF(features); if (error) { fprintf(stderr, "%s\n", error_get_pretty(error)); error_free(error); -- 1.7.11.7