target/arm: Replace ARM_FEATURE_PXN with ID_MMFR0.VMSA check

The ARM_FEATURE_PXN bit indicates whether the CPU supports the PXN
bit in short-descriptor translation table format descriptors. This
is indicated by ID_MMFR0.VMSA being at least 0b0100. Replace the
feature bit with an ID register check, in line with our preference
for ID register checks over feature bits.

Backports commit 0ae0326b984e77a55c224b7863071bd3d8951231
This commit is contained in:
Peter Maydell 2021-03-01 19:06:04 -05:00 committed by Lioncash
parent d9d68cc128
commit ed92f3c42b
3 changed files with 17 additions and 4 deletions

View file

@ -878,7 +878,6 @@ static int arm_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **err
} }
if (arm_feature(env, ARM_FEATURE_LPAE)) { if (arm_feature(env, ARM_FEATURE_LPAE)) {
set_feature(env, ARM_FEATURE_V7MP); set_feature(env, ARM_FEATURE_V7MP);
set_feature(env, ARM_FEATURE_PXN);
} }
if (arm_feature(env, ARM_FEATURE_CBAR_RO)) { if (arm_feature(env, ARM_FEATURE_CBAR_RO)) {
set_feature(env, ARM_FEATURE_CBAR); set_feature(env, ARM_FEATURE_CBAR);

View file

@ -1645,6 +1645,15 @@ FIELD(ID_ISAR6, FHM, 8, 4)
FIELD(ID_ISAR6, SB, 12, 4) FIELD(ID_ISAR6, SB, 12, 4)
FIELD(ID_ISAR6, SPECRES, 16, 4) FIELD(ID_ISAR6, SPECRES, 16, 4)
FIELD(ID_MMFR0, VMSA, 0, 4)
FIELD(ID_MMFR0, PMSA, 4, 4)
FIELD(ID_MMFR0, OUTERSHR, 8, 4)
FIELD(ID_MMFR0, SHARELVL, 12, 4)
FIELD(ID_MMFR0, TCM, 16, 4)
FIELD(ID_MMFR0, AUXREG, 20, 4)
FIELD(ID_MMFR0, FCSE, 24, 4)
FIELD(ID_MMFR0, INNERSHR, 28, 4)
FIELD(ID_MMFR3, CMAINTVA, 0, 4) FIELD(ID_MMFR3, CMAINTVA, 0, 4)
FIELD(ID_MMFR3, CMAINTSW, 4, 4) FIELD(ID_MMFR3, CMAINTSW, 4, 4)
FIELD(ID_MMFR3, BPMAINT, 8, 4) FIELD(ID_MMFR3, BPMAINT, 8, 4)
@ -1822,7 +1831,6 @@ enum arm_features {
ARM_FEATURE_CACHE_DIRTY_REG, /* 1136/1176 cache dirty status register */ ARM_FEATURE_CACHE_DIRTY_REG, /* 1136/1176 cache dirty status register */
ARM_FEATURE_CACHE_BLOCK_OPS, /* v6 optional cache block operations */ ARM_FEATURE_CACHE_BLOCK_OPS, /* v6 optional cache block operations */
ARM_FEATURE_MPIDR, /* has cp15 MPIDR */ ARM_FEATURE_MPIDR, /* has cp15 MPIDR */
ARM_FEATURE_PXN, /* has Privileged Execute Never bit */
ARM_FEATURE_LPAE, /* has Large Physical Address Extension */ ARM_FEATURE_LPAE, /* has Large Physical Address Extension */
ARM_FEATURE_V8, ARM_FEATURE_V8,
ARM_FEATURE_AARCH64, /* supports 64 bit mode */ ARM_FEATURE_AARCH64, /* supports 64 bit mode */
@ -3474,6 +3482,11 @@ static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 4; return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 4;
} }
static inline bool isar_feature_aa32_pxn(const ARMISARegisters *id)
{
return FIELD_EX32(id->id_mmfr0, ID_MMFR0, VMSA) >= 4;
}
static inline bool isar_feature_aa32_pan(const ARMISARegisters *id) static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
{ {
return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) != 0; return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) != 0;

View file

@ -10294,6 +10294,7 @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
target_ulong *page_size, ARMMMUFaultInfo *fi) target_ulong *page_size, ARMMMUFaultInfo *fi)
{ {
CPUState *cs = env_cpu(env); CPUState *cs = env_cpu(env);
ARMCPU *cpu = env_archcpu(env);
int level = 1; int level = 1;
uint32_t table; uint32_t table;
uint32_t desc; uint32_t desc;
@ -10320,7 +10321,7 @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
goto do_fault; goto do_fault;
} }
type = (desc & 3); type = (desc & 3);
if (type == 0 || (type == 3 && !arm_feature(env, ARM_FEATURE_PXN))) { if (type == 0 || (type == 3 && !cpu_isar_feature(aa32_pxn, cpu))) {
/* /*
* Section translation fault, or attempt to use the encoding * Section translation fault, or attempt to use the encoding
* which is Reserved on implementations without PXN. * which is Reserved on implementations without PXN.
@ -10363,7 +10364,7 @@ static bool get_phys_addr_v6(CPUARMState *env, uint32_t address,
pxn = desc & 1; pxn = desc & 1;
ns = extract32(desc, 19, 1); ns = extract32(desc, 19, 1);
} else { } else {
if (arm_feature(env, ARM_FEATURE_PXN)) { if (cpu_isar_feature(aa32_pxn, cpu)) {
pxn = (desc >> 2) & 1; pxn = (desc >> 2) & 1;
} }
ns = extract32(desc, 3, 1); ns = extract32(desc, 3, 1);