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

qom: cpus: split cpu_generic_init() on feature parsing and cpu creation parts



it would allow to reuse feature parsing part in various machines
that have CPU features instead of re-implementing the same feature
parsing each time.

Signed-off-by: default avatarIgor Mammedov <imammedo@redhat.com>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <1505318697-77161-2-git-send-email-imammedo@redhat.com>
Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
parent 11ae6ed8
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -644,6 +644,27 @@ void cpu_reset(CPUState *cpu);
 */
ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model);

/**
 * cpu_create:
 * @typename: The CPU type.
 *
 * Instantiates a CPU and realizes the CPU.
 *
 * Returns: A #CPUState or %NULL if an error occurred.
 */
CPUState *cpu_create(const char *typename);

/**
 * cpu_parse_cpu_model:
 * @typename: The CPU base type or CPU type.
 * @cpu_model: The model string including optional parameters.
 *
 * processes optional parameters and registers them as global properties
 *
 * Returns: type of CPU to create or %NULL if an error occurred.
 */
const char *cpu_parse_cpu_model(const char *typename, const char *cpu_model);

/**
 * cpu_generic_init:
 * @typename: The CPU base type.
+30 −16
Original line number Diff line number Diff line
@@ -54,13 +54,26 @@ bool cpu_exists(int64_t id)
    return !!cpu_by_arch_id(id);
}

CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
CPUState *cpu_create(const char *typename)
{
    Error *err = NULL;
    CPUState *cpu = CPU(object_new(typename));
    object_property_set_bool(OBJECT(cpu), true, "realized", &err);
    if (err != NULL) {
        error_report_err(err);
        object_unref(OBJECT(cpu));
        return NULL;
    }
    return cpu;
}

const char *cpu_parse_cpu_model(const char *typename, const char *cpu_model)
{
    CPUState *cpu = NULL;
    ObjectClass *oc;
    CPUClass *cc;
    Error *err = NULL;
    gchar **model_pieces;
    const char *cpu_type;

    model_pieces = g_strsplit(cpu_model, ",", 2);

@@ -70,27 +83,28 @@ CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
        return NULL;
    }

    cpu_type = object_class_get_name(oc);
    cc = CPU_CLASS(oc);
    /* 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), model_pieces[1], &err);
    cc->parse_features(cpu_type, model_pieces[1], &err);
    g_strfreev(model_pieces);
    if (err != NULL) {
        goto out;
    }

    cpu = CPU(object_new(object_class_get_name(oc)));
    object_property_set_bool(OBJECT(cpu), true, "realized", &err);

out:
    if (err != NULL) {
        error_report_err(err);
        object_unref(OBJECT(cpu));
        return NULL;
    }
    return cpu_type;
}

    return cpu;
CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
{
    /* TODO: all callers of cpu_generic_init() need to be converted to
     * call cpu_parse_features() only once, before calling cpu_generic_init().
     */
    const char *cpu_type = cpu_parse_cpu_model(typename, cpu_model);

    if (cpu_type) {
        return cpu_create(cpu_type);
    }
    return NULL;
}

bool cpu_paging_enabled(const CPUState *cpu)