summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/emulate.c
diff options
context:
space:
mode:
authorAvi Kivity2010-08-16 16:50:56 +0200
committerAvi Kivity2010-10-24 10:51:11 +0200
commitfb2c264105c64511dbd1a7488b482960895aace4 (patch)
treea91a85707f1273e3f6eda11d616d8da55556a4f9 /arch/x86/kvm/emulate.c
parentKVM: x86 emulator: pass destination type to ____emulate_2op() (diff)
downloadkernel-qcow2-linux-fb2c264105c64511dbd1a7488b482960895aace4.tar.gz
kernel-qcow2-linux-fb2c264105c64511dbd1a7488b482960895aace4.tar.xz
kernel-qcow2-linux-fb2c264105c64511dbd1a7488b482960895aace4.zip
KVM: x86 emulator: Use a register for ____emulate_2op() destination
Most x86 two operand instructions allow the destination to be a memory operand, but IMUL (for example) requires that the destination be a register. Change ____emulate_2op() to take a register for both source and destination so we can invoke IMUL. Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r--arch/x86/kvm/emulate.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 7818c91deb63..81b0f8848960 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -200,7 +200,7 @@ struct group_dual {
_PRE_EFLAGS("0", "4", "2") \
_op _suffix " %"_x"3,%1; " \
_POST_EFLAGS("0", "4", "2") \
- : "=m" (_eflags), "=m" (*(_dsttype*)&(_dst).val),\
+ : "=m" (_eflags), "+q" (*(_dsttype*)&(_dst).val),\
"=&r" (_tmp) \
: _y ((_src).val), "i" (EFLAGS_MASK)); \
} while (0)