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. */
|
/* 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)
|
ARMMMUFaultInfo *fi)
|
||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
uint32_t data;
|
uint32_t data;
|
||||||
|
|
||||||
if (!S1_ptw_translate(env, ptw, addr, fi)) {
|
|
||||||
/* Failure. */
|
|
||||||
assert(fi->s1ptw);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (likely(ptw->out_host)) {
|
if (likely(ptw->out_host)) {
|
||||||
/* Page tables are in RAM, and we have the host address. */
|
/* Page tables are in RAM, and we have the host address. */
|
||||||
if (ptw->out_be) {
|
if (ptw->out_be) {
|
||||||
|
@ -339,18 +333,12 @@ static uint32_t arm_ldl_ptw(CPUARMState *env, S1Translate *ptw, hwaddr addr,
|
||||||
return data;
|
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)
|
ARMMMUFaultInfo *fi)
|
||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
uint64_t data;
|
uint64_t data;
|
||||||
|
|
||||||
if (!S1_ptw_translate(env, ptw, addr, fi)) {
|
|
||||||
/* Failure. */
|
|
||||||
assert(fi->s1ptw);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (likely(ptw->out_host)) {
|
if (likely(ptw->out_host)) {
|
||||||
/* Page tables are in RAM, and we have the host address. */
|
/* Page tables are in RAM, and we have the host address. */
|
||||||
if (ptw->out_be) {
|
if (ptw->out_be) {
|
||||||
|
@ -507,7 +495,10 @@ static bool get_phys_addr_v5(CPUARMState *env, S1Translate *ptw,
|
||||||
fi->type = ARMFault_Translation;
|
fi->type = ARMFault_Translation;
|
||||||
goto do_fault;
|
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) {
|
if (fi->type != ARMFault_None) {
|
||||||
goto do_fault;
|
goto do_fault;
|
||||||
}
|
}
|
||||||
|
@ -545,7 +536,10 @@ static bool get_phys_addr_v5(CPUARMState *env, S1Translate *ptw,
|
||||||
/* Fine pagetable. */
|
/* Fine pagetable. */
|
||||||
table = (desc & 0xfffff000) | ((address >> 8) & 0xffc);
|
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) {
|
if (fi->type != ARMFault_None) {
|
||||||
goto do_fault;
|
goto do_fault;
|
||||||
}
|
}
|
||||||
|
@ -630,7 +624,10 @@ static bool get_phys_addr_v6(CPUARMState *env, S1Translate *ptw,
|
||||||
fi->type = ARMFault_Translation;
|
fi->type = ARMFault_Translation;
|
||||||
goto do_fault;
|
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) {
|
if (fi->type != ARMFault_None) {
|
||||||
goto do_fault;
|
goto do_fault;
|
||||||
}
|
}
|
||||||
|
@ -683,7 +680,10 @@ static bool get_phys_addr_v6(CPUARMState *env, S1Translate *ptw,
|
||||||
ns = extract32(desc, 3, 1);
|
ns = extract32(desc, 3, 1);
|
||||||
/* Lookup l2 entry. */
|
/* Lookup l2 entry. */
|
||||||
table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);
|
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) {
|
if (fi->type != ARMFault_None) {
|
||||||
goto do_fault;
|
goto do_fault;
|
||||||
}
|
}
|
||||||
|
@ -1272,7 +1272,10 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
|
||||||
ptw->in_ptw_idx &= ~1;
|
ptw->in_ptw_idx &= ~1;
|
||||||
ptw->in_secure = false;
|
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) {
|
if (fi->type != ARMFault_None) {
|
||||||
goto do_fault;
|
goto do_fault;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue