target/arm: Fill in TCGCPUOps.pointer_wrap

For a-profile, check A32 vs A64 state.
For m-profile, use cpu_pointer_wrap_uint32.

Cc: qemu-arm@nongnu.org
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2025-05-04 09:27:42 -07:00
parent 981f2beb16
commit d21144a48c
2 changed files with 25 additions and 0 deletions

View file

@ -2703,6 +2703,29 @@ static const struct SysemuCPUOps arm_sysemu_ops = {
#endif
#ifdef CONFIG_TCG
#ifndef CONFIG_USER_ONLY
static vaddr aprofile_pointer_wrap(CPUState *cs, int mmu_idx,
vaddr result, vaddr base)
{
/*
* The Stage2 and Phys indexes are only used for ptw on arm32,
* and all pte's are aligned, so we never produce a wrap for these.
* Double check that we're not truncating a 40-bit physical address.
*/
assert((unsigned)mmu_idx < (ARMMMUIdx_Stage2_S & ARM_MMU_IDX_COREIDX_MASK));
if (!is_a64(cpu_env(cs))) {
return (uint32_t)result;
}
/*
* TODO: For FEAT_CPA2, decide how to we want to resolve
* Unpredictable_CPACHECK in AddressIncrement.
*/
return result;
}
#endif /* !CONFIG_USER_ONLY */
static const TCGCPUOps arm_tcg_ops = {
.mttcg_supported = true,
/* ARM processors have a weak memory model */
@ -2722,6 +2745,7 @@ static const TCGCPUOps arm_tcg_ops = {
.untagged_addr = aarch64_untagged_addr,
#else
.tlb_fill_align = arm_cpu_tlb_fill_align,
.pointer_wrap = aprofile_pointer_wrap,
.cpu_exec_interrupt = arm_cpu_exec_interrupt,
.cpu_exec_halt = arm_cpu_exec_halt,
.cpu_exec_reset = cpu_reset,

View file

@ -249,6 +249,7 @@ static const TCGCPUOps arm_v7m_tcg_ops = {
.record_sigbus = arm_cpu_record_sigbus,
#else
.tlb_fill_align = arm_cpu_tlb_fill_align,
.pointer_wrap = cpu_pointer_wrap_uint32,
.cpu_exec_interrupt = arm_v7m_cpu_exec_interrupt,
.cpu_exec_halt = arm_cpu_exec_halt,
.cpu_exec_reset = cpu_reset,