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();
|
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 */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
|
|
||||||
int aa64_va_parameter_tbi(uint64_t tcr, ARMMMUIdx mmu_idx)
|
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;
|
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
|
* 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,
|
ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
||||||
ARMMMUIdx mmu_idx);
|
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 /* !CONFIG_USER_ONLY */
|
||||||
#endif /* TARGET_ARM_PTW_H */
|
#endif /* TARGET_ARM_PTW_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user