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.zhebryakov@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