target/arm: Add cfgend parameter for ARM CPU selection.
Add a new "cfgend" property which selects whether the CPU resets into big-endian mode or not. This setting affects whether we reset with SCTLR_B (ARMv6 and earlier) or SCTLR_EE (ARMv7 and later) set. Signed-off-by: Julian Brown <julian@codesourcery.com> Message-id: 11420d1c49636c1790e60578ee996e51f0f0b835.1484929304.git.julian@codesourcery.com [PMM: use error_report_err() rather than error_report(); move the integratorcp changes to their own patch; drop an unnecessary extra #include; rephrase commit message accordingly; move setting of reset_sctlr above registration of cpregs so it actually has an effect] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
00909b5858
commit
3a062d5730
|
@ -541,6 +541,9 @@ static Property arm_cpu_has_el2_property =
|
||||||
static Property arm_cpu_has_el3_property =
|
static Property arm_cpu_has_el3_property =
|
||||||
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
|
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
|
||||||
|
|
||||||
|
static Property arm_cpu_cfgend_property =
|
||||||
|
DEFINE_PROP_BOOL("cfgend", ARMCPU, cfgend, false);
|
||||||
|
|
||||||
/* use property name "pmu" to match other archs and virt tools */
|
/* use property name "pmu" to match other archs and virt tools */
|
||||||
static Property arm_cpu_has_pmu_property =
|
static Property arm_cpu_has_pmu_property =
|
||||||
DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);
|
DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);
|
||||||
|
@ -608,6 +611,8 @@ static void arm_cpu_post_init(Object *obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property,
|
||||||
|
&error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void arm_cpu_finalizefn(Object *obj)
|
static void arm_cpu_finalizefn(Object *obj)
|
||||||
|
@ -728,6 +733,14 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||||
cpu->reset_sctlr |= (1 << 13);
|
cpu->reset_sctlr |= (1 << 13);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpu->cfgend) {
|
||||||
|
if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
|
||||||
|
cpu->reset_sctlr |= SCTLR_EE;
|
||||||
|
} else {
|
||||||
|
cpu->reset_sctlr |= SCTLR_B;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!cpu->has_el3) {
|
if (!cpu->has_el3) {
|
||||||
/* If the has_el3 CPU property is disabled then we need to disable the
|
/* If the has_el3 CPU property is disabled then we need to disable the
|
||||||
* feature.
|
* feature.
|
||||||
|
|
|
@ -676,6 +676,13 @@ struct ARMCPU {
|
||||||
int gic_vpribits; /* number of virtual priority bits */
|
int gic_vpribits; /* number of virtual priority bits */
|
||||||
int gic_vprebits; /* number of virtual preemption bits */
|
int gic_vprebits; /* number of virtual preemption bits */
|
||||||
|
|
||||||
|
/* Whether the cfgend input is high (i.e. this CPU should reset into
|
||||||
|
* big-endian mode). This setting isn't used directly: instead it modifies
|
||||||
|
* the reset_sctlr value to have SCTLR_B or SCTLR_EE set, depending on the
|
||||||
|
* architecture version.
|
||||||
|
*/
|
||||||
|
bool cfgend;
|
||||||
|
|
||||||
ARMELChangeHook *el_change_hook;
|
ARMELChangeHook *el_change_hook;
|
||||||
void *el_change_hook_opaque;
|
void *el_change_hook_opaque;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue