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 6/8] KVM: x86 emulator: convert DIV/IDIV to fastop
Date: Sun, 10 Feb 2013 14:26:40 +0200 [thread overview]
Message-ID: <20130210122640.GR7837@redhat.com> (raw)
In-Reply-To: <1360402311-19904-7-git-send-email-avi.kivity@gmail.com>
On Sat, Feb 09, 2013 at 11:31:49AM +0200, Avi Kivity wrote:
> Since DIV and IDIV can generate exceptions, we need an additional output
> parameter indicating whether an execption has occured. To avoid increasing
> register pressure on i386, we use %rsi, which is already allocated for
> the fastop code pointer.
>
> Signed-off-by: Avi Kivity <avi.kivity@gmail.com>
> ---
> arch/x86/kvm/emulate.c | 51 +++++++++++++++++++++++++-------------------------
> 1 file changed, 26 insertions(+), 25 deletions(-)
>
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 0f0c15e..89f56bb 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -180,6 +180,7 @@
> * src: rdx (in/out)
> * src2: rcx (in)
> * flags: rflags (in/out)
> + * ex: rsi (in:nonzero, out:zero if exception)
in:fastop pointer, or "code pointer" may be?
> *
> * Moreover, they are all exactly FASTOP_SIZE bytes long, so functions for
> * different operand sizes can be reached by calculation, rather than a jump
> @@ -467,7 +468,10 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
> #define FOPNOP() FOP_ALIGN FOP_RET
>
> #define FOP1E(op, dst) \
> - FOP_ALIGN #op " %" #dst " \n\t" FOP_RET
> + FOP_ALIGN "10: " #op " %" #dst " \n\t" FOP_RET
> +
> +#define FOP1EEX(op, dst) \
> + FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception)
>
> #define FASTOP1(op) \
> FOP_START(op) \
> @@ -486,6 +490,15 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
> ON64(FOP1E(op, rcx)) \
> FOP_END
>
> +/* 1-operand, using src2 (for MUL/DIV r/m), with exceptions */
> +#define FASTOP1SRC2EX(op, name) \
> + FOP_START(name) \
> + FOP1EEX(op, cl) \
> + FOP1EEX(op, cx) \
> + FOP1EEX(op, ecx) \
> + ON64(FOP1EEX(op, rcx)) \
> + FOP_END
> +
> #define FOP2E(op, dst, src) \
> FOP_ALIGN #op " %" #src ", %" #dst " \n\t" FOP_RET
>
> @@ -530,6 +543,9 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
> /* Special case for SETcc - 1 instruction per cc */
> #define FOP_SETCC(op) ".align 4; " #op " %al; ret \n\t"
>
> +asm(".global kvm_fastop_exception \n"
> + "kvm_fastop_exception: xor %esi, %esi; ret");
> +
> FOP_START(setcc)
> FOP_SETCC(seto)
> FOP_SETCC(setno)
> @@ -1001,6 +1017,8 @@ FASTOP2(test);
>
> FASTOP1SRC2(mul, mul_ex);
> FASTOP1SRC2(imul, imul_ex);
> +FASTOP1SRC2EX(div, div_ex);
> +FASTOP1SRC2EX(idiv, idiv_ex);
>
> FASTOP3WCL(shld);
> FASTOP3WCL(shrd);
> @@ -2116,26 +2134,6 @@ static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
> return X86EMUL_CONTINUE;
> }
>
> -static int em_div_ex(struct x86_emulate_ctxt *ctxt)
> -{
> - u8 de = 0;
> -
> - emulate_1op_rax_rdx(ctxt, "div", de);
> - if (de)
> - return emulate_de(ctxt);
> - return X86EMUL_CONTINUE;
> -}
> -
> -static int em_idiv_ex(struct x86_emulate_ctxt *ctxt)
> -{
> - u8 de = 0;
> -
> - emulate_1op_rax_rdx(ctxt, "idiv", de);
> - if (de)
> - return emulate_de(ctxt);
> - return X86EMUL_CONTINUE;
> -}
> -
> static int em_grp45(struct x86_emulate_ctxt *ctxt)
> {
> int rc = X86EMUL_CONTINUE;
> @@ -3700,8 +3698,8 @@ static const struct opcode group3[] = {
> F(DstMem | SrcNone | Lock, em_neg),
> F(DstXacc | Src2Mem, em_mul_ex),
> F(DstXacc | Src2Mem, em_imul_ex),
> - I(DstXacc | Src2Mem, em_div_ex),
> - I(DstXacc | Src2Mem, em_idiv_ex),
> + F(DstXacc | Src2Mem, em_div_ex),
> + F(DstXacc | Src2Mem, em_idiv_ex),
> };
>
> static const struct opcode group4[] = {
> @@ -4518,9 +4516,12 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))
> if (!(ctxt->d & ByteOp))
> fop += __ffs(ctxt->dst.bytes) * FASTOP_SIZE;
> asm("push %[flags]; popf; call *%[fastop]; pushf; pop %[flags]\n"
> - : "+a"(ctxt->dst.val), "+d"(ctxt->src.val), [flags]"+D"(flags)
> - : "c"(ctxt->src2.val), [fastop]"S"(fop));
> + : "+a"(ctxt->dst.val), "+d"(ctxt->src.val), [flags]"+D"(flags),
> + [fastop]"+S"(fop)
> + : "c"(ctxt->src2.val));
> ctxt->eflags = (ctxt->eflags & ~EFLAGS_MASK) | (flags & EFLAGS_MASK);
> + if (!fop)
Looks like this magic deserves at least a short comment :)
> + return emulate_de(ctxt);
> return X86EMUL_CONTINUE;
> }
>
> --
> 1.8.1.2
--
Gleb.
next prev parent reply other threads:[~2013-02-10 12:26 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
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 [this message]
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=20130210122640.GR7837@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.