Commit 3e2cf187 authored by Igor Mammedov's avatar Igor Mammedov Committed by Eduardo Habkost
Browse files

qom: cpu: fix parsed feature string length



since commit ( 9262685b cpu: Factor out cpu_generic_init() )
features parsed by it were truncated only to the 1st feature
after CPU name due to fact that

   featurestr = strtok(NULL, ",");
   cc->parse_features(cpu, featurestr, &err);

would extract exactly one feature and parse_features() callback
would parse it and only it leaving the rest of features ignored.

Reuse approach from x86 custom impl. i.e. replace strtok() token
parsing with g_strsplit(), which would split feature string in
2 parts name and features list and pass the later to
parse_features() callback.

Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
Message-Id: <1503592308-93913-2-git-send-email-imammedo@redhat.com>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: default avatarEduardo Habkost <ehabkost@redhat.com>
Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
parent 2e2efc7d
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -55,28 +55,26 @@ bool cpu_exists(int64_t id)

CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
{
    char *str, *name, *featurestr;
    CPUState *cpu = NULL;
    ObjectClass *oc;
    CPUClass *cc;
    Error *err = NULL;
    gchar **model_pieces;

    str = g_strdup(cpu_model);
    name = strtok(str, ",");
    model_pieces = g_strsplit(cpu_model, ",", 2);

    oc = cpu_class_by_name(typename, name);
    oc = cpu_class_by_name(typename, model_pieces[0]);
    if (oc == NULL) {
        g_free(str);
        g_strfreev(model_pieces);
        return NULL;
    }

    cc = CPU_CLASS(oc);
    featurestr = strtok(NULL, ",");
    /* TODO: all callers of cpu_generic_init() need to be converted to
     * call parse_features() only once, before calling cpu_generic_init().
     */
    cc->parse_features(object_class_get_name(oc), featurestr, &err);
    g_free(str);
    cc->parse_features(object_class_get_name(oc), model_pieces[1], &err);
    g_strfreev(model_pieces);
    if (err != NULL) {
        goto out;
    }