| 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
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); }
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(-)