qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 6/7] target-unicore32: Store feature flags in UniCor


From: Andreas Färber
Subject: [Qemu-devel] [PATCH 6/7] target-unicore32: Store feature flags in UniCore32CPUClass
Date: Wed, 14 Mar 2012 02:39:57 +0100

Contributed under GPLv2+.

Signed-off-by: Andreas Färber <address@hidden>
---
 target-unicore32/cpu-qom.h |    3 +++
 target-unicore32/cpu.c     |    9 +++++++++
 target-unicore32/helper.c  |    9 ---------
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/target-unicore32/cpu-qom.h b/target-unicore32/cpu-qom.h
index 4d730f0..c8178a5 100644
--- a/target-unicore32/cpu-qom.h
+++ b/target-unicore32/cpu-qom.h
@@ -34,6 +34,7 @@
 
 /**
  * UniCore32CPUClass:
+ * @features: Internal CPU feature flags.
  *
  * A UniCore32 CPU model.
  */
@@ -47,6 +48,8 @@ typedef struct UniCore32CPUClass {
         uint32_t c0_cachetype;
         uint32_t c1_sys;
     } cp0;
+
+    uint32_t features;
 } UniCore32CPUClass;
 
 /**
diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c
index fa5c280..d4b47d6 100644
--- a/target-unicore32/cpu.c
+++ b/target-unicore32/cpu.c
@@ -19,18 +19,25 @@ typedef struct UniCore32CPUInfo {
     uint32_t cp0_c0_cpuid;
     uint32_t cp0_c0_cachetype;
     uint32_t cp0_c1_sys;
+    uint32_t features;
 } UniCore32CPUInfo;
 
+#define UC32_FEATURE(feature) (1u << feature)
+
 static const UniCore32CPUInfo uc32_cpus[] = {
     {
         .name = "UniCore-II",
         .cp0_c0_cpuid = 0x40010863,
         .cp0_c0_cachetype = 0x1dd20d2,
         .cp0_c1_sys = 0x00090078,
+        .features = UC32_FEATURE(UC32_HWCAP_CMOV) |
+                    UC32_FEATURE(UC32_HWCAP_UCF64),
     },
     {
         .name = "any",
         .cp0_c0_cpuid = 0xffffffff,
+        .features = UC32_FEATURE(UC32_HWCAP_CMOV) |
+                    UC32_FEATURE(UC32_HWCAP_UCF64),
     }
 };
 
@@ -46,6 +53,7 @@ static void uc32_cpu_initfn(Object *obj)
     env->cp0.c0_cpuid = klass->cp0.c0_cpuid;
     env->cp0.c0_cachetype = klass->cp0.c0_cachetype;
     env->cp0.c1_sys = klass->cp0.c1_sys;
+    env->features = klass->features;
 
     env->uncached_asr = ASR_MODE_USER;
     env->regs[31] = 0;
@@ -61,6 +69,7 @@ static void uc32_cpu_class_init(ObjectClass *klass, void 
*data)
     k->cp0.c0_cpuid = info->cp0_c0_cpuid;
     k->cp0.c0_cachetype = info->cp0_c0_cachetype;
     k->cp0.c1_sys = info->cp0_c1_sys;
+    k->features = info->features;
 }
 
 static void uc32_register_cpu(const UniCore32CPUInfo *info)
diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c
index ba9318b..fb6713c 100644
--- a/target-unicore32/helper.c
+++ b/target-unicore32/helper.c
@@ -11,11 +11,6 @@
 #include "helper.h"
 #include "host-utils.h"
 
-static inline void set_feature(CPUUniCore32State *env, int feature)
-{
-    env->features |= feature;
-}
-
 CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
 {
     UniCore32CPU *cpu;
@@ -32,13 +27,9 @@ CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
     id = env->cp0.c0_cpuid;
     switch (id) {
     case UC32_CPUID_UCV2:
-        set_feature(env, UC32_HWCAP_CMOV);
-        set_feature(env, UC32_HWCAP_UCF64);
         env->ucf64.xregs[UC32_UCF64_FPSCR] = 0;
         break;
     case UC32_CPUID_ANY: /* For userspace emulation.  */
-        set_feature(env, UC32_HWCAP_CMOV);
-        set_feature(env, UC32_HWCAP_UCF64);
         break;
     default:
         cpu_abort(env, "Bad CPU ID: %x\n", id);
-- 
1.7.7




reply via email to

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