qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PULL 24/25] target-i386: Fix eflags.TF/#DB handling of


From: Doug Evans
Subject: Re: [Qemu-devel] [PULL 24/25] target-i386: Fix eflags.TF/#DB handling of syscall/sysret insns
Date: Fri, 23 Dec 2016 19:33:03 +0000

Paolo Bonzini writes:
 > From: Doug Evans <address@hidden>
 >
 > The syscall and sysret instructions behave a bit differently:
 > TF is checked after the instruction completes.
 > This allows the o/s to disable #DB at a syscall by adding TF to FMASK.
 > And then when the sysret is executed the #DB is taken "as if" the
 > syscall insn just completed.
 >
 > Signed-off-by: Doug Evans <address@hidden>
 > Message-Id: <address@hidden>
 > Signed-off-by: Paolo Bonzini <address@hidden>
 > ---
 >  target/i386/bpt_helper.c |  7 +++++++
 >  target/i386/helper.h     |  1 +
 >  target/i386/translate.c  | 29 ++++++++++++++++++++++++-----
 >  3 files changed, 32 insertions(+), 5 deletions(-)
 >
 > ...
 > diff --git a/target/i386/translate.c b/target/i386/translate.c
 > index 324103c..59e11fc 100644
 > --- a/target/i386/translate.c
 > +++ b/target/i386/translate.c
> @@ -6423,7 +6435,10 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, > tcg_const_i32(s->pc - s->cs_base));
 >              set_cc_op(s, CC_OP_EFLAGS);
 >          }
 > -        gen_eob(s);
> + /* TF handling for the syscall insn is different. The TF bit is checked
 > +           after the syscall insn completes. This allows #DB to not be
> + generated after one has entered CPL0 if TF is set in FMASK. */
 > +        gen_eob_worker(s, false, true);
 >          break;
 >      case 0xe8: /* call im */
 >          {
> @@ -7115,7 +7130,11 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s,
 >              if (s->lma) {
 >                  set_cc_op(s, CC_OP_EFLAGS);
 >              }
 > -            gen_eob(s);
> + /* TF handling for the sysret insn is different. The TF bit is > + checked after the sysret insn completes. This allows #DB to be
 > +               generated "as if" the syscall insn in userspace has just
 > +               completed.  */
 > +            gen_eob_worker(s, false, true);
 >          }
 >          break;
 >  #endif

Hi. Just a heads up that this patch got applied wrong (patch does that some times).

The change to the "syscall" insn got applied to the "iret" instruction instead.

Working on a fix.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]