mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 21:40:49 +00:00
target/arm: Move aa32_va_parameters to ptw.c
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220604040607.269301-22-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
c5168785d2
commit
2f0ec92e94
@ -10771,70 +10771,6 @@ ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
||||
ARMMMUIdx mmu_idx)
|
||||
{
|
||||
uint64_t tcr = regime_tcr(env, mmu_idx)->raw_tcr;
|
||||
uint32_t el = regime_el(env, mmu_idx);
|
||||
int select, tsz;
|
||||
bool epd, hpd;
|
||||
|
||||
assert(mmu_idx != ARMMMUIdx_Stage2_S);
|
||||
|
||||
if (mmu_idx == ARMMMUIdx_Stage2) {
|
||||
/* VTCR */
|
||||
bool sext = extract32(tcr, 4, 1);
|
||||
bool sign = extract32(tcr, 3, 1);
|
||||
|
||||
/*
|
||||
* If the sign-extend bit is not the same as t0sz[3], the result
|
||||
* is unpredictable. Flag this as a guest error.
|
||||
*/
|
||||
if (sign != sext) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"AArch32: VTCR.S / VTCR.T0SZ[3] mismatch\n");
|
||||
}
|
||||
tsz = sextract32(tcr, 0, 4) + 8;
|
||||
select = 0;
|
||||
hpd = false;
|
||||
epd = false;
|
||||
} else if (el == 2) {
|
||||
/* HTCR */
|
||||
tsz = extract32(tcr, 0, 3);
|
||||
select = 0;
|
||||
hpd = extract64(tcr, 24, 1);
|
||||
epd = false;
|
||||
} else {
|
||||
int t0sz = extract32(tcr, 0, 3);
|
||||
int t1sz = extract32(tcr, 16, 3);
|
||||
|
||||
if (t1sz == 0) {
|
||||
select = va > (0xffffffffu >> t0sz);
|
||||
} else {
|
||||
/* Note that we will detect errors later. */
|
||||
select = va >= ~(0xffffffffu >> t1sz);
|
||||
}
|
||||
if (!select) {
|
||||
tsz = t0sz;
|
||||
epd = extract32(tcr, 7, 1);
|
||||
hpd = extract64(tcr, 41, 1);
|
||||
} else {
|
||||
tsz = t1sz;
|
||||
epd = extract32(tcr, 23, 1);
|
||||
hpd = extract64(tcr, 42, 1);
|
||||
}
|
||||
/* For aarch32, hpd0 is not enabled without t2e as well. */
|
||||
hpd &= extract32(tcr, 6, 1);
|
||||
}
|
||||
|
||||
return (ARMVAParameters) {
|
||||
.tsz = tsz,
|
||||
.select = select,
|
||||
.epd = epd,
|
||||
.hpd = hpd,
|
||||
};
|
||||
}
|
||||
|
||||
hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
|
||||
MemTxAttrs *attrs)
|
||||
{
|
||||
|
@ -615,6 +615,70 @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
|
||||
return prot_rw | PAGE_EXEC;
|
||||
}
|
||||
|
||||
static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
||||
ARMMMUIdx mmu_idx)
|
||||
{
|
||||
uint64_t tcr = regime_tcr(env, mmu_idx)->raw_tcr;
|
||||
uint32_t el = regime_el(env, mmu_idx);
|
||||
int select, tsz;
|
||||
bool epd, hpd;
|
||||
|
||||
assert(mmu_idx != ARMMMUIdx_Stage2_S);
|
||||
|
||||
if (mmu_idx == ARMMMUIdx_Stage2) {
|
||||
/* VTCR */
|
||||
bool sext = extract32(tcr, 4, 1);
|
||||
bool sign = extract32(tcr, 3, 1);
|
||||
|
||||
/*
|
||||
* If the sign-extend bit is not the same as t0sz[3], the result
|
||||
* is unpredictable. Flag this as a guest error.
|
||||
*/
|
||||
if (sign != sext) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"AArch32: VTCR.S / VTCR.T0SZ[3] mismatch\n");
|
||||
}
|
||||
tsz = sextract32(tcr, 0, 4) + 8;
|
||||
select = 0;
|
||||
hpd = false;
|
||||
epd = false;
|
||||
} else if (el == 2) {
|
||||
/* HTCR */
|
||||
tsz = extract32(tcr, 0, 3);
|
||||
select = 0;
|
||||
hpd = extract64(tcr, 24, 1);
|
||||
epd = false;
|
||||
} else {
|
||||
int t0sz = extract32(tcr, 0, 3);
|
||||
int t1sz = extract32(tcr, 16, 3);
|
||||
|
||||
if (t1sz == 0) {
|
||||
select = va > (0xffffffffu >> t0sz);
|
||||
} else {
|
||||
/* Note that we will detect errors later. */
|
||||
select = va >= ~(0xffffffffu >> t1sz);
|
||||
}
|
||||
if (!select) {
|
||||
tsz = t0sz;
|
||||
epd = extract32(tcr, 7, 1);
|
||||
hpd = extract64(tcr, 41, 1);
|
||||
} else {
|
||||
tsz = t1sz;
|
||||
epd = extract32(tcr, 23, 1);
|
||||
hpd = extract64(tcr, 42, 1);
|
||||
}
|
||||
/* For aarch32, hpd0 is not enabled without t2e as well. */
|
||||
hpd &= extract32(tcr, 6, 1);
|
||||
}
|
||||
|
||||
return (ARMVAParameters) {
|
||||
.tsz = tsz,
|
||||
.select = select,
|
||||
.epd = epd,
|
||||
.hpd = hpd,
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* check_s2_mmu_setup
|
||||
* @cpu: ARMCPU
|
||||
|
@ -25,8 +25,5 @@ simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap)
|
||||
return simple_ap_to_rw_prot_is_user(ap, regime_is_user(env, mmu_idx));
|
||||
}
|
||||
|
||||
ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
||||
ARMMMUIdx mmu_idx);
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
#endif /* TARGET_ARM_PTW_H */
|
||||
|
Loading…
Reference in New Issue
Block a user