mirror of https://github.com/xemu-project/xemu.git
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.
|
* 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;
|
||||||
|
|
Loading…
Reference in New Issue