GDB is expected to be set to the endianness of the currently running code, which may be in LE page. Bswap the registers accordingly.
Signed-off-by: Danila Zhebryakov <d.zhebrya...@yandex.ru> --- target/ppc/gdbstub.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c index 3b28d4e21c..89c783894c 100644 --- a/target/ppc/gdbstub.c +++ b/target/ppc/gdbstub.c @@ -19,6 +19,8 @@ */ #include "qemu/osdep.h" #include "cpu.h" +#include "accel/tcg/probe.h" +#include "exec/tlb-flags.h" #include "exec/gdbstub.h" #include "gdbstub/helpers.h" #include "internal.h" @@ -84,7 +86,20 @@ 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)) { + bool le_page = false; + + if (env->mmu_model == POWERPC_MMU_BOOKE206) { + CPUTLBEntryFull *full; + void *host; + int mmu_idx = ppc_env_mmu_index(env, true); + + probe_access_full_mmu(env, env->nip, 0, MMU_INST_FETCH, mmu_idx, + &host, &full); + + le_page = full->tlb_fill_flags & TLB_BSWAP; + } + + if (!le_page && !FIELD_EX64(env->msr, MSR, LE)) { /* do nothing */ } else if (len == 4) { bswap32s((uint32_t *)mem_buf); -- 2.47.2