target/arm: Move S1_ptw_translate outside arm_ld[lq]_ptw
Separate S1 translation from the actual lookup. Will enable lpae hardware updates. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20221024051851.3074715-6-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8973922783
commit
93e5b3a6f9
|
@ -300,18 +300,12 @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
|
|||
}
|
||||
|
||||
/* All loads done in the course of a page table walk go through here. */
|
||||
static uint32_t arm_ldl_ptw(CPUARMState *env, S1Translate *ptw, hwaddr addr,
|
||||
static uint32_t arm_ldl_ptw(CPUARMState *env, S1Translate *ptw,
|
||||
ARMMMUFaultInfo *fi)
|
||||
{
|
||||
CPUState *cs = env_cpu(env);
|
||||
uint32_t data;
|
||||
|
||||
if (!S1_ptw_translate(env, ptw, addr, fi)) {
|
||||
/* Failure. */
|
||||
assert(fi->s1ptw);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (likely(ptw->out_host)) {
|
||||
/* Page tables are in RAM, and we have the host address. */
|
||||
if (ptw->out_be) {
|
||||
|
@ -339,18 +333,12 @@ static uint32_t arm_ldl_ptw(CPUARMState *env, S1Translate *ptw, hwaddr addr,
|
|||
return data;
|
||||
}
|
||||
|
||||
static uint64_t arm_ldq_ptw(CPUARMState *env, S1Translate *ptw, hwaddr addr,
|
||||
static uint64_t arm_ldq_ptw(CPUARMState *env, S1Translate *ptw,
|
||||
ARMMMUFaultInfo *fi)
|
||||
{
|
||||
CPUState *cs = env_cpu(env);
|
||||
uint64_t data;
|
||||
|
||||
if (!S1_ptw_translate(env, ptw, addr, fi)) {
|
||||
/* Failure. */
|
||||
assert(fi->s1ptw);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (likely(ptw->out_host)) {
|
||||
/* Page tables are in RAM, and we have the host address. */
|
||||
if (ptw->out_be) {
|
||||
|
@ -507,7 +495,10 @@ static bool get_phys_addr_v5(CPUARMState *env, S1Translate *ptw,
|
|||
fi->type = ARMFault_Translation;
|
||||
goto do_fault;
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, table, fi);
|
||||
if (!S1_ptw_translate(env, ptw, table, fi)) {
|
||||
goto do_fault;
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, fi);
|
||||
if (fi->type != ARMFault_None) {
|
||||
goto do_fault;
|
||||
}
|
||||
|
@ -545,7 +536,10 @@ static bool get_phys_addr_v5(CPUARMState *env, S1Translate *ptw,
|
|||
/* Fine pagetable. */
|
||||
table = (desc & 0xfffff000) | ((address >> 8) & 0xffc);
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, table, fi);
|
||||
if (!S1_ptw_translate(env, ptw, table, fi)) {
|
||||
goto do_fault;
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, fi);
|
||||
if (fi->type != ARMFault_None) {
|
||||
goto do_fault;
|
||||
}
|
||||
|
@ -630,7 +624,10 @@ static bool get_phys_addr_v6(CPUARMState *env, S1Translate *ptw,
|
|||
fi->type = ARMFault_Translation;
|
||||
goto do_fault;
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, table, fi);
|
||||
if (!S1_ptw_translate(env, ptw, table, fi)) {
|
||||
goto do_fault;
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, fi);
|
||||
if (fi->type != ARMFault_None) {
|
||||
goto do_fault;
|
||||
}
|
||||
|
@ -683,7 +680,10 @@ static bool get_phys_addr_v6(CPUARMState *env, S1Translate *ptw,
|
|||
ns = extract32(desc, 3, 1);
|
||||
/* Lookup l2 entry. */
|
||||
table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);
|
||||
desc = arm_ldl_ptw(env, ptw, table, fi);
|
||||
if (!S1_ptw_translate(env, ptw, table, fi)) {
|
||||
goto do_fault;
|
||||
}
|
||||
desc = arm_ldl_ptw(env, ptw, fi);
|
||||
if (fi->type != ARMFault_None) {
|
||||
goto do_fault;
|
||||
}
|
||||
|
@ -1272,7 +1272,10 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
|
|||
ptw->in_ptw_idx &= ~1;
|
||||
ptw->in_secure = false;
|
||||
}
|
||||
descriptor = arm_ldq_ptw(env, ptw, descaddr, fi);
|
||||
if (!S1_ptw_translate(env, ptw, descaddr, fi)) {
|
||||
goto do_fault;
|
||||
}
|
||||
descriptor = arm_ldq_ptw(env, ptw, fi);
|
||||
if (fi->type != ARMFault_None) {
|
||||
goto do_fault;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue