Patchwork target-i386: Fix xchg rax,r8

login
register
mail settings
Submitter Richard Henderson
Date July 1, 2010, 4:42 p.m.
Message ID <1278002541-16775-1-git-send-email-rth@twiddle.net>
Download mbox | patch
Permalink /patch/57562/
State New
Headers show

Comments

Richard Henderson - July 1, 2010, 4:42 p.m.
We were ignoring REX_B while special-casing NOP, i.e. xchg eax,eax.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 target-i386/translate.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
Aurelien Jarno - July 1, 2010, 9:52 p.m.
On Thu, Jul 01, 2010 at 09:42:21AM -0700, Richard Henderson wrote:
> We were ignoring REX_B while special-casing NOP, i.e. xchg eax,eax.
> 
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
>  target-i386/translate.c |    9 +++++++--
>  1 files changed, 7 insertions(+), 2 deletions(-)

Applied, thanks.

> diff --git a/target-i386/translate.c b/target-i386/translate.c
> index 708b0a1..8cb5cf0 100644
> --- a/target-i386/translate.c
> +++ b/target-i386/translate.c
> @@ -5293,6 +5293,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;
> @@ -6663,10 +6664,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);
>          }
> -- 
> 1.7.0.1
> 
> 
>

Patch

diff --git a/target-i386/translate.c b/target-i386/translate.c
index 708b0a1..8cb5cf0 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -5293,6 +5293,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;
@@ -6663,10 +6664,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);
         }