Prefer the address_space_ld/st API over the legacy ld_phys() because it allow checking for bus access fault.
Since we removed the last legacy uses of the legacy ldst_phys() API, set the TARGET_NOT_USING_LEGACY_LDST_PHYS_API variable to hide the legacy API to alpha binaries, avoiding further API uses to creep in. Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- configs/targets/alpha-linux-user.mak | 1 + configs/targets/alpha-softmmu.mak | 1 + target/alpha/helper.c | 29 ++++++++++++++++------------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/configs/targets/alpha-linux-user.mak b/configs/targets/alpha-linux-user.mak index ee505e16ef4..2f1312f0362 100644 --- a/configs/targets/alpha-linux-user.mak +++ b/configs/targets/alpha-linux-user.mak @@ -4,3 +4,4 @@ TARGET_SYSTBL=syscall.tbl TARGET_LONG_BITS=64 TARGET_XML_FILES= gdb-xml/alpha-core.xml TARGET_NOT_USING_LEGACY_NATIVE_ENDIAN_API=y +TARGET_NOT_USING_LEGACY_LDST_PHYS_API=y diff --git a/configs/targets/alpha-softmmu.mak b/configs/targets/alpha-softmmu.mak index 22fbbf0cb08..5c6af0eafc1 100644 --- a/configs/targets/alpha-softmmu.mak +++ b/configs/targets/alpha-softmmu.mak @@ -2,3 +2,4 @@ TARGET_ARCH=alpha TARGET_LONG_BITS=64 TARGET_XML_FILES= gdb-xml/alpha-core.xml TARGET_NOT_USING_LEGACY_NATIVE_ENDIAN_API=y +TARGET_NOT_USING_LEGACY_LDST_PHYS_API=y diff --git a/target/alpha/helper.c b/target/alpha/helper.c index 80542cb0665..126a53c829b 100644 --- a/target/alpha/helper.c +++ b/target/alpha/helper.c @@ -169,6 +169,7 @@ static int get_physical_address(CPUAlphaState *env, target_ulong addr, int prot_need, int mmu_idx, target_ulong *pphys, int *pprot) { + const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED; CPUState *cs = env_cpu(env); target_long saddr = addr; target_ulong phys = 0; @@ -176,6 +177,7 @@ static int get_physical_address(CPUAlphaState *env, target_ulong addr, target_ulong pt, index; int prot = 0; int ret = MM_K_ACV; + MemTxResult txres; /* Handle physical accesses. */ if (mmu_idx == MMU_PHYS_IDX) { @@ -214,18 +216,13 @@ static int get_physical_address(CPUAlphaState *env, target_ulong addr, pt = env->ptbr; - /* - * TODO: rather than using ldq_phys_le() to read the page table we should - * use address_space_ldq() so that we can handle the case when - * the page table read gives a bus fault, rather than ignoring it. - * For the existing code the zero data that ldq_phys_le will return for - * an access to invalid memory will result in our treating the page - * table as invalid, which may even be the right behaviour. - */ - /* L1 page table read. */ index = (addr >> (TARGET_PAGE_BITS + 20)) & 0x3ff; - L1pte = ldq_phys_le(cs->as, pt + index * 8); + L1pte = address_space_ldq_le(cs->as, pt + index * 8, attrs, &txres); + if (txres != MEMTX_OK) { + /* bus fault */ + goto exit; + } if (unlikely((L1pte & PTE_VALID) == 0)) { ret = MM_K_TNV; @@ -238,7 +235,11 @@ static int get_physical_address(CPUAlphaState *env, target_ulong addr, /* L2 page table read. */ index = (addr >> (TARGET_PAGE_BITS + 10)) & 0x3ff; - L2pte = ldq_phys_le(cs->as, pt + index * 8); + L2pte = address_space_ldq_le(cs->as, pt + index * 8, attrs, &txres); + if (txres != MEMTX_OK) { + /* bus fault */ + goto exit; + } if (unlikely((L2pte & PTE_VALID) == 0)) { ret = MM_K_TNV; @@ -251,7 +252,11 @@ static int get_physical_address(CPUAlphaState *env, target_ulong addr, /* L3 page table read. */ index = (addr >> TARGET_PAGE_BITS) & 0x3ff; - L3pte = ldq_phys_le(cs->as, pt + index * 8); + L3pte = address_space_ldq_le(cs->as, pt + index * 8, attrs, &txres); + if (txres != MEMTX_OK) { + /* bus fault */ + goto exit; + } phys = L3pte >> 32 << TARGET_PAGE_BITS; if (unlikely((L3pte & PTE_VALID) == 0)) { -- 2.52.0
