KVM: x86 emulator: fix regression with cmpxchg8b on i386 hosts
PATCH 1/1 KVM: x86 emulator: fix regression with cmpxchg8b on i386 hosts
operand::val and operand::orig_val are 32-bit on i386, whereas cmpxchg8b operands are 64-bit.
Fix by adding val64 and orig_val64 union members to struct operand, and using them where needed.
Signed-off-by Avi Kivity <[email protected]>
--- arch/x86/include/asm/kvm_emulate.h | 6 +++++- arch/x86/kvm/emulate.c | 9 ++++----- 2 files changed, 9 insertions(+), 6 deletions(-)
arch/x86/include/asm/kvm_emulate.h +5 -1
@@ -153,13 +153,17 @@ struct x86_emulate_ops {struct operand {enum {OP_REG ,OP_MEM ,OP_IMM ,OP_NONE } type;unsigned int bytes; -unsigned long orig_val; +union { +unsigned long orig_val; +u64 orig_val64; + };union {unsigned long *reg;unsigned long mem; } addr;union {unsigned long val; +u64 val64;char valptr[sizeof (unsigned long ) +2 ]; }; };
arch/x86/kvm/emulate.c +4 -5
@@ -1479,17 +1479,16 @@ static inline int emulate_grp9(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) {struct decode_cache *c = &ctxt->decode; -u64 old = c->dst.orig_val; +u64 old = c->dst.orig_val64;if (((u32) (old >>0 ) != (u32 ) c->regs[VCPU_REGS_RAX ]) || ((u32) (old >>32 ) != (u32 ) c->regs[VCPU_REGS_RDX ])) { - c->regs[VCPU_REGS_RAX ] = (u32) (old >>0 ); c->regs[VCPU_REGS_RDX ] = (u32) (old >>32 ); ctxt->eflags &= ~EFLG_ZF ; }else { - c->dst.val = ((u64 )c->regs[VCPU_REGS_RCX ] <<32 ) | - (u32 ) c->regs[VCPU_REGS_RBX ]; + c->dst.val64 = ((u64 )c->regs[VCPU_REGS_RCX ] <<32 ) | + (u32 ) c->regs[VCPU_REGS_RBX ]; ctxt->eflags |=EFLG_ZF ; }
@@ -2978,7 +2977,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt) c->src.valptr, c->src.bytes);if (rc !=X86EMUL_CONTINUE ) goto done; - c->src.orig_val = c->src.val; + c->src.orig_val64 = c->src.val64; }if (c->src2.type ==OP_MEM ) {
Signature · 1 line
1.7.1
Marcelo Tosatti
AppliedQuoted 11 lines · Avi Kivity
operand::valandoperand::orig_valare 32-bit on i386, whereas cmpxchg8b operands are 64-bit.Fix by adding val64 and
orig_val64union members to struct operand, and using them where needed.Signed-off-by Avi Kivity <[email protected]>--- arch/x86/include/asm/kvm_emulate.h | 6 +++++- arch/x86/kvm/emulate.c | 9 ++++----- 2 files changed, 9 insertions(+), 6 deletions(-)
Applied, thanks.