target/arm: Pass outputsize down to check_s2_mmu_setup

Pass down the width of the output address from translation.
For now this is still just PAMax, but a subsequent patch will
compute the correct value from TCR_ELx.{I}PS.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20220301215958.157011-6-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Richard Henderson 2022-03-01 11:59:45 -10:00 committed by Peter Maydell
parent 71a77257dd
commit 49ba115bb7
1 changed files with 10 additions and 11 deletions

View File

@ -11065,7 +11065,7 @@ do_fault:
* false otherwise. * false otherwise.
*/ */
static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level, static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
int inputsize, int stride) int inputsize, int stride, int outputsize)
{ {
const int grainsize = stride + 3; const int grainsize = stride + 3;
int startsizecheck; int startsizecheck;
@ -11081,22 +11081,19 @@ static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
} }
if (is_aa64) { if (is_aa64) {
CPUARMState *env = &cpu->env;
unsigned int pamax = arm_pamax(cpu);
switch (stride) { switch (stride) {
case 13: /* 64KB Pages. */ case 13: /* 64KB Pages. */
if (level == 0 || (level == 1 && pamax <= 42)) { if (level == 0 || (level == 1 && outputsize <= 42)) {
return false; return false;
} }
break; break;
case 11: /* 16KB Pages. */ case 11: /* 16KB Pages. */
if (level == 0 || (level == 1 && pamax <= 40)) { if (level == 0 || (level == 1 && outputsize <= 40)) {
return false; return false;
} }
break; break;
case 9: /* 4KB Pages. */ case 9: /* 4KB Pages. */
if (level == 0 && pamax <= 42) { if (level == 0 && outputsize <= 42) {
return false; return false;
} }
break; break;
@ -11105,8 +11102,8 @@ static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
} }
/* Inputsize checks. */ /* Inputsize checks. */
if (inputsize > pamax && if (inputsize > outputsize &&
(arm_el_is_aa64(env, 1) || inputsize > 40)) { (arm_el_is_aa64(&cpu->env, 1) || inputsize > 40)) {
/* This is CONSTRAINED UNPREDICTABLE and we choose to fault. */ /* This is CONSTRAINED UNPREDICTABLE and we choose to fault. */
return false; return false;
} }
@ -11392,7 +11389,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
target_ulong page_size; target_ulong page_size;
uint32_t attrs; uint32_t attrs;
int32_t stride; int32_t stride;
int addrsize, inputsize; int addrsize, inputsize, outputsize;
TCR *tcr = regime_tcr(env, mmu_idx); TCR *tcr = regime_tcr(env, mmu_idx);
int ap, ns, xn, pxn; int ap, ns, xn, pxn;
uint32_t el = regime_el(env, mmu_idx); uint32_t el = regime_el(env, mmu_idx);
@ -11422,11 +11419,13 @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
addrsize = 64 - 8 * param.tbi; addrsize = 64 - 8 * param.tbi;
inputsize = 64 - param.tsz; inputsize = 64 - param.tsz;
outputsize = arm_pamax(cpu);
} else { } else {
param = aa32_va_parameters(env, address, mmu_idx); param = aa32_va_parameters(env, address, mmu_idx);
level = 1; level = 1;
addrsize = (mmu_idx == ARMMMUIdx_Stage2 ? 40 : 32); addrsize = (mmu_idx == ARMMMUIdx_Stage2 ? 40 : 32);
inputsize = addrsize - param.tsz; inputsize = addrsize - param.tsz;
outputsize = 40;
} }
/* /*
@ -11511,7 +11510,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
/* Check that the starting level is valid. */ /* Check that the starting level is valid. */
ok = check_s2_mmu_setup(cpu, aarch64, startlevel, ok = check_s2_mmu_setup(cpu, aarch64, startlevel,
inputsize, stride); inputsize, stride, outputsize);
if (!ok) { if (!ok) {
fault_type = ARMFault_Translation; fault_type = ARMFault_Translation;
goto do_fault; goto do_fault;