]> git.proxmox.com Git - mirror_qemu.git/commitdiff
monitor: QEMU Monitor Instruction Disassembly Incorrect for PowerPC LE Mode
authorTom Musta <tommusta@gmail.com>
Wed, 9 Apr 2014 19:53:24 +0000 (14:53 -0500)
committerAlexander Graf <agraf@suse.de>
Mon, 16 Jun 2014 11:24:26 +0000 (13:24 +0200)
The monitor support for disassembling instructions does not honor the MSR[LE]
bit for PowerPC processors.

This change enhances the monitor_disas() routine by supporting a flag bit
for Little Endian mode.  Bit 16 is used since that bit was used in the
analagous guest disassembly routine target_disas().

Also, to be consistent with target_disas(), the disassembler bfd_mach field
can be passed in the flags argument.

Reported-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Tom Musta <tommusta@gmail.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
disas.c
monitor.c

diff --git a/disas.c b/disas.c
index 13971679bb991fcab39ee0bea349db37f8b07d7d..44a019a2e768bae17cb2bb1426d18b2923493776 100644 (file)
--- a/disas.c
+++ b/disas.c
@@ -445,6 +445,8 @@ monitor_fprintf(FILE *stream, const char *fmt, ...)
     return 0;
 }
 
+/* Disassembler for the monitor.
+   See target_disas for a description of flags. */
 void monitor_disas(Monitor *mon, CPUArchState *env,
                    target_ulong pc, int nb_insn, int is_physical, int flags)
 {
@@ -485,11 +487,19 @@ void monitor_disas(Monitor *mon, CPUArchState *env,
     s.info.mach = bfd_mach_sparc_v9b;
 #endif
 #elif defined(TARGET_PPC)
+    if (flags & 0xFFFF) {
+        /* If we have a precise definition of the instruction set, use it. */
+        s.info.mach = flags & 0xFFFF;
+    } else {
 #ifdef TARGET_PPC64
-    s.info.mach = bfd_mach_ppc64;
+        s.info.mach = bfd_mach_ppc64;
 #else
-    s.info.mach = bfd_mach_ppc;
+        s.info.mach = bfd_mach_ppc;
 #endif
+    }
+    if ((flags >> 16) & 1) {
+        s.info.endian = BFD_ENDIAN_LITTLE;
+    }
     print_insn = print_insn_ppc;
 #elif defined(TARGET_M68K)
     print_insn = print_insn_m68k;
index ee9390f659cd28a4c547e94d26c5d85dc1f03aec..2901187f5fa748e159ac0e2a67eb8a600a6dc861 100644 (file)
--- a/monitor.c
+++ b/monitor.c
@@ -1284,6 +1284,10 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
                     flags = 1;
             }
         }
+#endif
+#ifdef TARGET_PPC
+        flags = msr_le << 16;
+        flags |= env->bfd_mach;
 #endif
         monitor_disas(mon, env, addr, count, is_physical, flags);
         return;