Contributed under GPLv2+.
Signed-off-by: Andreas Färber <[email protected]>
---
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