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:
parent
71a77257dd
commit
49ba115bb7
@ -11065,7 +11065,7 @@ do_fault:
|
||||
* false otherwise.
|
||||
*/
|
||||
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;
|
||||
int startsizecheck;
|
||||
@ -11081,22 +11081,19 @@ static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
|
||||
}
|
||||
|
||||
if (is_aa64) {
|
||||
CPUARMState *env = &cpu->env;
|
||||
unsigned int pamax = arm_pamax(cpu);
|
||||
|
||||
switch (stride) {
|
||||
case 13: /* 64KB Pages. */
|
||||
if (level == 0 || (level == 1 && pamax <= 42)) {
|
||||
if (level == 0 || (level == 1 && outputsize <= 42)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 11: /* 16KB Pages. */
|
||||
if (level == 0 || (level == 1 && pamax <= 40)) {
|
||||
if (level == 0 || (level == 1 && outputsize <= 40)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 9: /* 4KB Pages. */
|
||||
if (level == 0 && pamax <= 42) {
|
||||
if (level == 0 && outputsize <= 42) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
@ -11105,8 +11102,8 @@ static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
|
||||
}
|
||||
|
||||
/* Inputsize checks. */
|
||||
if (inputsize > pamax &&
|
||||
(arm_el_is_aa64(env, 1) || inputsize > 40)) {
|
||||
if (inputsize > outputsize &&
|
||||
(arm_el_is_aa64(&cpu->env, 1) || inputsize > 40)) {
|
||||
/* This is CONSTRAINED UNPREDICTABLE and we choose to fault. */
|
||||
return false;
|
||||
}
|
||||
@ -11392,7 +11389,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
|
||||
target_ulong page_size;
|
||||
uint32_t attrs;
|
||||
int32_t stride;
|
||||
int addrsize, inputsize;
|
||||
int addrsize, inputsize, outputsize;
|
||||
TCR *tcr = regime_tcr(env, mmu_idx);
|
||||
int ap, ns, xn, pxn;
|
||||
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;
|
||||
inputsize = 64 - param.tsz;
|
||||
outputsize = arm_pamax(cpu);
|
||||
} else {
|
||||
param = aa32_va_parameters(env, address, mmu_idx);
|
||||
level = 1;
|
||||
addrsize = (mmu_idx == ARMMMUIdx_Stage2 ? 40 : 32);
|
||||
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. */
|
||||
ok = check_s2_mmu_setup(cpu, aarch64, startlevel,
|
||||
inputsize, stride);
|
||||
inputsize, stride, outputsize);
|
||||
if (!ok) {
|
||||
fault_type = ARMFault_Translation;
|
||||
goto do_fault;
|
||||
|
Loading…
Reference in New Issue
Block a user