From 9c5153270f180853669ccadeebe0042a64ec1cfa Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Tue, 20 Mar 2018 12:32:00 -0400 Subject: [PATCH] i386: keep cpu_model field in MachineState uptodate Considering that features are converted to global properties and global properties are automatically applied to every new instance of created CPU (at object_new() time), there is no point in parsing cpu_model string every time a CPU created. So move parsing outside CPU creation loop and do it only once. Parsing also should be done before any CPU is created so that features would affect the first CPU a well. Backports commit 6aff24c6a61c6fec31e555c7748ba6085b7b2c06 from qemu --- qemu/hw/i386/pc.c | 9 +++++---- qemu/hw/i386/pc_piix.c | 3 ++- qemu/include/hw/i386/pc.h | 2 +- qemu/target/i386/cpu.c | 1 + qemu/target/i386/cpu.h | 4 +++- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/qemu/hw/i386/pc.c b/qemu/hw/i386/pc.c index e901356b..17c50c4f 100644 --- a/qemu/hw/i386/pc.c +++ b/qemu/hw/i386/pc.c @@ -116,7 +116,7 @@ static X86CPU *pc_new_cpu(struct uc_struct *uc, const char *typename, int64_t ap return cpu; } -int pc_cpus_init(struct uc_struct *uc, const char *cpu_model) +int pc_cpus_init(struct uc_struct *uc, PCMachineState *pcms) { int i; CPUClass *cc; @@ -124,13 +124,14 @@ int pc_cpus_init(struct uc_struct *uc, const char *cpu_model) const char *typename; gchar **model_pieces; Error *error = NULL; + MachineState *machine = MACHINE(uc, pcms); /* init CPUs */ - if (cpu_model == NULL) { + if (machine->cpu_model == NULL) { #ifdef TARGET_X86_64 - cpu_model = "qemu64"; + machine->cpu_model = "qemu64"; #else - cpu_model = "qemu32"; + machine->cpu_model = "qemu32"; #endif } diff --git a/qemu/hw/i386/pc_piix.c b/qemu/hw/i386/pc_piix.c index 6af28934..f7a1f0ac 100644 --- a/qemu/hw/i386/pc_piix.c +++ b/qemu/hw/i386/pc_piix.c @@ -41,7 +41,8 @@ /* PC hardware initialisation */ static int pc_init1(struct uc_struct *uc, MachineState *machine) { - return pc_cpus_init(uc, machine->cpu_model); + PCMachineState *pcms = PC_MACHINE(uc, machine); + return pc_cpus_init(uc, pcms); } static void pc_compat_2_2(struct uc_struct *uc, MachineState *machine) diff --git a/qemu/include/hw/i386/pc.h b/qemu/include/hw/i386/pc.h index 159b8b98..4098547d 100644 --- a/qemu/include/hw/i386/pc.h +++ b/qemu/include/hw/i386/pc.h @@ -32,7 +32,7 @@ struct PCMachineClass { #define PC_MACHINE_CLASS(klass) \ OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE) -int pc_cpus_init(struct uc_struct *uc, const char *cpu_model); +int pc_cpus_init(struct uc_struct *uc, PCMachineState *pcms); FWCfgState *pc_memory_init(MachineState *machine, MemoryRegion *system_memory, diff --git a/qemu/target/i386/cpu.c b/qemu/target/i386/cpu.c index 71f59bee..544a3c0d 100644 --- a/qemu/target/i386/cpu.c +++ b/qemu/target/i386/cpu.c @@ -20,6 +20,7 @@ #include "qemu/osdep.h" #include "qemu/cutils.h" #include "unicorn/platform.h" +#include "uc_priv.h" #include "cpu.h" #include "exec/exec-all.h" diff --git a/qemu/target/i386/cpu.h b/qemu/target/i386/cpu.h index 0fbfb194..35e439a2 100644 --- a/qemu/target/i386/cpu.h +++ b/qemu/target/i386/cpu.h @@ -1211,7 +1211,6 @@ typedef struct CPUX86State { // Unicorn engine struct uc_struct *uc; - bool cpu_globals_initialized; } CPUX86State; /** @@ -1298,6 +1297,9 @@ typedef struct X86CPU { FeatureWordArray plus_features; /* Features to be removed */ FeatureWordArray minus_features; + + // Unicorn: Moved here to prevent a local static + bool cpu_globals_initialized; } X86CPU; static inline X86CPU *x86_env_get_cpu(CPUX86State *env)