mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 17:05:36 +00:00
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:
parent
d9d68cc128
commit
ed92f3c42b
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue