From: Philippe Mathieu-Daudé Date: Wed, 3 Dec 2025 18:08:28 +0000 (+0100) Subject: target/ppc: Introduce ppc_data_endian_env() helper X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=043c4e17151f9d36e093f43fdbff6106e4ce1957;p=thirdparty%2Fqemu.git target/ppc: Introduce ppc_data_endian_env() helper Introduce ppc_data_endian_env() which returns the endian MemOp of the data path from the vCPU env pointer. Keep it hardcoded as MO_TE, the target built-time endianness. Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Anton Johansson Message-ID: <20260202210106.93257-6-philmd@linaro.org> --- diff --git a/target/ppc/internal.h b/target/ppc/internal.h index 58f315ffcf..c3d3590cc8 100644 --- a/target/ppc/internal.h +++ b/target/ppc/internal.h @@ -19,10 +19,22 @@ #define PPC_INTERNAL_H #include "exec/breakpoint.h" +#include "exec/memop.h" #include "hw/core/registerfields.h" #include "exec/page-protection.h" #include "accel/tcg/tb-cpu-state.h" +/** + * ppc_data_endian_env: + * @env: the cpu context + * + * Return the MemOp endianness of the DATA path. + */ +static inline MemOp ppc_data_endian_env(const CPUPPCState *env) +{ + return MO_TE; +} + /* PM instructions */ typedef enum { PPC_PM_DOZE, diff --git a/target/ppc/mem_helper.c b/target/ppc/mem_helper.c index 9054696759..ca84131d1a 100644 --- a/target/ppc/mem_helper.c +++ b/target/ppc/mem_helper.c @@ -88,7 +88,7 @@ void helper_lmw(CPUPPCState *env, target_ulong addr, uint32_t reg) } } else { /* Slow path -- at least some of the operation requires i/o. */ - MemOp op = MO_TE | MO_UL | MO_UNALN; + MemOp op = ppc_data_endian_env(env) | MO_UL | MO_UNALN; MemOpIdx oi = make_memop_idx(op, mmu_idx); for (; reg < 32; reg++) { @@ -114,7 +114,7 @@ void helper_stmw(CPUPPCState *env, target_ulong addr, uint32_t reg) } else { /* Slow path -- at least some of the operation requires i/o. */ for (; reg < 32; reg++) { - MemOp op = MO_TE | MO_UL | MO_UNALN; + MemOp op = ppc_data_endian_env(env) | MO_UL | MO_UNALN; MemOpIdx oi = make_memop_idx(op, mmu_idx); cpu_stl_mmu(env, addr, env->gpr[reg], oi, raddr); @@ -158,7 +158,7 @@ static void do_lsw(CPUPPCState *env, target_ulong addr, uint32_t nb, break; } } else { - MemOp op = MO_TE | MO_UL | MO_UNALN; + MemOp op = ppc_data_endian_env(env) | MO_UL | MO_UNALN; MemOpIdx oi = make_memop_idx(op, mmu_idx); /* Slow path -- at least some of the operation requires i/o. */ @@ -174,12 +174,12 @@ static void do_lsw(CPUPPCState *env, target_ulong addr, uint32_t nb, val = cpu_ldub_mmuidx_ra(env, addr, mmu_idx, raddr) << 24; break; case 2: - op = MO_TE | MO_UW | MO_UNALN; + op = ppc_data_endian_env(env) | MO_UW | MO_UNALN; oi = make_memop_idx(op, mmu_idx); val = cpu_ldw_mmu(env, addr, oi, raddr) << 16; break; case 3: - op = MO_TE | MO_UW | MO_UNALN; + op = ppc_data_endian_env(env) | MO_UW | MO_UNALN; oi = make_memop_idx(op, mmu_idx); val = cpu_ldw_mmu(env, addr, oi, raddr) << 16; addr = addr_add(env, addr, 2); @@ -254,7 +254,7 @@ void helper_stsw(CPUPPCState *env, target_ulong addr, uint32_t nb, break; } } else { - MemOp op = MO_TE | MO_UL | MO_UNALN; + MemOp op = ppc_data_endian_env(env) | MO_UL | MO_UNALN; MemOpIdx oi = make_memop_idx(op, mmu_idx); for (; nb > 3; nb -= 4) { @@ -268,12 +268,12 @@ void helper_stsw(CPUPPCState *env, target_ulong addr, uint32_t nb, cpu_stb_mmuidx_ra(env, addr, val >> 24, mmu_idx, raddr); break; case 2: - op = MO_TE | MO_UW | MO_UNALN; + op = ppc_data_endian_env(env) | MO_UW | MO_UNALN; oi = make_memop_idx(op, mmu_idx); cpu_stw_mmu(env, addr, val >> 16, oi, raddr); break; case 3: - op = MO_TE | MO_UW | MO_UNALN; + op = ppc_data_endian_env(env) | MO_UW | MO_UNALN; oi = make_memop_idx(op, mmu_idx); cpu_stw_mmu(env, addr, val >> 16, oi, raddr); addr = addr_add(env, addr, 2); @@ -304,7 +304,7 @@ static void dcbz_common(CPUPPCState *env, target_ulong addr, haddr = probe_write(env, addr, dcbz_size, mmu_idx, retaddr); if (unlikely(!haddr)) { /* Slow path */ - MemOp op = MO_TE | MO_UQ | MO_UNALN; + MemOp op = ppc_data_endian_env(env) | MO_UQ | MO_UNALN; MemOpIdx oi = make_memop_idx(op, mmu_idx); for (int i = 0; i < dcbz_size; i += 8) { diff --git a/target/ppc/tcg-excp_helper.c b/target/ppc/tcg-excp_helper.c index a8c6736466..3f9eb3d924 100644 --- a/target/ppc/tcg-excp_helper.c +++ b/target/ppc/tcg-excp_helper.c @@ -161,7 +161,7 @@ static void do_hash(CPUPPCState *env, target_ulong ea, target_ulong ra, { uint64_t calculated_hash = hash_digest(ra, rb, key), loaded_hash; unsigned mmu_idx = cpu_mmu_index(env_cpu(env), false); - MemOp op = MO_TE | MO_UQ; + MemOp op = ppc_data_endian_env(env) | MO_UQ; MemOpIdx oi = make_memop_idx(op, mmu_idx); uintptr_t retaddr = GETPC();