]> git.proxmox.com Git - qemu.git/commitdiff
target-i386: fix xchg rax,r8
authorRichard Henderson <rth@twiddle.net>
Thu, 1 Jul 2010 16:42:21 +0000 (09:42 -0700)
committerAurelien Jarno <aurelien@aurel32.net>
Thu, 1 Jul 2010 21:56:32 +0000 (23:56 +0200)
We were ignoring REX_B while special-casing NOP, i.e. xchg eax,eax.

Signed-off-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
(cherry picked from commit 7418027ea4fec276455abd4291558bc58a0a7ba7)

target-i386/translate.c

index 3de65bd1d8c38cd0156d898087417c68f197697d..43aa54f14066a582aeedbc2d257c5d1c86c66de1 100644 (file)
@@ -5296,6 +5296,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
         break;
 
     case 0x91 ... 0x97: /* xchg R, EAX */
+    do_xchg_reg_eax:
         ot = dflag + OT_WORD;
         reg = (b & 7) | REX_B(s);
         rm = R_EAX;
@@ -6666,10 +6667,14 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
         /************************/
         /* misc */
     case 0x90: /* nop */
-        /* XXX: xchg + rex handling */
         /* XXX: correct lock test for all insn */
-        if (prefixes & PREFIX_LOCK)
+        if (prefixes & PREFIX_LOCK) {
             goto illegal_op;
+        }
+        /* If REX_B is set, then this is xchg eax, r8d, not a nop.  */
+        if (REX_B(s)) {
+            goto do_xchg_reg_eax;
+        }
         if (prefixes & PREFIX_REPZ) {
             gen_svm_check_intercept(s, pc_start, SVM_EXIT_PAUSE);
         }