* [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function @ 2010-08-17 1:17 Wei Yongjun 2010-08-17 1:19 ` [PATCH 2/2 v4] KVM: x86 emulator: add XADD instruction emulation Wei Yongjun 2010-08-17 9:06 ` [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function Avi Kivity 0 siblings, 2 replies; 3+ messages in thread From: Wei Yongjun @ 2010-08-17 1:17 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm Introduce function write_register_operand() to write back the register operand. Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> --- arch/x86/kvm/emulate.c | 55 ++++++++++++++++++++--------------------------- 1 files changed, 23 insertions(+), 32 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index c476a67..d690daf 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -1020,6 +1020,25 @@ exception: return X86EMUL_PROPAGATE_FAULT; } +static void write_register_operand(struct operand *op) +{ + /* The 4-byte case *is* correct: in 64-bit mode we zero-extend. */ + switch (op->bytes) { + case 1: + *(u8 *)op->addr.reg = (u8)op->val; + break; + case 2: + *(u16 *)op->addr.reg = (u16)op->val; + break; + case 4: + *op->addr.reg = (u32)op->val; + break; /* 64b: zero-extend */ + case 8: + *op->addr.reg = op->val; + break; + } +} + static inline int writeback(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) { @@ -1029,23 +1048,7 @@ static inline int writeback(struct x86_emulate_ctxt *ctxt, switch (c->dst.type) { case OP_REG: - /* The 4-byte case *is* correct: - * in 64-bit mode we zero-extend. - */ - switch (c->dst.bytes) { - case 1: - *(u8 *)c->dst.addr.reg = (u8)c->dst.val; - break; - case 2: - *(u16 *)c->dst.addr.reg = (u16)c->dst.val; - break; - case 4: - *c->dst.addr.reg = (u32)c->dst.val; - break; /* 64b: zero-ext */ - case 8: - *c->dst.addr.reg = c->dst.val; - break; - } + write_register_operand(&c->dst); break; case OP_MEM: if (c->lock_prefix) @@ -2971,25 +2974,13 @@ special_insn: case 0x86 ... 0x87: /* xchg */ xchg: /* Write back the register source. */ - switch (c->dst.bytes) { - case 1: - *(u8 *) c->src.addr.reg = (u8) c->dst.val; - break; - case 2: - *(u16 *) c->src.addr.reg = (u16) c->dst.val; - break; - case 4: - *c->src.addr.reg = (u32) c->dst.val; - break; /* 64b reg: zero-extend */ - case 8: - *c->src.addr.reg = c->dst.val; - break; - } + c->src.val = c->dst.val; + write_register_operand(&c->src); /* * Write back the memory destination with implicit LOCK * prefix. */ - c->dst.val = c->src.val; + c->dst.val = c->src.orig_val; c->lock_prefix = 1; break; case 0x88 ... 0x8b: /* mov */ -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2 v4] KVM: x86 emulator: add XADD instruction emulation 2010-08-17 1:17 [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function Wei Yongjun @ 2010-08-17 1:19 ` Wei Yongjun 2010-08-17 9:06 ` [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function Avi Kivity 1 sibling, 0 replies; 3+ messages in thread From: Wei Yongjun @ 2010-08-17 1:19 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm Add XADD instruction emulation (opcode 0x0f 0xc0~0xc1) Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> --- arch/x86/kvm/emulate.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index d690daf..41ca98b 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -2386,7 +2386,8 @@ static struct opcode twobyte_table[256] = { D(DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM), D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov), /* 0xC0 - 0xCF */ - N, N, N, D(DstMem | SrcReg | ModRM | Mov), + D(ByteOp | DstMem | SrcReg | ModRM | Lock), D(DstMem | SrcReg | ModRM | Lock), + N, D(DstMem | SrcReg | ModRM | Mov), N, N, N, GD(0, &group9), N, N, N, N, N, N, N, N, /* 0xD0 - 0xDF */ @@ -3532,6 +3533,12 @@ twobyte_insn: c->dst.val = (c->d & ByteOp) ? (s8) c->src.val : (s16) c->src.val; break; + case 0xc0 ... 0xc1: /* xadd */ + emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags); + /* Write back the register source. */ + c->src.val = c->dst.orig_val; + write_register_operand(&c->src); + break; case 0xc3: /* movnti */ c->dst.bytes = c->op_bytes; c->dst.val = (c->op_bytes == 4) ? (u32) c->src.val : -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function 2010-08-17 1:17 [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function Wei Yongjun 2010-08-17 1:19 ` [PATCH 2/2 v4] KVM: x86 emulator: add XADD instruction emulation Wei Yongjun @ 2010-08-17 9:06 ` Avi Kivity 1 sibling, 0 replies; 3+ messages in thread From: Avi Kivity @ 2010-08-17 9:06 UTC (permalink / raw) To: Wei Yongjun; +Cc: kvm On 08/17/2010 04:17 AM, Wei Yongjun wrote: > Introduce function write_register_operand() to write back the > register operand. Applied, thanks. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-08-17 9:06 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-08-17 1:17 [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function Wei Yongjun 2010-08-17 1:19 ` [PATCH 2/2 v4] KVM: x86 emulator: add XADD instruction emulation Wei Yongjun 2010-08-17 9:06 ` [PATCH 1/2 v4] KVM: x86 emulator: put register operand write back to a function Avi Kivity
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox