Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c19b8bd6 authored by Wei Yongjun's avatar Wei Yongjun Committed by Avi Kivity
Browse files

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: default avatarWei Yongjun <yjwei@cn.fujitsu.com>
Acked-by: default avatarGleb Natapov <gleb@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 9195c4da
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -3562,6 +3562,10 @@ static int emulator_cmpxchg_emulated(unsigned long addr,
		goto emul_write;
		goto emul_write;


	page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT);
	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 = kmap_atomic(page, KM_USER0);
	kaddr += offset_in_page(gpa);
	kaddr += offset_in_page(gpa);