From: Gleb Natapov <gleb@redhat.com>
To: Avi Kivity <avi.kivity@gmail.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, kvm@vger.kernel.org
Subject: Re: [PATCH 1/8] KVM: x86 emulator: add support for writing back the source operand
Date: Sun, 10 Feb 2013 13:56:07 +0200 [thread overview]
Message-ID: <20130210115607.GP7837@redhat.com> (raw)
In-Reply-To: <1360402311-19904-2-git-send-email-avi.kivity@gmail.com>
On Sat, Feb 09, 2013 at 11:31:44AM +0200, Avi Kivity wrote:
> Some instructions write back the source operand, not just the destination.
> Add support for doing this via the decode flags.
>
We cannot really write back to memory operands. I feel it's deceiving to make
the code look like we can.
> Signed-off-by: Avi Kivity <avi.kivity@gmail.com>
> ---
> arch/x86/kvm/emulate.c | 47 ++++++++++++++++++++++++++---------------------
> 1 file changed, 26 insertions(+), 21 deletions(-)
>
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 2b11318..18c86b5 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -152,6 +152,7 @@
> #define Avx ((u64)1 << 43) /* Advanced Vector Extensions */
> #define Fastop ((u64)1 << 44) /* Use opcode::u.fastop */
> #define NoWrite ((u64)1 << 45) /* No writeback */
> +#define SrcWrite ((u64)1 << 46) /* Write back src operand */
>
> #define X2(x...) x, x
> #define X3(x...) X2(x), x
> @@ -1708,45 +1709,42 @@ static void write_register_operand(struct operand *op)
> }
> }
>
> -static int writeback(struct x86_emulate_ctxt *ctxt)
> +static int writeback(struct x86_emulate_ctxt *ctxt, struct operand *op)
> {
> int rc;
>
> - if (ctxt->d & NoWrite)
> - return X86EMUL_CONTINUE;
> -
> - switch (ctxt->dst.type) {
> + switch (op->type) {
> case OP_REG:
> - write_register_operand(&ctxt->dst);
> + write_register_operand(op);
> break;
> case OP_MEM:
> if (ctxt->lock_prefix)
> rc = segmented_cmpxchg(ctxt,
> - ctxt->dst.addr.mem,
> - &ctxt->dst.orig_val,
> - &ctxt->dst.val,
> - ctxt->dst.bytes);
> + op->addr.mem,
> + &op->orig_val,
> + &op->val,
> + op->bytes);
> else
> rc = segmented_write(ctxt,
> - ctxt->dst.addr.mem,
> - &ctxt->dst.val,
> - ctxt->dst.bytes);
> + op->addr.mem,
> + &op->val,
> + op->bytes);
> if (rc != X86EMUL_CONTINUE)
> return rc;
> break;
> case OP_MEM_STR:
> rc = segmented_write(ctxt,
> - ctxt->dst.addr.mem,
> - ctxt->dst.data,
> - ctxt->dst.bytes * ctxt->dst.count);
> + op->addr.mem,
> + op->data,
> + op->bytes * op->count);
> if (rc != X86EMUL_CONTINUE)
> return rc;
> break;
> case OP_XMM:
> - write_sse_reg(ctxt, &ctxt->dst.vec_val, ctxt->dst.addr.xmm);
> + write_sse_reg(ctxt, &op->vec_val, op->addr.xmm);
> break;
> case OP_MM:
> - write_mmx_reg(ctxt, &ctxt->dst.mm_val, ctxt->dst.addr.mm);
> + write_mmx_reg(ctxt, &op->mm_val, op->addr.mm);
> break;
> case OP_NONE:
> /* no writeback */
> @@ -4717,9 +4715,16 @@ special_insn:
> goto done;
>
> writeback:
> - rc = writeback(ctxt);
> - if (rc != X86EMUL_CONTINUE)
> - goto done;
> + if (!(ctxt->d & NoWrite)) {
> + rc = writeback(ctxt, &ctxt->dst);
> + if (rc != X86EMUL_CONTINUE)
> + goto done;
> + }
> + if (ctxt->d & SrcWrite) {
> + rc = writeback(ctxt, &ctxt->src);
> + if (rc != X86EMUL_CONTINUE)
> + goto done;
> + }
>
> /*
> * restore dst type in case the decoding will be reused
> --
> 1.8.1.2
--
Gleb.
next prev parent reply other threads:[~2013-02-10 11:56 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-09 9:31 [PATCH 0/8] Convert MUL/DIV to fastop Avi Kivity
2013-02-09 9:31 ` [PATCH 1/8] KVM: x86 emulator: add support for writing back the source operand Avi Kivity
2013-02-10 11:56 ` Gleb Natapov [this message]
2013-02-09 9:31 ` [PATCH 2/8] KVM: x86 emulator: decode extended accumulator explicity Avi Kivity
2013-02-10 12:19 ` Gleb Natapov
2013-05-20 12:32 ` Gleb Natapov
2013-02-09 9:31 ` [PATCH 3/8] KVM: x86 emulator: switch MUL/DIV to DstXacc Avi Kivity
2013-02-09 9:31 ` [PATCH 4/8] KVM: x86 emulator: Switch fastop src operand to RDX Avi Kivity
2013-02-09 9:31 ` [PATCH 5/8] KVM: x86 emulator: convert single-operand MUL/IMUL to fastop Avi Kivity
2013-02-09 9:31 ` [PATCH 6/8] KVM: x86 emulator: convert DIV/IDIV " Avi Kivity
2013-02-10 12:26 ` Gleb Natapov
2013-02-09 9:31 ` [PATCH 7/8] KVM: x86 emulator: drop unused old-style inline emulation Avi Kivity
2013-02-09 9:31 ` [PATCH 8/8] KVM: x86 emulator: convert XADD to fastop Avi Kivity
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=20130210115607.GP7837@redhat.com \
--to=gleb@redhat.com \
--cc=avi.kivity@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
/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.