target/arm: Calculate mask/base_mask in get_level1_table_address()
In get_level1_table_address(), instead of using precalculated values of mask and base_mask from the TCR struct, calculate them directly (in the same way we currently do in vmsa_ttbcr_raw_write() to populate the TCR struct fields). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220714132303.1287193-3-peter.maydell@linaro.org
This commit is contained in:
parent
dfce4aa8fe
commit
9e70e26c53
@ -315,20 +315,24 @@ static bool get_level1_table_address(CPUARMState *env, ARMMMUIdx mmu_idx,
|
||||
uint32_t *table, uint32_t address)
|
||||
{
|
||||
/* Note that we can only get here for an AArch32 PL0/PL1 lookup */
|
||||
TCR *tcr = regime_tcr(env, mmu_idx);
|
||||
uint64_t tcr = regime_tcr_value(env, mmu_idx);
|
||||
int maskshift = extract32(tcr, 0, 3);
|
||||
uint32_t mask = ~(((uint32_t)0xffffffffu) >> maskshift);
|
||||
uint32_t base_mask;
|
||||
|
||||
if (address & tcr->mask) {
|
||||
if (tcr->raw_tcr & TTBCR_PD1) {
|
||||
if (address & mask) {
|
||||
if (tcr & TTBCR_PD1) {
|
||||
/* Translation table walk disabled for TTBR1 */
|
||||
return false;
|
||||
}
|
||||
*table = regime_ttbr(env, mmu_idx, 1) & 0xffffc000;
|
||||
} else {
|
||||
if (tcr->raw_tcr & TTBCR_PD0) {
|
||||
if (tcr & TTBCR_PD0) {
|
||||
/* Translation table walk disabled for TTBR0 */
|
||||
return false;
|
||||
}
|
||||
*table = regime_ttbr(env, mmu_idx, 0) & tcr->base_mask;
|
||||
base_mask = ~((uint32_t)0x3fffu >> maskshift);
|
||||
*table = regime_ttbr(env, mmu_idx, 0) & base_mask;
|
||||
}
|
||||
*table |= (address >> 18) & 0x3ffc;
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user