target-arm: Convert MPIDR
Convert the MPIDR to the new cp15 register scheme. This includes giving it its own feature bit rather than doing a CPUID value check. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
776d4e5c6c
commit
81bdde9dcd
@ -162,6 +162,7 @@ void arm_cpu_realize(ARMCPU *cpu)
|
||||
if (arm_feature(env, ARM_FEATURE_V7)) {
|
||||
set_feature(env, ARM_FEATURE_VAPA);
|
||||
set_feature(env, ARM_FEATURE_THUMB2);
|
||||
set_feature(env, ARM_FEATURE_MPIDR);
|
||||
if (!arm_feature(env, ARM_FEATURE_M)) {
|
||||
set_feature(env, ARM_FEATURE_V6K);
|
||||
} else {
|
||||
@ -350,6 +351,7 @@ static void arm11mpcore_initfn(Object *obj)
|
||||
set_feature(&cpu->env, ARM_FEATURE_V6K);
|
||||
set_feature(&cpu->env, ARM_FEATURE_VFP);
|
||||
set_feature(&cpu->env, ARM_FEATURE_VAPA);
|
||||
set_feature(&cpu->env, ARM_FEATURE_MPIDR);
|
||||
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
|
||||
cpu->midr = ARM_CPUID_ARM11MPCORE;
|
||||
cpu->reset_fpsid = 0x410120b4;
|
||||
|
@ -386,6 +386,7 @@ enum arm_features {
|
||||
ARM_FEATURE_CACHE_TEST_CLEAN, /* 926/1026 style test-and-clean ops */
|
||||
ARM_FEATURE_CACHE_DIRTY_REG, /* 1136/1176 cache dirty status register */
|
||||
ARM_FEATURE_CACHE_BLOCK_OPS, /* v6 optional cache block operations */
|
||||
ARM_FEATURE_MPIDR, /* has cp15 MPIDR */
|
||||
};
|
||||
|
||||
static inline int arm_feature(CPUARMState *env, int feature)
|
||||
|
@ -833,6 +833,31 @@ static const ARMCPRegInfo strongarm_cp_reginfo[] = {
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
static int mpidr_read(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t *value)
|
||||
{
|
||||
uint32_t mpidr = env->cpu_index;
|
||||
/* We don't support setting cluster ID ([8..11])
|
||||
* so these bits always RAZ.
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_V7MP)) {
|
||||
mpidr |= (1 << 31);
|
||||
/* Cores which are uniprocessor (non-coherent)
|
||||
* but still implement the MP extensions set
|
||||
* bit 30. (For instance, A9UP.) However we do
|
||||
* not currently model any of those cores.
|
||||
*/
|
||||
}
|
||||
*value = mpidr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const ARMCPRegInfo mpidr_cp_reginfo[] = {
|
||||
{ .name = "MPIDR", .cp = 15, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 5,
|
||||
.access = PL1_R, .readfn = mpidr_read },
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
static int sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
|
||||
{
|
||||
env->cp15.c1_sys = value;
|
||||
@ -975,6 +1000,9 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
||||
if (arm_feature(env, ARM_FEATURE_DUMMY_C15_REGS)) {
|
||||
define_arm_cp_regs(cpu, dummy_c15_cp_reginfo);
|
||||
}
|
||||
if (arm_feature(env, ARM_FEATURE_MPIDR)) {
|
||||
define_arm_cp_regs(cpu, mpidr_cp_reginfo);
|
||||
}
|
||||
if (arm_feature(env, ARM_FEATURE_AUXCR)) {
|
||||
ARMCPRegInfo auxcr = {
|
||||
.name = "AUXCR", .cp = 15, .crn = 1, .crm = 0, .opc1 = 0, .opc2 = 1,
|
||||
@ -2121,28 +2149,6 @@ uint32_t HELPER(get_cp15)(CPUARMState *env, uint32_t insn)
|
||||
return 0;
|
||||
case 3: /* TLB type register. */
|
||||
return 0; /* No lockable TLB entries. */
|
||||
case 5: /* MPIDR */
|
||||
/* The MPIDR was standardised in v7; prior to
|
||||
* this it was implemented only in the 11MPCore.
|
||||
* For all other pre-v7 cores it does not exist.
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_V7) ||
|
||||
ARM_CPUID(env) == ARM_CPUID_ARM11MPCORE) {
|
||||
int mpidr = env->cpu_index;
|
||||
/* We don't support setting cluster ID ([8..11])
|
||||
* so these bits always RAZ.
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_V7MP)) {
|
||||
mpidr |= (1 << 31);
|
||||
/* Cores which are uniprocessor (non-coherent)
|
||||
* but still implement the MP extensions set
|
||||
* bit 30. (For instance, A9UP.) However we do
|
||||
* not currently model any of those cores.
|
||||
*/
|
||||
}
|
||||
return mpidr;
|
||||
}
|
||||
/* otherwise fall through to the unimplemented-reg case */
|
||||
default:
|
||||
goto bad_reg;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user