Handle cpu_model in copy_cpu(), by Kirill A. Shutemov.
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 9 Dec 2007 02:22:57 +0000 (02:22 +0000)
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 9 Dec 2007 02:22:57 +0000 (02:22 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3778 c046a42c-6fe2-441c-8c8c-71466251a162

cpu-defs.h
exec.c
target-arm/helper.c
target-i386/helper2.c
target-m68k/helper.c
target-mips/translate.c
target-ppc/helper.c
target-sparc/translate.c

index 139dca2e79b7097f0e1f2717fb7eeb473207b56f..5e0f04674e6c01c0a2b1e7fad6e7da9d07825fe9 100644 (file)
@@ -146,6 +146,8 @@ typedef struct CPUTLBEntry {
     void *next_cpu; /* next CPU sharing TB cache */                     \
     int cpu_index; /* CPU index (informative) */                        \
     /* user data */                                                     \
-    void *opaque;
+    void *opaque;                                                       \
+                                                                        \
+    const char *cpu_model_str;
 
 #endif
diff --git a/exec.c b/exec.c
index 046e967395d62e8f83994ac31c8b249e8e491ade..3fe340ae740c902e2f4234ee3e54e51152613a42 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -1317,9 +1317,7 @@ void cpu_abort(CPUState *env, const char *fmt, ...)
 
 CPUState *cpu_copy(CPUState *env)
 {
-#if 0
-    /* XXX: broken, must be handled by each CPU */
-    CPUState *new_env = cpu_init();
+    CPUState *new_env = cpu_init(env->cpu_model_str);
     /* preserve chaining and index */
     CPUState *next_cpu = new_env->next_cpu;
     int cpu_index = new_env->cpu_index;
@@ -1327,9 +1325,6 @@ CPUState *cpu_copy(CPUState *env)
     new_env->next_cpu = next_cpu;
     new_env->cpu_index = cpu_index;
     return new_env;
-#else
-    return NULL;
-#endif
 }
 
 #if !defined(CONFIG_USER_ONLY)
index 40bdeb186e67d15073bd6ada4e3ed61416fcc514..86470dbeee4b6093d749b262a76a60abf6738a07 100644 (file)
@@ -182,6 +182,7 @@ CPUARMState *cpu_arm_init(const char *cpu_model)
     if (!env)
         return NULL;
     cpu_exec_init(env);
+    env->cpu_model_str = cpu_model;
     env->cp15.c0_cpuid = id;
     cpu_reset(env);
     return env;
index 67658e297d604f1f20eeba1c5f2fd2b0e541f837..968d9dd56ae70b514feb2a19744778977e0d7abe 100644 (file)
@@ -99,6 +99,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
     if (!env)
         return NULL;
     cpu_exec_init(env);
+    env->cpu_model_str = cpu_model;
 
     /* init various static tables */
     if (!inited) {
index f6b0cd6b3579531c25acbccb243282dbe5fe68ec..c63964891d4af5831d84fd684c7cfce1641198d2 100644 (file)
@@ -126,11 +126,13 @@ CPUM68KState *cpu_m68k_init(const char *cpu_model)
         return NULL;
     cpu_exec_init(env);
 
+    env->cpu_model_str = cpu_model;
+
     if (cpu_m68k_set_model(env, cpu_model) < 0) {
         cpu_m68k_close(env);
         return NULL;
     }
-        
+
     cpu_reset(env);
     return env;
 }
index c909463da579a08d44772b5679ce7e2c6872d57d..abbf0677c002977513e97d0f11b379d249881296 100644 (file)
@@ -6786,6 +6786,7 @@ CPUMIPSState *cpu_mips_init (const char *cpu_model)
     env->cpu_model = def;
 
     cpu_exec_init(env);
+    env->cpu_model_str = cpu_model;
     cpu_reset(env);
     return env;
 }
index 7a32d4a27ffb482d7f37056acec715998475cab1..a808454a201e2bd664cb8470348044a5641fe835 100644 (file)
@@ -2976,6 +2976,7 @@ CPUPPCState *cpu_ppc_init (const char *cpu_model)
     if (!env)
         return NULL;
     cpu_exec_init(env);
+    env->cpu_model_str = cpu_model;
     cpu_ppc_register_internal(env, def);
     cpu_ppc_reset(env);
     return env;
index 37a0d2963b14dbda7833f8ea91c9856588847b8d..ecec3727234412bacd83928f927eac64e02df2df 100644 (file)
@@ -3792,6 +3792,7 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model)
     if (!env)
         return NULL;
     cpu_exec_init(env);
+    env->cpu_model_str = cpu_model;
     env->version = def->iu_version;
     env->fsr = def->fpu_version;
 #if !defined(TARGET_SPARC64)