diff options
author | Wei Yongjun <yjwei@cn.fujitsu.com> | 2010-07-15 00:51:58 (GMT) |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-08-02 03:40:53 (GMT) |
commit | c19b8bd60e19308d5583ef200ddcc782d85d9543 (patch) | |
tree | ac58a35ca5f79a4bf5f36445ecc8e7d2c10178b4 /arch/x86 | |
parent | 9195c4da26bbf8860e2e7b648dbf4ab465c7933a (diff) | |
download | linux-c19b8bd60e19308d5583ef200ddcc782d85d9543.tar.xz |
KVM: x86 emulator: fix xchg instruction emulation
If the destination is a memory operand and the memory cannot
map to a valid page, the xchg instruction emulation and locked
instruction will not work on io regions and stuck in endless
loop. We should emulate exchange as write to fix it.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Acked-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kvm/x86.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 689c2c3..97aab03 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3562,6 +3562,10 @@ static int emulator_cmpxchg_emulated(unsigned long addr, goto emul_write; page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); + if (is_error_page(page)) { + kvm_release_page_clean(page); + goto emul_write; + } kaddr = kmap_atomic(page, KM_USER0); kaddr += offset_in_page(gpa); |