mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 23:05:38 +00:00
arm: Clean up handling of no-MPU PMSA CPUs
ARM CPUs come in two flavours: * proper MMU ("VMSA") * only an MPU ("PMSA") For PMSA, the MPU may be implemented, or not (in which case there is default "always acts the same" behaviour, but it isn't guest programmable). QEMU is a bit confused about how we indicate this: we have an ARM_FEATURE_MPU, but it's not clear whether this indicates "PMSA, not VMSA" or "PMSA and MPU present" , and sometimes we use it for one purpose and sometimes the other. Currently trying to implement a PMSA-without-MPU core won't work correctly because we turn off the ARM_FEATURE_MPU bit and then a lot of things which should still exist get turned off too. As the first step in cleaning this up, rename the feature bit to ARM_FEATURE_PMSA, which indicates a PMSA CPU (with or without MPU). Backports commit 452a095526a0537f16c271516a2200877a272ea8 from qemu
This commit is contained in:
parent
b50d2da03c
commit
6614ba9615
|
@ -575,10 +575,10 @@ static int arm_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **err
|
|||
}
|
||||
|
||||
if (!cpu->has_mpu) {
|
||||
unset_feature(env, ARM_FEATURE_MPU);
|
||||
unset_feature(env, ARM_FEATURE_PMSA);
|
||||
}
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_MPU) &&
|
||||
if (arm_feature(env, ARM_FEATURE_PMSA) &&
|
||||
arm_feature(env, ARM_FEATURE_V7)) {
|
||||
uint32_t nr = cpu->pmsav7_dregion;
|
||||
|
||||
|
@ -680,7 +680,7 @@ static void arm946_initfn(struct uc_struct *uc, Object *obj, void *opaque)
|
|||
|
||||
cpu->dtb_compatible = "arm,arm946";
|
||||
set_feature(&cpu->env, ARM_FEATURE_V5);
|
||||
set_feature(&cpu->env, ARM_FEATURE_MPU);
|
||||
set_feature(&cpu->env, ARM_FEATURE_PMSA);
|
||||
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
|
||||
cpu->midr = 0x41059461;
|
||||
cpu->ctr = 0x0f004006;
|
||||
|
@ -896,7 +896,7 @@ static void cortex_r5_initfn(struct uc_struct *uc, Object *obj, void *opaque)
|
|||
set_feature(&cpu->env, ARM_FEATURE_THUMB_DIV);
|
||||
set_feature(&cpu->env, ARM_FEATURE_ARM_DIV);
|
||||
set_feature(&cpu->env, ARM_FEATURE_V7MP);
|
||||
set_feature(&cpu->env, ARM_FEATURE_MPU);
|
||||
set_feature(&cpu->env, ARM_FEATURE_PMSA);
|
||||
cpu->midr = 0x411fc153; /* r1p3 */
|
||||
cpu->id_pfr0 = 0x0131;
|
||||
cpu->id_pfr1 = 0x001;
|
||||
|
|
|
@ -1162,7 +1162,7 @@ enum arm_features {
|
|||
ARM_FEATURE_V6K,
|
||||
ARM_FEATURE_V7,
|
||||
ARM_FEATURE_THUMB2,
|
||||
ARM_FEATURE_MPU, /* Only has Memory Protection Unit, not full MMU. */
|
||||
ARM_FEATURE_PMSA, /* no MMU; may have Memory Protection Unit */
|
||||
ARM_FEATURE_VFP3,
|
||||
ARM_FEATURE_VFP_FP16,
|
||||
ARM_FEATURE_NEON,
|
||||
|
|
|
@ -391,7 +391,7 @@ static void contextidr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||
{
|
||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||
|
||||
if (raw_read(env, ri) != value && !arm_feature(env, ARM_FEATURE_MPU)
|
||||
if (raw_read(env, ri) != value && !arm_feature(env, ARM_FEATURE_PMSA)
|
||||
&& !extended_addresses_enabled(env)) {
|
||||
/* For VMSA (when not using the LPAE long descriptor page table
|
||||
* format) this register includes the ASID, so do a TLB flush.
|
||||
|
@ -4068,7 +4068,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|||
define_arm_cp_regs(cpu, v6k_cp_reginfo);
|
||||
}
|
||||
if (arm_feature(env, ARM_FEATURE_V7MP) &&
|
||||
!arm_feature(env, ARM_FEATURE_MPU)) {
|
||||
!arm_feature(env, ARM_FEATURE_PMSA)) {
|
||||
define_arm_cp_regs(cpu, v7mp_cp_reginfo);
|
||||
}
|
||||
if (arm_feature(env, ARM_FEATURE_V7)) {
|
||||
|
@ -4304,7 +4304,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_MPU)) {
|
||||
if (arm_feature(env, ARM_FEATURE_PMSA)) {
|
||||
if (arm_feature(env, ARM_FEATURE_V6)) {
|
||||
/* PMSAv6 not implemented */
|
||||
assert(arm_feature(env, ARM_FEATURE_V7));
|
||||
|
@ -4449,7 +4449,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|||
define_arm_cp_regs(cpu, id_pre_v8_midr_cp_reginfo);
|
||||
}
|
||||
define_arm_cp_regs(cpu, id_cp_reginfo);
|
||||
if (!arm_feature(env, ARM_FEATURE_MPU)) {
|
||||
if (!arm_feature(env, ARM_FEATURE_PMSA)) {
|
||||
define_one_arm_cp_reg(cpu, &id_tlbtr_reginfo);
|
||||
} else if (arm_feature(env, ARM_FEATURE_V7)) {
|
||||
define_one_arm_cp_reg(cpu, &id_mpuir_reginfo);
|
||||
|
@ -7592,7 +7592,7 @@ static bool get_phys_addr(CPUARMState *env, target_ulong address,
|
|||
/* pmsav7 has special handling for when MPU is disabled so call it before
|
||||
* the common MMU/MPU disabled check below.
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_MPU) &&
|
||||
if (arm_feature(env, ARM_FEATURE_PMSA) &&
|
||||
arm_feature(env, ARM_FEATURE_V7)) {
|
||||
*page_size = TARGET_PAGE_SIZE;
|
||||
return get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
|
||||
|
@ -7607,7 +7607,7 @@ static bool get_phys_addr(CPUARMState *env, target_ulong address,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_MPU)) {
|
||||
if (arm_feature(env, ARM_FEATURE_PMSA)) {
|
||||
/* Pre-v7 MPU */
|
||||
*page_size = TARGET_PAGE_SIZE;
|
||||
return get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
|
||||
|
|
Loading…
Reference in a new issue