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é <philmd@linaro.org> Reviewed-by: Anton Johansson <anjo@rev.ng> Message-ID: <20260202210106.93257-6-philmd@linaro.org>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user