target/arm: Consolidate PMSA handling in get_phys_addr()

Currently get_phys_addr() has PMSAv7 handling before the
"is translation disabled?" check, and then PMSAv5 after it.
Tidy this up by making the PMSAv5 code handle the "MPU disabled"
case itself, so that we have all the PMSA code in one place.
This will make adding the PMSAv8 code slightly cleaner, and
also means that pre-v7 PMSA cores benefit from the MPU lookup
logging that the PMSAv7 codepath had.

Backports commit 3279adb95e34dd3d67c66d729458f7784747cf8d from qemu
This commit is contained in:
Peter Maydell 2018-03-04 12:48:20 -05:00 committed by Lioncash
parent f85f301316
commit 6f4afe1a13
No known key found for this signature in database
GPG Key ID: 4E3C3CC1031BA9C7

View File

@ -7687,6 +7687,14 @@ static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
uint32_t base; uint32_t base;
bool is_user = regime_is_user(env, mmu_idx); bool is_user = regime_is_user(env, mmu_idx);
if (regime_translation_disabled(env, mmu_idx)) {
/* MPU disabled. */
*phys_ptr = address;
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
return false;
}
*phys_ptr = address; *phys_ptr = address;
for (n = 7; n >= 0; n--) { for (n = 7; n >= 0; n--) {
base = env->cp15.c6_region[n]; base = env->cp15.c6_region[n];
@ -7836,16 +7844,19 @@ static bool get_phys_addr(CPUARMState *env, target_ulong address,
} }
} }
/* pmsav7 has special handling for when MPU is disabled so call it before if (arm_feature(env, ARM_FEATURE_PMSA)) {
* the common MMU/MPU disabled check below.
*/
if (arm_feature(env, ARM_FEATURE_PMSA) &&
arm_feature(env, ARM_FEATURE_V7)) {
bool ret; bool ret;
*page_size = TARGET_PAGE_SIZE; *page_size = TARGET_PAGE_SIZE;
if (arm_feature(env, ARM_FEATURE_V7)) {
/* PMSAv7 */
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx, ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
phys_ptr, prot, fsr); phys_ptr, prot, fsr);
qemu_log_mask(CPU_LOG_MMU, "PMSAv7 MPU lookup for %s at 0x%08" PRIx32 } else {
/* Pre-v7 MPU */
ret = get_phys_addr_pmsav5(env, address, access_type, mmu_idx,
phys_ptr, prot, fsr);
}
qemu_log_mask(CPU_LOG_MMU, "PMSA MPU lookup for %s at 0x%08" PRIx32
" mmu_idx %u -> %s (prot %c%c%c)\n", " mmu_idx %u -> %s (prot %c%c%c)\n",
access_type == MMU_DATA_LOAD ? "reading" : access_type == MMU_DATA_LOAD ? "reading" :
(access_type == MMU_DATA_STORE ? "writing" : "execute"), (access_type == MMU_DATA_STORE ? "writing" : "execute"),
@ -7858,21 +7869,16 @@ static bool get_phys_addr(CPUARMState *env, target_ulong address,
return ret; return ret;
} }
/* Definitely a real MMU, not an MPU */
if (regime_translation_disabled(env, mmu_idx)) { if (regime_translation_disabled(env, mmu_idx)) {
/* MMU/MPU disabled. */ /* MMU disabled. */
*phys_ptr = address; *phys_ptr = address;
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
*page_size = TARGET_PAGE_SIZE; *page_size = TARGET_PAGE_SIZE;
return 0; return 0;
} }
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,
phys_ptr, prot, fsr);
}
if (regime_using_lpae_format(env, mmu_idx)) { if (regime_using_lpae_format(env, mmu_idx)) {
return get_phys_addr_lpae(env, address, access_type, mmu_idx, phys_ptr, return get_phys_addr_lpae(env, address, access_type, mmu_idx, phys_ptr,
attrs, prot, page_size, fsr, fi); attrs, prot, page_size, fsr, fi);