qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 15/19] Add alpha_cpu_list.


From: Tristan Gingold
Subject: [Qemu-devel] [PATCH 15/19] Add alpha_cpu_list.
Date: Mon, 30 Mar 2009 16:36:30 +0200

Add alpha_cpu_list and use cpu_model to select the model in cpu_alpha_init.
Set implver and amask from the model.

Signed-off-by: Tristan Gingold <address@hidden>
---
 target-alpha/cpu.h       |    1 +
 target-alpha/translate.c |   40 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h
index db53650..c27e89f 100644
--- a/target-alpha/cpu.h
+++ b/target-alpha/cpu.h
@@ -436,6 +436,7 @@ enum {
 
 CPUAlphaState * cpu_alpha_init (const char *cpu_model);
 int cpu_alpha_exec(CPUAlphaState *s);
+void alpha_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, 
...));
 /* you can call this signal handler from your SIGBUS and SIGSEGV
    signal handlers to inform the virtual CPU of exceptions. non zero
    is returned if the signal was handled by the virtual CPU.  */
diff --git a/target-alpha/translate.c b/target-alpha/translate.c
index 41f24a5..dab8d78 100644
--- a/target-alpha/translate.c
+++ b/target-alpha/translate.c
@@ -2459,17 +2459,53 @@ void gen_intermediate_code_pc (CPUState *env, struct 
TranslationBlock *tb)
     gen_intermediate_code_internal(env, tb, 1);
 }
 
+struct alpha_def {
+    const char *name;
+    uint32_t implver;
+    uint32_t amask;
+};
+
+static const struct alpha_def alpha_defs[] = {
+#ifdef CONFIG_USER_ONLY
+    { "21064", IMPLVER_2106x, 0 },
+    { "21164", IMPLVER_21164, 0 },
+#endif
+    { "21264", IMPLVER_21264, (AMASK_PREFETCH | AMASK_TRAP | AMASK_BWX
+                               | AMASK_FIX) },
+};
+
+void alpha_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
+{
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(alpha_defs); i++)
+        (*cpu_fprintf)(f, "%s\n", alpha_defs[i].name);
+}
+
 CPUAlphaState * cpu_alpha_init (const char *cpu_model)
 {
     CPUAlphaState *env;
     uint64_t hwpcb;
+    const struct alpha_def *cpu = alpha_defs;
+
+    if (cpu_model != NULL) {
+        int i;
 
+        for (i = 0; i < ARRAY_SIZE(alpha_defs); i++)
+            if (strcmp (alpha_defs[i].name, cpu_model) == 0) {
+                cpu = &alpha_defs[i];
+                break;
+            }
+        if (cpu == NULL)
+            return NULL;
+    }
     env = qemu_mallocz(sizeof(CPUAlphaState));
     cpu_exec_init(env);
     alpha_translate_init();
     tlb_flush(env, 1);
-    /* XXX: should not be hardcoded */
-    env->implver = IMPLVER_2106x;
+
+    env->implver = cpu->implver;
+    env->amask = cpu->amask;
     env->ps = 0x1F00;
 #if defined (CONFIG_USER_ONLY)
     env->ps |= 1 << 3;
-- 
1.6.2





reply via email to

[Prev in Thread] Current Thread [Next in Thread]