|
@@ -67,37 +67,6 @@ CPUState *cpu_create(const char *typename)
|
|
return cpu;
|
|
return cpu;
|
|
}
|
|
}
|
|
|
|
|
|
-const char *cpu_parse_cpu_model(const char *typename, const char *cpu_model)
|
|
|
|
-{
|
|
|
|
- ObjectClass *oc;
|
|
|
|
- CPUClass *cc;
|
|
|
|
- gchar **model_pieces;
|
|
|
|
- const char *cpu_type;
|
|
|
|
-
|
|
|
|
- model_pieces = g_strsplit(cpu_model, ",", 2);
|
|
|
|
-
|
|
|
|
- oc = cpu_class_by_name(typename, model_pieces[0]);
|
|
|
|
- if (oc == NULL) {
|
|
|
|
- error_report("unable to find CPU model '%s'", model_pieces[0]);
|
|
|
|
- g_strfreev(model_pieces);
|
|
|
|
- exit(EXIT_FAILURE);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- cpu_type = object_class_get_name(oc);
|
|
|
|
- cc = CPU_CLASS(oc);
|
|
|
|
- cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
|
|
|
|
- g_strfreev(model_pieces);
|
|
|
|
- return cpu_type;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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().
|
|
|
|
- */
|
|
|
|
- return cpu_create(cpu_parse_cpu_model(typename, cpu_model));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
bool cpu_paging_enabled(const CPUState *cpu)
|
|
bool cpu_paging_enabled(const CPUState *cpu)
|
|
{
|
|
{
|
|
CPUClass *cc = CPU_GET_CLASS(cpu);
|
|
CPUClass *cc = CPU_GET_CLASS(cpu);
|
|
@@ -335,23 +304,15 @@ static ObjectClass *cpu_common_class_by_name(const char *cpu_model)
|
|
static void cpu_common_parse_features(const char *typename, char *features,
|
|
static void cpu_common_parse_features(const char *typename, char *features,
|
|
Error **errp)
|
|
Error **errp)
|
|
{
|
|
{
|
|
- char *featurestr; /* Single "key=value" string being parsed */
|
|
|
|
char *val;
|
|
char *val;
|
|
static bool cpu_globals_initialized;
|
|
static bool cpu_globals_initialized;
|
|
|
|
+ /* Single "key=value" string being parsed */
|
|
|
|
+ char *featurestr = features ? strtok(features, ",") : NULL;
|
|
|
|
|
|
- /* TODO: all callers of ->parse_features() need to be changed to
|
|
|
|
- * call it only once, so we can remove this check (or change it
|
|
|
|
- * to assert(!cpu_globals_initialized).
|
|
|
|
- * Current callers of ->parse_features() are:
|
|
|
|
- * - cpu_generic_init()
|
|
|
|
- */
|
|
|
|
- if (cpu_globals_initialized) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ /* should be called only once, catch invalid users */
|
|
|
|
+ assert(!cpu_globals_initialized);
|
|
cpu_globals_initialized = true;
|
|
cpu_globals_initialized = true;
|
|
|
|
|
|
- featurestr = features ? strtok(features, ",") : NULL;
|
|
|
|
-
|
|
|
|
while (featurestr) {
|
|
while (featurestr) {
|
|
val = strchr(featurestr, '=');
|
|
val = strchr(featurestr, '=');
|
|
if (val) {
|
|
if (val) {
|