KVM: x86 emulator: put register operand write back to a function
PATCH v4 1/2 KVM: x86 emulator: put register operand write back to a function
Introduce function write_register_operand() to write back the register operand.
Signed-off-by Wei Yongjun <[email protected]>
--- arch/x86/kvm/emulate.c | 55 ++++++++++++++++++++--------------------------- 1 files changed, 23 insertions(+), 32 deletions(-)
arch/x86/kvm/emulate.c +23 -32
@@ -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 */
Signature · 1 line
1.7.0.4
PATCH v4 2/2 KVM: x86 emulator: add XADD instruction emulation
Add XADD instruction emulation (opcode 0x0f 0xc0~0xc1)
Signed-off-by Wei Yongjun <[email protected]>
--- arch/x86/kvm/emulate.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)
arch/x86/kvm/emulate.c +8 -1
@@ -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 :
Signature · 1 line
1.7.0.4
Avi Kivity
AppliedQuoted 2 lines · Wei Yongjun
Introduce function
write_register_operand()to write back the register operand.
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function