diff options
author | Richard Henderson <rth@twiddle.net> | 2010-07-01 09:42:21 -0700 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2010-07-01 23:56:32 +0200 |
commit | 370f80376a34ab431a4b2aa9dab963ee43556439 (patch) | |
tree | 8eb729dda183fac03c491ac5c91f1808c88f5d87 | |
parent | block/vvfat.c: fix warnings with _FORTIFY_SOURCE (diff) | |
download | qemu-kvm-370f80376a34ab431a4b2aa9dab963ee43556439.tar.gz qemu-kvm-370f80376a34ab431a4b2aa9dab963ee43556439.tar.bz2 qemu-kvm-370f80376a34ab431a4b2aa9dab963ee43556439.zip |
target-i386: fix xchg rax,r8
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)
-rw-r--r-- | target-i386/translate.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/target-i386/translate.c b/target-i386/translate.c index 3de65bd1d..43aa54f14 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -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); } |