* [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate
@ 2011-03-10 7:35 Takuya Yoshikawa
2011-03-10 7:37 ` [PATCH 2/3] KVM: x86 emulator: Make two " Takuya Yoshikawa
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Takuya Yoshikawa @ 2011-03-10 7:35 UTC (permalink / raw)
To: avi, mtosatti; +Cc: gleb, takuya.yoshikawa, kvm
x86_emulate_insn() is too long and has many confusing goto statements.
This patch is the first part of a work which tries to split it into
a few meaningful functions: just encapsulates the switch statement for
the one byte instruction emulation as emulate_onebyte_insn().
Note that goto done with rc set to X86EMUL_UNHANDLEABLE will result in
returning EMULATION_FAILED which is defined as -1.
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
---
arch/x86/kvm/emulate.c | 179 +++++++++++++++++++++++++++---------------------
1 files changed, 100 insertions(+), 79 deletions(-)
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index ad46239..18d7c07 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2945,88 +2945,14 @@ static bool string_insn_completed(struct x86_emulate_ctxt *ctxt)
return false;
}
-int
-x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
+static int emulate_onebyte_insn(struct x86_emulate_ctxt *ctxt,
+ struct x86_emulate_ops *ops,
+ struct decode_cache *c,
+ bool *need_writeback)
{
- struct x86_emulate_ops *ops = ctxt->ops;
- u64 msr_data;
- struct decode_cache *c = &ctxt->decode;
int rc = X86EMUL_CONTINUE;
- int saved_dst_type = c->dst.type;
int irq; /* Used for int 3, int, and into */
- ctxt->decode.mem_read.pos = 0;
-
- if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) {
- rc = emulate_ud(ctxt);
- goto done;
- }
-
- /* LOCK prefix is allowed only with some instructions */
- if (c->lock_prefix && (!(c->d & Lock) || c->dst.type != OP_MEM)) {
- rc = emulate_ud(ctxt);
- goto done;
- }
-
- if ((c->d & SrcMask) == SrcMemFAddr && c->src.type != OP_MEM) {
- rc = emulate_ud(ctxt);
- goto done;
- }
-
- /* Privileged instruction can be executed only in CPL=0 */
- if ((c->d & Priv) && ops->cpl(ctxt->vcpu)) {
- rc = emulate_gp(ctxt, 0);
- goto done;
- }
-
- if (c->rep_prefix && (c->d & String)) {
- /* All REP prefixes have the same first termination condition */
- if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) {
- ctxt->eip = c->eip;
- goto done;
- }
- }
-
- if ((c->src.type == OP_MEM) && !(c->d & NoAccess)) {
- rc = read_emulated(ctxt, ops, linear(ctxt, c->src.addr.mem),
- c->src.valptr, c->src.bytes);
- if (rc != X86EMUL_CONTINUE)
- goto done;
- c->src.orig_val64 = c->src.val64;
- }
-
- if (c->src2.type == OP_MEM) {
- rc = read_emulated(ctxt, ops, linear(ctxt, c->src2.addr.mem),
- &c->src2.val, c->src2.bytes);
- if (rc != X86EMUL_CONTINUE)
- goto done;
- }
-
- if ((c->d & DstMask) == ImplicitOps)
- goto special_insn;
-
-
- if ((c->dst.type == OP_MEM) && !(c->d & Mov)) {
- /* optimisation - avoid slow emulated read if Mov */
- rc = read_emulated(ctxt, ops, linear(ctxt, c->dst.addr.mem),
- &c->dst.val, c->dst.bytes);
- if (rc != X86EMUL_CONTINUE)
- goto done;
- }
- c->dst.orig_val = c->dst.val;
-
-special_insn:
-
- if (c->execute) {
- rc = c->execute(ctxt);
- if (rc != X86EMUL_CONTINUE)
- goto done;
- goto writeback;
- }
-
- if (c->twobyte)
- goto twobyte_insn;
-
switch (c->b) {
case 0x00 ... 0x05:
add: /* add */
@@ -3371,7 +3297,102 @@ special_insn:
goto cannot_emulate;
}
- if (rc != X86EMUL_CONTINUE)
+ *need_writeback = (rc == X86EMUL_CONTINUE);
+ return rc;
+
+done:
+ *need_writeback = false;
+ return rc;
+
+cannot_emulate:
+ *need_writeback = false;
+ return X86EMUL_UNHANDLEABLE;
+}
+
+int
+x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
+{
+ struct x86_emulate_ops *ops = ctxt->ops;
+ u64 msr_data;
+ struct decode_cache *c = &ctxt->decode;
+ int rc = X86EMUL_CONTINUE;
+ int saved_dst_type = c->dst.type;
+ bool need_writeback;
+
+ ctxt->decode.mem_read.pos = 0;
+
+ if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) {
+ rc = emulate_ud(ctxt);
+ goto done;
+ }
+
+ /* LOCK prefix is allowed only with some instructions */
+ if (c->lock_prefix && (!(c->d & Lock) || c->dst.type != OP_MEM)) {
+ rc = emulate_ud(ctxt);
+ goto done;
+ }
+
+ if ((c->d & SrcMask) == SrcMemFAddr && c->src.type != OP_MEM) {
+ rc = emulate_ud(ctxt);
+ goto done;
+ }
+
+ /* Privileged instruction can be executed only in CPL=0 */
+ if ((c->d & Priv) && ops->cpl(ctxt->vcpu)) {
+ rc = emulate_gp(ctxt, 0);
+ goto done;
+ }
+
+ if (c->rep_prefix && (c->d & String)) {
+ /* All REP prefixes have the same first termination condition */
+ if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) {
+ ctxt->eip = c->eip;
+ goto done;
+ }
+ }
+
+ if ((c->src.type == OP_MEM) && !(c->d & NoAccess)) {
+ rc = read_emulated(ctxt, ops, linear(ctxt, c->src.addr.mem),
+ c->src.valptr, c->src.bytes);
+ if (rc != X86EMUL_CONTINUE)
+ goto done;
+ c->src.orig_val64 = c->src.val64;
+ }
+
+ if (c->src2.type == OP_MEM) {
+ rc = read_emulated(ctxt, ops, linear(ctxt, c->src2.addr.mem),
+ &c->src2.val, c->src2.bytes);
+ if (rc != X86EMUL_CONTINUE)
+ goto done;
+ }
+
+ if ((c->d & DstMask) == ImplicitOps)
+ goto special_insn;
+
+
+ if ((c->dst.type == OP_MEM) && !(c->d & Mov)) {
+ /* optimisation - avoid slow emulated read if Mov */
+ rc = read_emulated(ctxt, ops, linear(ctxt, c->dst.addr.mem),
+ &c->dst.val, c->dst.bytes);
+ if (rc != X86EMUL_CONTINUE)
+ goto done;
+ }
+ c->dst.orig_val = c->dst.val;
+
+special_insn:
+
+ if (c->execute) {
+ rc = c->execute(ctxt);
+ if (rc != X86EMUL_CONTINUE)
+ goto done;
+ goto writeback;
+ }
+
+ if (c->twobyte)
+ goto twobyte_insn;
+
+ rc = emulate_onebyte_insn(ctxt, ops, c, &need_writeback);
+ if (!need_writeback)
goto done;
writeback:
--
1.7.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 2/3] KVM: x86 emulator: Make two byte instruction emulation separate 2011-03-10 7:35 [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Takuya Yoshikawa @ 2011-03-10 7:37 ` Takuya Yoshikawa 2011-03-10 7:39 ` [PATCH 3/3] KVM: x86 emulator: Remove unnecessary goto statements from x86_emulate_insn() Takuya Yoshikawa 2011-03-10 9:05 ` [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Avi Kivity 2 siblings, 0 replies; 7+ messages in thread From: Takuya Yoshikawa @ 2011-03-10 7:37 UTC (permalink / raw) To: avi, mtosatti; +Cc: gleb, takuya.yoshikawa, kvm This patch is the second part of a work which tries to split x86_emulate_insn() into a few meaningful functions: just encapsulates the switch statement for the two byte instruction emulation as emulate_twobyte_insn(). Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> --- arch/x86/kvm/emulate.c | 286 ++++++++++++++++++++++++++---------------------- 1 files changed, 153 insertions(+), 133 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 18d7c07..7aa93df 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3309,142 +3309,14 @@ cannot_emulate: return X86EMUL_UNHANDLEABLE; } -int -x86_emulate_insn(struct x86_emulate_ctxt *ctxt) +static int emulate_twobyte_insn(struct x86_emulate_ctxt *ctxt, + struct x86_emulate_ops *ops, + struct decode_cache *c, + bool *need_writeback) { - struct x86_emulate_ops *ops = ctxt->ops; - u64 msr_data; - struct decode_cache *c = &ctxt->decode; int rc = X86EMUL_CONTINUE; - int saved_dst_type = c->dst.type; - bool need_writeback; - - ctxt->decode.mem_read.pos = 0; - - if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) { - rc = emulate_ud(ctxt); - goto done; - } - - /* LOCK prefix is allowed only with some instructions */ - if (c->lock_prefix && (!(c->d & Lock) || c->dst.type != OP_MEM)) { - rc = emulate_ud(ctxt); - goto done; - } - - if ((c->d & SrcMask) == SrcMemFAddr && c->src.type != OP_MEM) { - rc = emulate_ud(ctxt); - goto done; - } - - /* Privileged instruction can be executed only in CPL=0 */ - if ((c->d & Priv) && ops->cpl(ctxt->vcpu)) { - rc = emulate_gp(ctxt, 0); - goto done; - } - - if (c->rep_prefix && (c->d & String)) { - /* All REP prefixes have the same first termination condition */ - if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) { - ctxt->eip = c->eip; - goto done; - } - } - - if ((c->src.type == OP_MEM) && !(c->d & NoAccess)) { - rc = read_emulated(ctxt, ops, linear(ctxt, c->src.addr.mem), - c->src.valptr, c->src.bytes); - if (rc != X86EMUL_CONTINUE) - goto done; - c->src.orig_val64 = c->src.val64; - } - - if (c->src2.type == OP_MEM) { - rc = read_emulated(ctxt, ops, linear(ctxt, c->src2.addr.mem), - &c->src2.val, c->src2.bytes); - if (rc != X86EMUL_CONTINUE) - goto done; - } - - if ((c->d & DstMask) == ImplicitOps) - goto special_insn; - - - if ((c->dst.type == OP_MEM) && !(c->d & Mov)) { - /* optimisation - avoid slow emulated read if Mov */ - rc = read_emulated(ctxt, ops, linear(ctxt, c->dst.addr.mem), - &c->dst.val, c->dst.bytes); - if (rc != X86EMUL_CONTINUE) - goto done; - } - c->dst.orig_val = c->dst.val; - -special_insn: - - if (c->execute) { - rc = c->execute(ctxt); - if (rc != X86EMUL_CONTINUE) - goto done; - goto writeback; - } - - if (c->twobyte) - goto twobyte_insn; - - rc = emulate_onebyte_insn(ctxt, ops, c, &need_writeback); - if (!need_writeback) - goto done; - -writeback: - rc = writeback(ctxt, ops); - if (rc != X86EMUL_CONTINUE) - goto done; - - /* - * restore dst type in case the decoding will be reused - * (happens for string instruction ) - */ - c->dst.type = saved_dst_type; - - if ((c->d & SrcMask) == SrcSI) - string_addr_inc(ctxt, seg_override(ctxt, ops, c), - VCPU_REGS_RSI, &c->src); - - if ((c->d & DstMask) == DstDI) - string_addr_inc(ctxt, VCPU_SREG_ES, VCPU_REGS_RDI, - &c->dst); - - if (c->rep_prefix && (c->d & String)) { - struct read_cache *r = &ctxt->decode.io_read; - register_address_increment(c, &c->regs[VCPU_REGS_RCX], -1); - - if (!string_insn_completed(ctxt)) { - /* - * Re-enter guest when pio read ahead buffer is empty - * or, if it is not used, after each 1024 iteration. - */ - if ((r->end != 0 || c->regs[VCPU_REGS_RCX] & 0x3ff) && - (r->end == 0 || r->end != r->pos)) { - /* - * Reset read cache. Usually happens before - * decode, but since instruction is restarted - * we have to do it here. - */ - ctxt->decode.mem_read.end = 0; - return EMULATION_RESTART; - } - goto done; /* skip rip writeback */ - } - } - - ctxt->eip = c->eip; - -done: - if (rc == X86EMUL_PROPAGATE_FAULT) - ctxt->have_exception = true; - return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; + u64 msr_data; -twobyte_insn: switch (c->b) { case 0x01: /* lgdt, lidt, lmsw */ switch (c->modrm_reg) { @@ -3748,9 +3620,157 @@ twobyte_insn: goto cannot_emulate; } + *need_writeback = (rc == X86EMUL_CONTINUE); + return rc; + +done: + *need_writeback = false; + return rc; + +cannot_emulate: + *need_writeback = false; + return X86EMUL_UNHANDLEABLE; +} + +int +x86_emulate_insn(struct x86_emulate_ctxt *ctxt) +{ + struct x86_emulate_ops *ops = ctxt->ops; + struct decode_cache *c = &ctxt->decode; + int rc = X86EMUL_CONTINUE; + int saved_dst_type = c->dst.type; + bool need_writeback; + + ctxt->decode.mem_read.pos = 0; + + if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) { + rc = emulate_ud(ctxt); + goto done; + } + + /* LOCK prefix is allowed only with some instructions */ + if (c->lock_prefix && (!(c->d & Lock) || c->dst.type != OP_MEM)) { + rc = emulate_ud(ctxt); + goto done; + } + + if ((c->d & SrcMask) == SrcMemFAddr && c->src.type != OP_MEM) { + rc = emulate_ud(ctxt); + goto done; + } + + /* Privileged instruction can be executed only in CPL=0 */ + if ((c->d & Priv) && ops->cpl(ctxt->vcpu)) { + rc = emulate_gp(ctxt, 0); + goto done; + } + + if (c->rep_prefix && (c->d & String)) { + /* All REP prefixes have the same first termination condition */ + if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) { + ctxt->eip = c->eip; + goto done; + } + } + + if ((c->src.type == OP_MEM) && !(c->d & NoAccess)) { + rc = read_emulated(ctxt, ops, linear(ctxt, c->src.addr.mem), + c->src.valptr, c->src.bytes); + if (rc != X86EMUL_CONTINUE) + goto done; + c->src.orig_val64 = c->src.val64; + } + + if (c->src2.type == OP_MEM) { + rc = read_emulated(ctxt, ops, linear(ctxt, c->src2.addr.mem), + &c->src2.val, c->src2.bytes); + if (rc != X86EMUL_CONTINUE) + goto done; + } + + if ((c->d & DstMask) == ImplicitOps) + goto special_insn; + + + if ((c->dst.type == OP_MEM) && !(c->d & Mov)) { + /* optimisation - avoid slow emulated read if Mov */ + rc = read_emulated(ctxt, ops, linear(ctxt, c->dst.addr.mem), + &c->dst.val, c->dst.bytes); + if (rc != X86EMUL_CONTINUE) + goto done; + } + c->dst.orig_val = c->dst.val; + +special_insn: + + if (c->execute) { + rc = c->execute(ctxt); + if (rc != X86EMUL_CONTINUE) + goto done; + goto writeback; + } + + if (c->twobyte) + goto twobyte_insn; + + rc = emulate_onebyte_insn(ctxt, ops, c, &need_writeback); + if (!need_writeback) + goto done; + +writeback: + rc = writeback(ctxt, ops); if (rc != X86EMUL_CONTINUE) goto done; + /* + * restore dst type in case the decoding will be reused + * (happens for string instruction ) + */ + c->dst.type = saved_dst_type; + + if ((c->d & SrcMask) == SrcSI) + string_addr_inc(ctxt, seg_override(ctxt, ops, c), + VCPU_REGS_RSI, &c->src); + + if ((c->d & DstMask) == DstDI) + string_addr_inc(ctxt, VCPU_SREG_ES, VCPU_REGS_RDI, + &c->dst); + + if (c->rep_prefix && (c->d & String)) { + struct read_cache *r = &ctxt->decode.io_read; + register_address_increment(c, &c->regs[VCPU_REGS_RCX], -1); + + if (!string_insn_completed(ctxt)) { + /* + * Re-enter guest when pio read ahead buffer is empty + * or, if it is not used, after each 1024 iteration. + */ + if ((r->end != 0 || c->regs[VCPU_REGS_RCX] & 0x3ff) && + (r->end == 0 || r->end != r->pos)) { + /* + * Reset read cache. Usually happens before + * decode, but since instruction is restarted + * we have to do it here. + */ + ctxt->decode.mem_read.end = 0; + return EMULATION_RESTART; + } + goto done; /* skip rip writeback */ + } + } + + ctxt->eip = c->eip; + +done: + if (rc == X86EMUL_PROPAGATE_FAULT) + ctxt->have_exception = true; + return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; + +twobyte_insn: + rc = emulate_twobyte_insn(ctxt, ops, c, &need_writeback); + if (!need_writeback) + goto done; + goto writeback; cannot_emulate: -- 1.7.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] KVM: x86 emulator: Remove unnecessary goto statements from x86_emulate_insn() 2011-03-10 7:35 [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Takuya Yoshikawa 2011-03-10 7:37 ` [PATCH 2/3] KVM: x86 emulator: Make two " Takuya Yoshikawa @ 2011-03-10 7:39 ` Takuya Yoshikawa 2011-03-10 9:05 ` [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Avi Kivity 2 siblings, 0 replies; 7+ messages in thread From: Takuya Yoshikawa @ 2011-03-10 7:39 UTC (permalink / raw) To: avi, mtosatti; +Cc: gleb, takuya.yoshikawa, kvm This patch is the last part of a work which tries to split x86_emulate_insn() into a few meaningful functions: removes unnecessary goto statements based on the former two patches. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> --- arch/x86/kvm/emulate.c | 18 ++++-------------- 1 files changed, 4 insertions(+), 14 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 7aa93df..b5fefcb 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3632,8 +3632,7 @@ cannot_emulate: return X86EMUL_UNHANDLEABLE; } -int -x86_emulate_insn(struct x86_emulate_ctxt *ctxt) +int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) { struct x86_emulate_ops *ops = ctxt->ops; struct decode_cache *c = &ctxt->decode; @@ -3711,9 +3710,10 @@ special_insn: } if (c->twobyte) - goto twobyte_insn; + rc = emulate_twobyte_insn(ctxt, ops, c, &need_writeback); + else + rc = emulate_onebyte_insn(ctxt, ops, c, &need_writeback); - rc = emulate_onebyte_insn(ctxt, ops, c, &need_writeback); if (!need_writeback) goto done; @@ -3765,14 +3765,4 @@ done: if (rc == X86EMUL_PROPAGATE_FAULT) ctxt->have_exception = true; return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; - -twobyte_insn: - rc = emulate_twobyte_insn(ctxt, ops, c, &need_writeback); - if (!need_writeback) - goto done; - - goto writeback; - -cannot_emulate: - return -1; } -- 1.7.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate 2011-03-10 7:35 [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Takuya Yoshikawa 2011-03-10 7:37 ` [PATCH 2/3] KVM: x86 emulator: Make two " Takuya Yoshikawa 2011-03-10 7:39 ` [PATCH 3/3] KVM: x86 emulator: Remove unnecessary goto statements from x86_emulate_insn() Takuya Yoshikawa @ 2011-03-10 9:05 ` Avi Kivity 2011-03-10 9:26 ` Takuya Yoshikawa 2 siblings, 1 reply; 7+ messages in thread From: Avi Kivity @ 2011-03-10 9:05 UTC (permalink / raw) To: Takuya Yoshikawa; +Cc: mtosatti, gleb, takuya.yoshikawa, kvm On 03/10/2011 09:35 AM, Takuya Yoshikawa wrote: > x86_emulate_insn() is too long and has many confusing goto statements. > > This patch is the first part of a work which tries to split it into > a few meaningful functions: just encapsulates the switch statement for > the one byte instruction emulation as emulate_onebyte_insn(). I, too, dislike the switch statements. So I started on a path to eliminate it completely - take a look at struct opcode::execute. If present, it is executed instead of the code in the switch statements. The plan is to migrate all of the contents of the switch statements into ->execute() callbacks. This way, all of the information about an instruction is present in the decode tables. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate 2011-03-10 9:05 ` [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Avi Kivity @ 2011-03-10 9:26 ` Takuya Yoshikawa 2011-03-10 9:27 ` Avi Kivity 0 siblings, 1 reply; 7+ messages in thread From: Takuya Yoshikawa @ 2011-03-10 9:26 UTC (permalink / raw) To: Avi Kivity; +Cc: mtosatti, gleb, takuya.yoshikawa, kvm On Thu, 10 Mar 2011 11:05:38 +0200 Avi Kivity <avi@redhat.com> wrote: > On 03/10/2011 09:35 AM, Takuya Yoshikawa wrote: > > x86_emulate_insn() is too long and has many confusing goto statements. > > > > This patch is the first part of a work which tries to split it into > > a few meaningful functions: just encapsulates the switch statement for > > the one byte instruction emulation as emulate_onebyte_insn(). > > I, too, dislike the switch statements. So I started on a path to > eliminate it completely - take a look at struct opcode::execute. If > present, it is executed instead of the code in the switch statements. > > The plan is to migrate all of the contents of the switch statements into > ->execute() callbacks. This way, all of the information about an > instruction is present in the decode tables. I see. I'm looking forward to the completion of the plan! Thanks, Takuya > > -- > error compiling committee.c: too many arguments to function > -- Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate 2011-03-10 9:26 ` Takuya Yoshikawa @ 2011-03-10 9:27 ` Avi Kivity 2011-03-10 9:50 ` Takuya Yoshikawa 0 siblings, 1 reply; 7+ messages in thread From: Avi Kivity @ 2011-03-10 9:27 UTC (permalink / raw) To: Takuya Yoshikawa; +Cc: mtosatti, gleb, takuya.yoshikawa, kvm On 03/10/2011 11:26 AM, Takuya Yoshikawa wrote: > > The plan is to migrate all of the contents of the switch statements into > > ->execute() callbacks. This way, all of the information about an > > instruction is present in the decode tables. > > I see. > I'm looking forward to the completion of the plan! > I don't know if anyone is working on it, so feel free to send patches! -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate 2011-03-10 9:27 ` Avi Kivity @ 2011-03-10 9:50 ` Takuya Yoshikawa 0 siblings, 0 replies; 7+ messages in thread From: Takuya Yoshikawa @ 2011-03-10 9:50 UTC (permalink / raw) To: Avi Kivity; +Cc: mtosatti, gleb, takuya.yoshikawa, kvm On Thu, 10 Mar 2011 11:27:30 +0200 Avi Kivity <avi@redhat.com> wrote: > On 03/10/2011 11:26 AM, Takuya Yoshikawa wrote: > I don't know if anyone is working on it, so feel free to send patches! Yes, I'm interested in it. So I will take a look and try! I was doing some live migration tests using Kemari for some time. Now it's time to restart KVM code reading! Thanks, Takuya ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-03-10 9:47 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-03-10 7:35 [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Takuya Yoshikawa 2011-03-10 7:37 ` [PATCH 2/3] KVM: x86 emulator: Make two " Takuya Yoshikawa 2011-03-10 7:39 ` [PATCH 3/3] KVM: x86 emulator: Remove unnecessary goto statements from x86_emulate_insn() Takuya Yoshikawa 2011-03-10 9:05 ` [PATCH 1/3] KVM: x86 emulator: Make one byte instruction emulation separate Avi Kivity 2011-03-10 9:26 ` Takuya Yoshikawa 2011-03-10 9:27 ` Avi Kivity 2011-03-10 9:50 ` Takuya Yoshikawa
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox