The SPARC architecture uses big endianness. Directly use
the big-endian LD/ST API.
Mechanical change running:
$ for a in uw w l q; do \
sed -i -e "s/ld${a}_p(/ld${a}_be_p(/" \
$(git grep -wlE '(ld|st)u?[wlq]_p' target/sparc/);
done
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
target/sparc/ldst_helper.c | 12 ++++++------
target/sparc/mmu_helper.c | 32 +++++++++++++++++---------------
2 files changed, 23 insertions(+), 21 deletions(-)
diff --git a/target/sparc/ldst_helper.c b/target/sparc/ldst_helper.c
index e9139814c26..043711f11dc 100644
--- a/target/sparc/ldst_helper.c
+++ b/target/sparc/ldst_helper.c
@@ -861,10 +861,10 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr,
uint64_t val,
MemTxResult result;
hwaddr access_addr = (env->mxccregs[0] & 0xffffffffULL) + 8 *
i;
- env->mxccdata[i] = address_space_ldq(cs->as,
- access_addr,
- MEMTXATTRS_UNSPECIFIED,
- &result);
+ env->mxccdata[i] = address_space_ldq_be(cs->as,
+ access_addr,
+ MEMTXATTRS_UNSPECIFIED,
+ &result);
if (result != MEMTX_OK) {
/* TODO: investigate whether this is the right behaviour */
sparc_raise_mmu_fault(cs, access_addr, false, false,
@@ -889,8 +889,8 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr,
uint64_t val,
MemTxResult result;
hwaddr access_addr = (env->mxccregs[1] & 0xffffffffULL) + 8 *
i;
- address_space_stq(cs->as, access_addr, env->mxccdata[i],
- MEMTXATTRS_UNSPECIFIED, &result);
+ address_space_stq_be(cs->as, access_addr, env->mxccdata[i],
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
/* TODO: investigate whether this is the right behaviour */
diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c
index 46bf500ea83..5a58239d65e 100644
--- a/target/sparc/mmu_helper.c
+++ b/target/sparc/mmu_helper.c
@@ -102,7 +102,8 @@ static int get_physical_address(CPUSPARCState *env,
CPUTLBEntryFull *full,
/* SPARC reference MMU table walk: Context table->L1->L2->PTE */
/* Context base + context number */
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2);
- pde = address_space_ldl(cs->as, pde_ptr, MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return 4 << 2; /* Translation fault, L = 0 */
}
@@ -117,8 +118,8 @@ static int get_physical_address(CPUSPARCState *env,
CPUTLBEntryFull *full,
return 4 << 2;
case 1: /* L0 PDE */
pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4);
- pde = address_space_ldl(cs->as, pde_ptr,
- MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return (1 << 8) | (4 << 2); /* Translation fault, L = 1 */
}
@@ -131,8 +132,8 @@ static int get_physical_address(CPUSPARCState *env,
CPUTLBEntryFull *full,
return (1 << 8) | (4 << 2);
case 1: /* L1 PDE */
pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4);
- pde = address_space_ldl(cs->as, pde_ptr,
- MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return (2 << 8) | (4 << 2); /* Translation fault, L = 2 */
}
@@ -145,8 +146,8 @@ static int get_physical_address(CPUSPARCState *env,
CPUTLBEntryFull *full,
return (2 << 8) | (4 << 2);
case 1: /* L2 PDE */
pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4);
- pde = address_space_ldl(cs->as, pde_ptr,
- MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return (3 << 8) | (4 << 2); /* Translation fault, L = 3 */
}
@@ -189,7 +190,7 @@ static int get_physical_address(CPUSPARCState *env,
CPUTLBEntryFull *full,
if (is_dirty) {
pde |= PG_MODIFIED_MASK;
}
- stl_phys(cs->as, pde_ptr, pde);
+ stl_be_phys(cs->as, pde_ptr, pde);
}
/* the page can be put in the TLB */
@@ -276,7 +277,8 @@ target_ulong mmu_probe(CPUSPARCState *env, target_ulong
address, int mmulev)
/* Context base + context number */
pde_ptr = (hwaddr)(env->mmuregs[1] << 4) +
(env->mmuregs[2] << 2);
- pde = address_space_ldl(cs->as, pde_ptr, MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return 0;
}
@@ -292,8 +294,8 @@ target_ulong mmu_probe(CPUSPARCState *env, target_ulong
address, int mmulev)
return pde;
}
pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4);
- pde = address_space_ldl(cs->as, pde_ptr,
- MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return 0;
}
@@ -310,8 +312,8 @@ target_ulong mmu_probe(CPUSPARCState *env, target_ulong
address, int mmulev)
return pde;
}
pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4);
- pde = address_space_ldl(cs->as, pde_ptr,
- MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return 0;
}
@@ -328,8 +330,8 @@ target_ulong mmu_probe(CPUSPARCState *env, target_ulong
address, int mmulev)
return pde;
}
pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4);
- pde = address_space_ldl(cs->as, pde_ptr,
- MEMTXATTRS_UNSPECIFIED, &result);
+ pde = address_space_ldl_be(cs->as, pde_ptr,
+ MEMTXATTRS_UNSPECIFIED, &result);
if (result != MEMTX_OK) {
return 0;
}
--
2.52.0