Centralize endianness check on MSR via a common helper.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/ppc/internal.h | 5 +++++
target/ppc/cpu_init.c | 9 +++------
target/ppc/gdbstub.c | 2 +-
target/ppc/mem_helper.c | 8 ++++----
4 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index 09333bed342..714629079b5 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -24,6 +24,11 @@
#include "exec/page-protection.h"
#include "accel/tcg/tb-cpu-state.h"
+static inline bool ppc_env_is_little_endian(const CPUPPCState *env)
+{
+ return FIELD_EX64(env->msr, MSR, LE);
+}
+
static inline MemOp mo_endian_env(const CPUPPCState *env)
{
return MO_TE;
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
index 0808284b722..c5cec7c2ed9 100644
--- a/target/ppc/cpu_init.c
+++ b/target/ppc/cpu_init.c
@@ -7364,7 +7364,7 @@ static bool ppc_cpu_is_big_endian(CPUState *cs)
{
cpu_synchronize_state(cs);
- return !FIELD_EX64(cpu_env(cs)->msr, MSR, LE);
+ return !ppc_env_is_little_endian(cpu_env(cs));
}
static bool ppc_get_irq_stats(InterruptStatsProvider *obj,
@@ -7456,11 +7456,8 @@ static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
{
CPUPPCState *env = cpu_env(cs);
- if ((env->msr >> MSR_LE) & 1) {
- info->endian = BFD_ENDIAN_LITTLE;
- } else {
- info->endian = BFD_ENDIAN_BIG;
- }
+ info->endian = ppc_env_is_little_endian(env) ? BFD_ENDIAN_LITTLE
+ : BFD_ENDIAN_BIG;
info->mach = env->bfd_mach;
if (!env->bfd_mach) {
#ifdef TARGET_PPC64
diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c
index 3b28d4e21c7..b19c0f1ea9c 100644
--- a/target/ppc/gdbstub.c
+++ b/target/ppc/gdbstub.c
@@ -84,7 +84,7 @@ static int ppc_gdb_register_len(int n)
void ppc_maybe_bswap_register(CPUPPCState *env, uint8_t *mem_buf, int len)
{
#ifndef CONFIG_USER_ONLY
- if (!FIELD_EX64(env->msr, MSR, LE)) {
+ if (!ppc_env_is_little_endian(env)) {
/* do nothing */
} else if (len == 4) {
bswap32s((uint32_t *)mem_buf);
diff --git a/target/ppc/mem_helper.c b/target/ppc/mem_helper.c
index 89718441310..31057c6440a 100644
--- a/target/ppc/mem_helper.c
+++ b/target/ppc/mem_helper.c
@@ -420,7 +420,7 @@ target_ulong helper_lscbx(CPUPPCState *env, target_ulong addr, uint32_t reg,
int adjust = HI_IDX * (n_elems - 1); \
int sh = sizeof(r->element[0]) >> 1; \
int index = (addr & 0xf) >> sh; \
- bool byteswap = FIELD_EX64(env->msr, MSR, LE); \
+ bool byteswap = ppc_env_is_little_endian(env); \
\
if (byteswap) { \
index = n_elems - index - 1; \
@@ -446,7 +446,7 @@ LVE(LVEWX, cpu_ldl_be_data_ra, bswap32, u32)
int adjust = HI_IDX * (n_elems - 1); \
int sh = sizeof(r->element[0]) >> 1; \
int index = (addr & 0xf) >> sh; \
- bool byteswap = FIELD_EX64(env->msr, MSR, LE); \
+ bool byteswap = ppc_env_is_little_endian(env); \
\
if (byteswap) { \
index = n_elems - index - 1; \
@@ -479,7 +479,7 @@ void helper_##name(CPUPPCState *env, target_ulong addr, \
t.s128 = int128_zero(); \
if (nb) { \
nb = (nb >= 16) ? 16 : nb; \
- if (FIELD_EX64(env->msr, MSR, LE) && !lj) { \
+ if (ppc_env_is_little_endian(env) && !lj) { \
for (i = 16; i > 16 - nb; i--) { \
t.VsrB(i - 1) = cpu_ldub_data_ra(env, addr, GETPC()); \
addr = addr_add(env, addr, 1); \
@@ -510,7 +510,7 @@ void helper_##name(CPUPPCState *env, target_ulong addr, \
} \
\
nb = (nb >= 16) ? 16 : nb; \
- if (FIELD_EX64(env->msr, MSR, LE) && !lj) { \
+ if (ppc_env_is_little_endian(env) && !lj) { \
for (i = 16; i > 16 - nb; i--) { \
cpu_stb_data_ra(env, addr, xt->VsrB(i - 1), GETPC()); \
addr = addr_add(env, addr, 1); \
--
2.52.0