From: Gleb Natapov <gleb@redhat.com>
To: Takuya Yoshikawa <takuya.yoshikawa@gmail.com>
Cc: avi@redhat.com, mtosatti@redhat.com, kvm@vger.kernel.org,
yoshikawa.takuya@oss.ntt.co.jp
Subject: Re: [PATCH 1/5] KVM: x86 emulator: Use single stage decoding for Group 1 instructions
Date: Mon, 14 Mar 2011 17:11:40 +0200 [thread overview]
Message-ID: <20110314151140.GT10151@redhat.com> (raw)
In-Reply-To: <20110314001727.89e302d7.takuya.yoshikawa@gmail.com>
On Mon, Mar 14, 2011 at 12:17:27AM +0900, Takuya Yoshikawa wrote:
> From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
>
> ADD, OR, ADC, SBB, AND, SUB, XOR, CMP are converted using a new macro
> I6ALU(_f, _e).
>
> CMPS, SCAS will be converted later.
>
> Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
> ---
> arch/x86/kvm/emulate.c | 151 ++++++++++++++++++++++++++++--------------------
> 1 files changed, 88 insertions(+), 63 deletions(-)
>
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 14c5ad5..bd9572a 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -2325,6 +2325,70 @@ static int em_mov(struct x86_emulate_ctxt *ctxt)
> return X86EMUL_CONTINUE;
> }
>
> +static int em_add(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_or(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_adc(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("adc", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_sbb(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("sbb", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_and(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("and", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_sub(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("sub", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_xor(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("xor", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> +static int em_cmp(struct x86_emulate_ctxt *ctxt)
> +{
> + struct decode_cache *c = &ctxt->decode;
> +
> + emulate_2op_SrcV("cmp", c->src, c->dst, ctxt->eflags);
> + return X86EMUL_CONTINUE;
> +}
> +
> #define D(_y) { .flags = (_y) }
> #define N D(0)
> #define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) }
> @@ -2337,10 +2401,20 @@ static int em_mov(struct x86_emulate_ctxt *ctxt)
> #define D6ALU(_f) D2bv((_f) | DstMem | SrcReg | ModRM), \
> D2bv(((_f) | DstReg | SrcMem | ModRM) & ~Lock), \
> D2bv(((_f) & ~Lock) | DstAcc | SrcImm)
> +#define I6ALU(_f, _e) I2bv((_f) | DstMem | SrcReg | ModRM, _e), \
> + I2bv(((_f) | DstReg | SrcMem | ModRM) & ~Lock, _e), \
> + I2bv(((_f) & ~Lock) | DstAcc | SrcImm, _e)
>
>
> static struct opcode group1[] = {
> - X7(D(Lock)), N
> + I(Lock, em_add),
> + I(Lock, em_or),
> + I(Lock, em_adc),
> + I(Lock, em_sbb),
> + I(Lock, em_and),
> + I(Lock, em_sub),
> + I(Lock, em_xor),
> + I(0, em_cmp)
> };
>
> static struct opcode group1A[] = {
> @@ -2396,25 +2470,25 @@ static struct opcode group11[] = {
>
> static struct opcode opcode_table[256] = {
> /* 0x00 - 0x07 */
> - D6ALU(Lock),
> + I6ALU(Lock, em_add),
> D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
> /* 0x08 - 0x0F */
> - D6ALU(Lock),
> + I6ALU(Lock, em_or),
> D(ImplicitOps | Stack | No64), N,
> /* 0x10 - 0x17 */
> - D6ALU(Lock),
> + I6ALU(Lock, em_adc),
> D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
> /* 0x18 - 0x1F */
> - D6ALU(Lock),
> + I6ALU(Lock, em_sbb),
> D(ImplicitOps | Stack | No64), D(ImplicitOps | Stack | No64),
> /* 0x20 - 0x27 */
> - D6ALU(Lock), N, N,
> + I6ALU(Lock, em_and), N, N,
> /* 0x28 - 0x2F */
> - D6ALU(Lock), N, I(ByteOp | DstAcc | No64, em_das),
> + I6ALU(Lock, em_sub), N, I(ByteOp | DstAcc | No64, em_das),
> /* 0x30 - 0x37 */
> - D6ALU(Lock), N, N,
> + I6ALU(Lock, em_xor), N, N,
> /* 0x38 - 0x3F */
> - D6ALU(0), N, N,
> + I6ALU(0, em_cmp), N, N,
> /* 0x40 - 0x4F */
> X16(D(DstReg)),
> /* 0x50 - 0x57 */
> @@ -2568,6 +2642,7 @@ static struct opcode twobyte_table[256] = {
> #undef D2bv
> #undef I2bv
> #undef D6ALU
> +#undef I6ALU
>
> static unsigned imm_size(struct decode_cache *c)
> {
> @@ -3034,59 +3109,27 @@ special_insn:
> goto twobyte_insn;
>
> switch (c->b) {
> - case 0x00 ... 0x05:
> - add: /* add */
> - emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags);
> - break;
> case 0x06: /* push es */
> emulate_push_sreg(ctxt, ops, VCPU_SREG_ES);
> break;
> case 0x07: /* pop es */
> rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_ES);
> break;
> - case 0x08 ... 0x0d:
> - or: /* or */
> - emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags);
> - break;
> case 0x0e: /* push cs */
> emulate_push_sreg(ctxt, ops, VCPU_SREG_CS);
> break;
> - case 0x10 ... 0x15:
> - adc: /* adc */
> - emulate_2op_SrcV("adc", c->src, c->dst, ctxt->eflags);
> - break;
> case 0x16: /* push ss */
> emulate_push_sreg(ctxt, ops, VCPU_SREG_SS);
> break;
> case 0x17: /* pop ss */
> rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_SS);
> break;
> - case 0x18 ... 0x1d:
> - sbb: /* sbb */
> - emulate_2op_SrcV("sbb", c->src, c->dst, ctxt->eflags);
> - break;
> case 0x1e: /* push ds */
> emulate_push_sreg(ctxt, ops, VCPU_SREG_DS);
> break;
> case 0x1f: /* pop ds */
> rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_DS);
> break;
> - case 0x20 ... 0x25:
> - and: /* and */
> - emulate_2op_SrcV("and", c->src, c->dst, ctxt->eflags);
> - break;
> - case 0x28 ... 0x2d:
> - sub: /* sub */
> - emulate_2op_SrcV("sub", c->src, c->dst, ctxt->eflags);
> - break;
> - case 0x30 ... 0x35:
> - xor: /* xor */
> - emulate_2op_SrcV("xor", c->src, c->dst, ctxt->eflags);
> - break;
> - case 0x38 ... 0x3d:
> - cmp: /* cmp */
> - emulate_2op_SrcV("cmp", c->src, c->dst, ctxt->eflags);
> - break;
> case 0x40 ... 0x47: /* inc r16/r32 */
> emulate_1op("inc", c->dst, ctxt->eflags);
> break;
> @@ -3121,26 +3164,6 @@ special_insn:
> if (test_cc(c->b, ctxt->eflags))
> jmp_rel(c, c->src.val);
> break;
> - case 0x80 ... 0x83: /* Grp1 */
> - switch (c->modrm_reg) {
> - case 0:
> - goto add;
> - case 1:
> - goto or;
> - case 2:
> - goto adc;
> - case 3:
> - goto sbb;
> - case 4:
> - goto and;
> - case 5:
> - goto sub;
> - case 6:
> - goto xor;
> - case 7:
> - goto cmp;
> - }
> - break;
> case 0x84 ... 0x85:
> test:
> emulate_2op_SrcV("test", c->src, c->dst, ctxt->eflags);
> @@ -3212,11 +3235,13 @@ special_insn:
> break;
> case 0xa6 ... 0xa7: /* cmps */
> c->dst.type = OP_NONE; /* Disable writeback. */
> - goto cmp;
> + emulate_2op_SrcV("cmp", c->src, c->dst, ctxt->eflags);
Why not call em_cmp() here?
> + break;
> case 0xa8 ... 0xa9: /* test ax, imm */
> goto test;
> case 0xae ... 0xaf: /* scas */
> - goto cmp;
> + emulate_2op_SrcV("cmp", c->src, c->dst, ctxt->eflags);
And here?
> + break;
> case 0xc0 ... 0xc1:
> emulate_grp2(ctxt);
> break;
> --
> 1.7.1
--
Gleb.
next prev parent reply other threads:[~2011-03-14 15:11 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-13 15:15 [PATCH 0/5] KVM: x86 emulator: Use single stage decoding -- Part 1 Takuya Yoshikawa
2011-03-13 15:17 ` [PATCH 1/5] KVM: x86 emulator: Use single stage decoding for Group 1 instructions Takuya Yoshikawa
2011-03-14 15:11 ` Gleb Natapov [this message]
2011-03-14 21:32 ` Takuya Yoshikawa
2011-03-15 9:35 ` Gleb Natapov
2011-03-15 14:06 ` Takuya Yoshikawa
2011-03-22 12:53 ` Avi Kivity
2011-03-22 15:35 ` Takuya Yoshikawa
2011-03-22 15:53 ` Avi Kivity
2011-03-22 12:55 ` Avi Kivity
2011-03-22 15:37 ` Takuya Yoshikawa
2011-03-13 15:19 ` [PATCH 2/5] KVM: x86 emulator: Use single stage decoding for PUSH/POP XS instructions Takuya Yoshikawa
2011-03-22 13:03 ` Avi Kivity
2011-03-22 15:45 ` Takuya Yoshikawa
2011-03-13 15:20 ` [PATCH 3/5] KVM: x86 emulator: Use single stage decoding for POP instructions Takuya Yoshikawa
2011-03-22 13:06 ` Avi Kivity
2011-03-22 15:49 ` Takuya Yoshikawa
2011-03-13 15:21 ` [PATCH 4/5] KVM: x86 emulator: Use single stage decoding for PUSHA and POPA instructions Takuya Yoshikawa
2011-03-22 13:07 ` Avi Kivity
2011-03-22 15:54 ` Takuya Yoshikawa
2011-03-22 16:34 ` Avi Kivity
2011-03-13 15:23 ` [PATCH 5/5] KVM: x86 emulator: Use single stage decoding for PUSHF and POPF instructions Takuya Yoshikawa
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=20110314151140.GT10151@redhat.com \
--to=gleb@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=takuya.yoshikawa@gmail.com \
--cc=yoshikawa.takuya@oss.ntt.co.jp \
/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.