From: Petre Ovidiu PIRCALABU <ppircalabu@bitdefender.com>
To: "JBeulich@suse.com" <JBeulich@suse.com>
Cc: "kevin.tian@intel.com" <kevin.tian@intel.com>,
"sstabellini@kernel.org" <sstabellini@kernel.org>,
"wei.liu2@citrix.com" <wei.liu2@citrix.com>,
"rcojocaru@bitdefender.com" <rcojocaru@bitdefender.com>,
"George.Dunlap@eu.citrix.com" <George.Dunlap@eu.citrix.com>,
"andrew.cooper3@citrix.com" <andrew.cooper3@citrix.com>,
"ian.jackson@eu.citrix.com" <ian.jackson@eu.citrix.com>,
"tim@xen.org" <tim@xen.org>,
"paul.durrant@citrix.com" <paul.durrant@citrix.com>,
"tamas@tklengyel.com" <tamas@tklengyel.com>,
"jun.nakajima@intel.com" <jun.nakajima@intel.com>,
"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>
Subject: Re: [PATCH v11 2/5] x86emul: New return code for unimplemented instruction
Date: Wed, 20 Sep 2017 21:47:47 +0000 [thread overview]
Message-ID: <1505944059.1983.7.camel@bitdefender.com> (raw)
In-Reply-To: <59C15197020000780017CF39@prv-mh.provo.novell.com>
On Ma, 2017-09-19 at 09:19 -0600, Jan Beulich wrote:
> >
> > >
> > > >
> > > > On 12.09.17 at 16:32, <ppircalabu@bitdefender.com> wrote:
> > Enforce the distinction between an instruction not implemented by
> > the
> > emulator and the failure to emulate that instruction by defining a
> > new
> > return code, X86EMUL_UNIMPLEMENTED.
> >
> > This value should only be returned by the core emulator only if it
> > fails to
> > properly decode the current instruction's opcode, and not by any of
> > other
> > functions, such as the x86_emulate_ops or the hvm_io_ops callbacks.
> >
> > e.g. hvm_process_io_intercept should not return
> > X86EMUL_UNIMPLEMENTED.
> > The return value of this function depends on either the return code
> > of
> > one of the hvm_io_ops handlers (read/write) or the value returned
> > by
> > hvm_copy_guest_from_phys / hvm_copy_to_guest_phys.
> >
> > Similary, none of this functions should not return
> > X86EMUL_UNIMPLEMENTED.
> I think someone had already pointed out the strange double
> negation here.
Will be fixed in the next patchset iteration.
>
> >
> > --- a/xen/arch/x86/hvm/emulate.c
> > +++ b/xen/arch/x86/hvm/emulate.c
> > @@ -192,6 +192,8 @@ static int hvmemul_do_io(
> > ASSERT(p.count <= *reps);
> > *reps = vio->io_req.count = p.count;
> >
> > + ASSERT(rc != X86EMUL_UNIMPLEMENTED);
> > +
> > switch ( rc )
> > {
> > case X86EMUL_OKAY:
> The assertion want to move into the switch(), making use
> of ASSERT_UNREACHABLE().
>
Will be fixed in the next patchset iteration.
> >
> > @@ -2045,6 +2054,7 @@ int hvm_emulate_one_mmio(unsigned long mfn,
> > unsigned long gla)
> > switch ( rc )
> > {
> > case X86EMUL_UNHANDLEABLE:
> > + case X86EMUL_UNIMPLEMENTED:
> > hvm_dump_emulation_state(XENLOG_G_WARNING, "MMCFG",
> > &ctxt);
> > break;
> I would have preferred if, just like you do here, ...
>
> >
> > @@ -2102,6 +2112,7 @@ void hvm_emulate_one_vm_event(enum emul_kind
> > kind, unsigned int trapnr,
> > * consistent with X86EMUL_RETRY.
> > */
> > return;
> > + case X86EMUL_UNIMPLEMENTED:
> > case X86EMUL_UNHANDLEABLE:
> > hvm_dump_emulation_state(XENLOG_G_DEBUG, "Mem event",
> > &ctx);
> ... you had added the new case label below existing ones uniformly.
> But anyway.
The order is reversed in this case because the patch 4/5 from this
series adds the hvm_monitor_emul_unimplemented call and the "Fall-
through" in case of failure. If I change the default order here, I will
have to reverse it when adding the monitor notification handling.
>
> >
> > @@ -2585,7 +2586,7 @@ x86_decode(
> > d = twobyte_table[0x3a].desc;
> > break;
> > default:
> > - rc = X86EMUL_UNHANDLEABLE;
> > + rc = X86EMUL_UNIMPLEMENTED;
> > goto done;
> > }
> > }
> > @@ -2599,7 +2600,7 @@ x86_decode(
> > }
> > else
> > {
> > - rc = X86EMUL_UNHANDLEABLE;
> > + rc = X86EMUL_UNIMPLEMENTED;
> > goto done;
> At least these two should be "unrecognized" now.
Will be fixed in the next patchset iteration.
>
> >
> > @@ -2879,7 +2880,7 @@ x86_decode(
> >
> > default:
> > ASSERT_UNREACHABLE();
> > - return X86EMUL_UNHANDLEABLE;
> > + return X86EMUL_UNIMPLEMENTED;
> > }
> This one, otoh, is probably fine this way for now.
>
> >
> > @@ -6195,7 +6196,7 @@ x86_emulate(
> > /* vpsll{w,d} $imm8,{x,y}mm,{x,y}mm */
> > break;
> > default:
> > - goto cannot_emulate;
> > + goto unimplemented_insn;
> > }
> This again wants to be "unrecognized".
In this case "unrecognized" cannot be returned (yet) as instructions
VPRORD and VPROLD are not implemented.
http://sandpile.org/x86/opc_grp.htm (group #13 (EVEX 66h) (0Fh,72h) )
>
> >
> > @@ -6243,7 +6244,7 @@ x86_emulate(
> > case 6: /* psllq $imm8,mm */
> > goto simd_0f_shift_imm;
> > }
> > - goto cannot_emulate;
> > + goto unimplemented_insn;
> And this too. Together with previous discussion I think you should
> now see the pattern for everything further down from here.
Will be fixed in the next patchset iteration.
>
> >
> > --- a/xen/arch/x86/x86_emulate/x86_emulate.h
> > +++ b/xen/arch/x86/x86_emulate/x86_emulate.h
> > @@ -133,6 +133,18 @@ struct x86_emul_fpu_aux {
> > * Undefined behavior when used anywhere else.
> > */
> > #define X86EMUL_DONE 4
> > + /*
> > + * Current instruction is not implemented by the emulator.
> > + * This value should only be returned by the core emulator if
> > decode fails
> Why "if decode fails"? In that case it's more "unrecognized" than
> "unimplemented"; the latter can only ever arise (long term, i.e.
> once we have proper distinction of the two) if we successfully
> decoded an insn, but have no code to actually handle it.
>
> >
> > + * and not by any of the x86_emulate_ops callbacks.
> > + * If this error code is returned by a function, an #UD trap
> > should be
> > + * raised by the final consumer of it.
> This last sentence would now really belong to
> X86EMUL_UNRECOGNIZED. As explained earlier, raising #UD
> for unimplemented is precisely the wrong choice architecturally,
> we merely tolerate doing so for the time being.
>
Will be fixed in the next patchset iteration.
> Jan
>
> ________________________
> This email was scanned by Bitdefender
Many thanks for your support,
//Petre
________________________
This email was scanned by Bitdefender
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-09-20 21:47 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-12 14:32 [PATCH v11 0/5] Notify monitor when emulating an unimplemented instruction Petre Pircalabu
2017-09-12 14:32 ` [PATCH v11 1/5] gitignore: add local vimrc files Petre Pircalabu
2017-09-13 8:56 ` Wei Liu
2017-09-12 14:32 ` [PATCH v11 2/5] x86emul: New return code for unimplemented instruction Petre Pircalabu
2017-09-14 18:15 ` Kent R. Spillner
2017-09-19 15:19 ` Jan Beulich
2017-09-20 21:47 ` Petre Ovidiu PIRCALABU [this message]
2017-09-21 6:29 ` Jan Beulich
2017-09-12 14:32 ` [PATCH v11 3/5] x86emul: Add return code information to error messages Petre Pircalabu
2017-09-18 8:22 ` Tian, Kevin
2017-09-19 15:22 ` Jan Beulich
2017-09-20 12:54 ` Petre Ovidiu PIRCALABU
2017-09-20 15:52 ` Jan Beulich
2017-09-12 14:32 ` [PATCH v11 4/5] x86/monitor: Notify monitor if an emulation fails Petre Pircalabu
2017-09-12 14:32 ` [PATCH v11 5/5] x86emul: Raise #UD when emulating an unimplemented instruction Petre Pircalabu
2017-09-18 8:25 ` Tian, Kevin
2017-09-19 15:24 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1505944059.1983.7.camel@bitdefender.com \
--to=ppircalabu@bitdefender.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jun.nakajima@intel.com \
--cc=kevin.tian@intel.com \
--cc=paul.durrant@citrix.com \
--cc=rcojocaru@bitdefender.com \
--cc=sstabellini@kernel.org \
--cc=tamas@tklengyel.com \
--cc=tim@xen.org \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.