static const struct SysemuCPUOps arm_sysemu_ops = {
.has_work = arm_cpu_has_work,
- .get_phys_addr_attrs_debug = arm_cpu_get_phys_addr_attrs_debug,
+ .translate_for_debug = arm_cpu_translate_for_debug,
.asidx_from_attrs = arm_asidx_from_attrs,
.write_elf32_note = arm_cpu_write_elf32_note,
.write_elf64_note = arm_cpu_write_elf64_note,
memop, result, fi);
}
-static hwaddr arm_cpu_get_phys_addr(CPUARMState *env, vaddr addr,
- MemTxAttrs *attrs, ARMMMUIdx mmu_idx)
+static bool arm_cpu_get_phys_addr(CPUARMState *env, vaddr addr,
+ TranslateForDebugResult *result,
+ ARMMMUIdx mmu_idx)
{
S1Translate ptw = {
.in_mmu_idx = mmu_idx,
};
GetPhysAddrResult res = {};
ARMMMUFaultInfo fi = {};
- bool ret = get_phys_addr_gpc(env, &ptw, addr, MMU_DATA_LOAD, 0, &res, &fi);
- *attrs = res.f.attrs;
+ bool fault = get_phys_addr_gpc(env, &ptw, addr, MMU_DATA_LOAD, 0, &res, &fi);
- if (ret) {
- return -1;
+ if (!fault) {
+ /* translation succeeded */
+ result->physaddr = res.f.phys_addr;
+ result->attrs = res.f.attrs;
+ result->lg_page_size = res.f.lg_page_size;
}
- return res.f.phys_addr;
+ return fault;
}
-hwaddr arm_cpu_get_phys_addr_attrs_debug(CPUState *cs, vaddr addr,
- MemTxAttrs *attrs)
+bool arm_cpu_translate_for_debug(CPUState *cs, vaddr addr,
+ TranslateForDebugResult *result)
{
ARMCPU *cpu = ARM_CPU(cs);
CPUARMState *env = &cpu->env;
ARMMMUIdx mmu_idx = arm_mmu_idx(env);
- hwaddr res = arm_cpu_get_phys_addr(env, addr, attrs, mmu_idx);
-
- if (res != -1) {
- return res;
+ /*
+ * Note that this function returns true on translation success,
+ * but arm_cpu_get_phys_addr() and all the other get_phys_addr
+ * style functions in this file return true on failure.
+ */
+ if (!arm_cpu_get_phys_addr(env, addr, result, mmu_idx)) {
+ return true;
}
/*
switch (mmu_idx) {
case ARMMMUIdx_E10_1:
case ARMMMUIdx_E10_1_PAN:
- return arm_cpu_get_phys_addr(env, addr, attrs, ARMMMUIdx_E10_0);
+ return !arm_cpu_get_phys_addr(env, addr, result, ARMMMUIdx_E10_0);
case ARMMMUIdx_E20_2:
case ARMMMUIdx_E20_2_PAN:
- return arm_cpu_get_phys_addr(env, addr, attrs, ARMMMUIdx_E20_0);
+ return !arm_cpu_get_phys_addr(env, addr, result, ARMMMUIdx_E20_0);
default:
- return -1;
+ /* translation failed */
+ return false;
}
}