From 64452e249d51028da95d2a60869d7bd16f9674e3 Mon Sep 17 00:00:00 2001 From: lazymio Date: Thu, 4 Nov 2021 19:22:08 +0100 Subject: [PATCH] Support changing cpu model for sparc --- qemu/target/sparc/cpu.c | 34 ++++++++++++++-------------------- qemu/target/sparc/cpu.h | 2 +- qemu/target/sparc/unicorn.c | 2 +- qemu/target/sparc/unicorn64.c | 2 +- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/qemu/target/sparc/cpu.c b/qemu/target/sparc/cpu.c index 6d7f232d..4029898e 100644 --- a/qemu/target/sparc/cpu.c +++ b/qemu/target/sparc/cpu.c @@ -510,21 +510,12 @@ static void sparc_cpu_class_init(struct uc_struct *uc, CPUClass *oc) cc->tcg_initialize = sparc_tcg_init; } -SPARCCPU *cpu_sparc_init(struct uc_struct *uc, const char *cpu_model) +SPARCCPU *cpu_sparc_init(struct uc_struct *uc) { SPARCCPU *cpu; CPUState *cs; CPUClass *cc; SPARCCPUClass *scc; - int i; - - if (cpu_model == NULL) { -#ifdef TARGET_SPARC64 - cpu_model = "Sun UltraSparc IV"; -#else - cpu_model = "LEON3"; -#endif - } cpu = malloc(sizeof(*cpu)); if (cpu == NULL) { @@ -532,6 +523,17 @@ SPARCCPU *cpu_sparc_init(struct uc_struct *uc, const char *cpu_model) } memset(cpu, 0, sizeof(*cpu)); + if (uc->cpu_model == INT_MAX) { +#ifdef TARGET_SPARC64 + uc->cpu_model = 11; // Sun UltraSparc IV +#else + uc->cpu_model = 12; +#endif + } else if (uc->cpu_model >= ARRAY_SIZE(sparc_defs)) { + free(cpu); + return NULL; + } + cs = (CPUState *)cpu; cc = (CPUClass *)&cpu->cc; cs->cc = cc; @@ -546,16 +548,8 @@ SPARCCPU *cpu_sparc_init(struct uc_struct *uc, const char *cpu_model) cpu_common_initfn(uc, cs); /* init SPARC types scc->def */ scc = SPARC_CPU_CLASS(cc); - for (i = 0; i < ARRAY_SIZE(sparc_defs); i++) { - if (strcmp(cpu_model, sparc_defs[i].name) == 0) { - scc->cpu_def = &sparc_defs[i]; - break; - } - } - if (i == ARRAY_SIZE(sparc_defs)) { - free(cpu); - return NULL; - } + scc->cpu_def = &sparc_defs[uc->cpu_model]; + /* init SPARCCPU */ sparc_cpu_initfn(uc, cs); /* realize SPARCCPU */ diff --git a/qemu/target/sparc/cpu.h b/qemu/target/sparc/cpu.h index 97b47cce..a750ea14 100644 --- a/qemu/target/sparc/cpu.h +++ b/qemu/target/sparc/cpu.h @@ -815,6 +815,6 @@ static inline bool tb_am_enabled(int tb_flags) #endif } -SPARCCPU *cpu_sparc_init(struct uc_struct *uc, const char *cpu_model); +SPARCCPU *cpu_sparc_init(struct uc_struct *uc); #endif diff --git a/qemu/target/sparc/unicorn.c b/qemu/target/sparc/unicorn.c index 4733ac99..49253c86 100644 --- a/qemu/target/sparc/unicorn.c +++ b/qemu/target/sparc/unicorn.c @@ -175,7 +175,7 @@ static int sparc_cpus_init(struct uc_struct *uc, const char *cpu_model) { SPARCCPU *cpu; - cpu = cpu_sparc_init(uc, cpu_model); + cpu = cpu_sparc_init(uc); if (cpu == NULL) { return -1; } diff --git a/qemu/target/sparc/unicorn64.c b/qemu/target/sparc/unicorn64.c index 02bb573a..03eced6d 100644 --- a/qemu/target/sparc/unicorn64.c +++ b/qemu/target/sparc/unicorn64.c @@ -181,7 +181,7 @@ static int sparc_cpus_init(struct uc_struct *uc, const char *cpu_model) { SPARCCPU *cpu; - cpu = cpu_sparc_init(uc, cpu_model); + cpu = cpu_sparc_init(uc); if (cpu == NULL) { return -1; }