QOMfy cpu models handling introducing propper cpu types
for each cpu model.
Signed-off-by: Igor Mammedov <imamm...@redhat.com>
---
with this and conversion of features to properties,
it would be possible to replace cpu_sparc_init() with
cpu_generic_init() and reuse common -cpu handling
infrastructure.
CC: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk>
CC: Artyom Tarasenko <atar4q...@gmail.com>
CC: Philippe Mathieu-Daudé <f4...@amsat.org>
v2:
* make base class abstract (Philippe Mathieu-Daudé <f4...@amsat.org>)
---
target/sparc/cpu-qom.h | 2 +
target/sparc/cpu.c | 121
+++++++++++++++++++++++++++++++++----------------
2 files changed, 84 insertions(+), 39 deletions(-)
diff --git a/target/sparc/cpu-qom.h b/target/sparc/cpu-qom.h
index f63af72..af6d57a 100644
--- a/target/sparc/cpu-qom.h
+++ b/target/sparc/cpu-qom.h
@@ -35,6 +35,7 @@
#define SPARC_CPU_GET_CLASS(obj) \
OBJECT_GET_CLASS(SPARCCPUClass, (obj), TYPE_SPARC_CPU)
+typedef struct sparc_def_t sparc_def_t;
/**
* SPARCCPUClass:
* @parent_realize: The parent class' realize handler.
@@ -49,6 +50,7 @@ typedef struct SPARCCPUClass {
DeviceRealize parent_realize;
void (*parent_reset)(CPUState *cpu);
+ sparc_def_t *cpu_def;
} SPARCCPUClass;
typedef struct SPARCCPU SPARCCPU;
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index d606eb5..2994c09 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -25,8 +25,6 @@
//#define DEBUG_FEATURES
-static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model);
-
/* CPUClass::reset() */
static void sparc_cpu_reset(CPUState *s)
{
@@ -111,17 +109,9 @@ static int cpu_sparc_register(SPARCCPU *cpu, const char
*cpu_model)
{
CPUSPARCState *env = &cpu->env;
char *s = g_strdup(cpu_model);
- char *featurestr, *name = strtok(s, ",");
- sparc_def_t def1, *def = &def1;
+ char *featurestr = strtok(s, ",");
Error *err = NULL;
- if (cpu_sparc_find_by_name(def, name) < 0) {
- g_free(s);
- return -1;
- }
-
- env->def = g_memdup(def, sizeof(*def));
-
featurestr = strtok(NULL, ",");
sparc_cpu_parse_features(CPU(cpu), featurestr, &err);
g_free(s);
@@ -130,18 +120,18 @@ static int cpu_sparc_register(SPARCCPU *cpu, const char
*cpu_model)
return -1;
}
- env->version = def->iu_version;
- env->fsr = def->fpu_version;
- env->nwindows = def->nwindows;
+ env->version = env->def->iu_version;
+ env->fsr = env->def->fpu_version;
+ env->nwindows = env->def->nwindows;
#if !defined(TARGET_SPARC64)
- env->mmuregs[0] |= def->mmu_version;
+ env->mmuregs[0] |= env->def->mmu_version;
cpu_sparc_set_id(env, 0);
- env->mxccregs[7] |= def->mxcc_version;
+ env->mxccregs[7] |= env->def->mxcc_version;
#else
- env->mmu_version = def->mmu_version;
- env->maxtl = def->maxtl;
- env->version |= def->maxtl << 8;
- env->version |= def->nwindows - 1;
+ env->mmu_version = env->def->mmu_version;
+ env->maxtl = env->def->maxtl;
+ env->version |= env->def->maxtl << 8;
+ env->version |= env->def->nwindows - 1;
#endif
return 0;
}
@@ -149,8 +139,19 @@ static int cpu_sparc_register(SPARCCPU *cpu, const char
*cpu_model)
SPARCCPU *cpu_sparc_init(const char *cpu_model)
{
SPARCCPU *cpu;
+ ObjectClass *oc;
+ char *str, *name;
+
+ str = g_strdup(cpu_model);
+ name = strtok(str, ",");