mirror of https://github.com/xemu-project/xemu.git
target/arm: Move check_s2_mmu_setup to ptw.c
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220604040607.269301-21-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
f8526edc2f
commit
c5168785d2
|
@ -10614,76 +10614,6 @@ int simple_ap_to_rw_prot_is_user(int ap, bool is_user)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* check_s2_mmu_setup
|
||||
* @cpu: ARMCPU
|
||||
* @is_aa64: True if the translation regime is in AArch64 state
|
||||
* @startlevel: Suggested starting level
|
||||
* @inputsize: Bitsize of IPAs
|
||||
* @stride: Page-table stride (See the ARM ARM)
|
||||
*
|
||||
* Returns true if the suggested S2 translation parameters are OK and
|
||||
* false otherwise.
|
||||
*/
|
||||
bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
|
||||
int inputsize, int stride, int outputsize)
|
||||
{
|
||||
const int grainsize = stride + 3;
|
||||
int startsizecheck;
|
||||
|
||||
/*
|
||||
* Negative levels are usually not allowed...
|
||||
* Except for FEAT_LPA2, 4k page table, 52-bit address space, which
|
||||
* begins with level -1. Note that previous feature tests will have
|
||||
* eliminated this combination if it is not enabled.
|
||||
*/
|
||||
if (level < (inputsize == 52 && stride == 9 ? -1 : 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
startsizecheck = inputsize - ((3 - level) * stride + grainsize);
|
||||
if (startsizecheck < 1 || startsizecheck > stride + 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_aa64) {
|
||||
switch (stride) {
|
||||
case 13: /* 64KB Pages. */
|
||||
if (level == 0 || (level == 1 && outputsize <= 42)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 11: /* 16KB Pages. */
|
||||
if (level == 0 || (level == 1 && outputsize <= 40)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 9: /* 4KB Pages. */
|
||||
if (level == 0 && outputsize <= 42) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
/* Inputsize checks. */
|
||||
if (inputsize > outputsize &&
|
||||
(arm_el_is_aa64(&cpu->env, 1) || inputsize > 40)) {
|
||||
/* This is CONSTRAINED UNPREDICTABLE and we choose to fault. */
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
/* AArch32 only supports 4KB pages. Assert on that. */
|
||||
assert(stride == 9);
|
||||
|
||||
if (level == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
int aa64_va_parameter_tbi(uint64_t tcr, ARMMMUIdx mmu_idx)
|
||||
|
|
|
@ -615,6 +615,76 @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
|
|||
return prot_rw | PAGE_EXEC;
|
||||
}
|
||||
|
||||
/*
|
||||
* check_s2_mmu_setup
|
||||
* @cpu: ARMCPU
|
||||
* @is_aa64: True if the translation regime is in AArch64 state
|
||||
* @startlevel: Suggested starting level
|
||||
* @inputsize: Bitsize of IPAs
|
||||
* @stride: Page-table stride (See the ARM ARM)
|
||||
*
|
||||
* Returns true if the suggested S2 translation parameters are OK and
|
||||
* false otherwise.
|
||||
*/
|
||||
static bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
|
||||
int inputsize, int stride, int outputsize)
|
||||
{
|
||||
const int grainsize = stride + 3;
|
||||
int startsizecheck;
|
||||
|
||||
/*
|
||||
* Negative levels are usually not allowed...
|
||||
* Except for FEAT_LPA2, 4k page table, 52-bit address space, which
|
||||
* begins with level -1. Note that previous feature tests will have
|
||||
* eliminated this combination if it is not enabled.
|
||||
*/
|
||||
if (level < (inputsize == 52 && stride == 9 ? -1 : 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
startsizecheck = inputsize - ((3 - level) * stride + grainsize);
|
||||
if (startsizecheck < 1 || startsizecheck > stride + 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_aa64) {
|
||||
switch (stride) {
|
||||
case 13: /* 64KB Pages. */
|
||||
if (level == 0 || (level == 1 && outputsize <= 42)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 11: /* 16KB Pages. */
|
||||
if (level == 0 || (level == 1 && outputsize <= 40)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 9: /* 4KB Pages. */
|
||||
if (level == 0 && outputsize <= 42) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
/* Inputsize checks. */
|
||||
if (inputsize > outputsize &&
|
||||
(arm_el_is_aa64(&cpu->env, 1) || inputsize > 40)) {
|
||||
/* This is CONSTRAINED UNPREDICTABLE and we choose to fault. */
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
/* AArch32 only supports 4KB pages. Assert on that. */
|
||||
assert(stride == 9);
|
||||
|
||||
if (level == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_phys_addr_lpae: perform one stage of page table walk, LPAE format
|
||||
*
|
||||
|
|
|
@ -27,8 +27,6 @@ simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap)
|
|||
|
||||
ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
||||
ARMMMUIdx mmu_idx);
|
||||
bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
|
||||
int inputsize, int stride, int outputsize);
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
#endif /* TARGET_ARM_PTW_H */
|
||||
|
|
Loading…
Reference in New Issue