KVM/X86: Use kvm_vcpu_map in emulator_cmpxchg_emulated
Use kvm_vcpu_map in emulator_cmpxchg_emulated since using kvm_vcpu_gpa_to_page() and kmap() will only work for guest memory that has a "struct page". Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de> Reviewed-by: Konrad Rzeszutek Wilk <kjonrad.wilk@oracle.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3278e04925
commit
42e35f8072
|
@ -5557,9 +5557,9 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,
|
||||||
unsigned int bytes,
|
unsigned int bytes,
|
||||||
struct x86_exception *exception)
|
struct x86_exception *exception)
|
||||||
{
|
{
|
||||||
|
struct kvm_host_map map;
|
||||||
struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
|
struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
|
||||||
gpa_t gpa;
|
gpa_t gpa;
|
||||||
struct page *page;
|
|
||||||
char *kaddr;
|
char *kaddr;
|
||||||
bool exchanged;
|
bool exchanged;
|
||||||
|
|
||||||
|
@ -5576,12 +5576,11 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,
|
||||||
if (((gpa + bytes - 1) & PAGE_MASK) != (gpa & PAGE_MASK))
|
if (((gpa + bytes - 1) & PAGE_MASK) != (gpa & PAGE_MASK))
|
||||||
goto emul_write;
|
goto emul_write;
|
||||||
|
|
||||||
page = kvm_vcpu_gfn_to_page(vcpu, gpa >> PAGE_SHIFT);
|
if (kvm_vcpu_map(vcpu, gpa_to_gfn(gpa), &map))
|
||||||
if (is_error_page(page))
|
|
||||||
goto emul_write;
|
goto emul_write;
|
||||||
|
|
||||||
kaddr = kmap_atomic(page);
|
kaddr = map.hva + offset_in_page(gpa);
|
||||||
kaddr += offset_in_page(gpa);
|
|
||||||
switch (bytes) {
|
switch (bytes) {
|
||||||
case 1:
|
case 1:
|
||||||
exchanged = CMPXCHG_TYPE(u8, kaddr, old, new);
|
exchanged = CMPXCHG_TYPE(u8, kaddr, old, new);
|
||||||
|
@ -5598,13 +5597,12 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
kunmap_atomic(kaddr);
|
|
||||||
kvm_release_page_dirty(page);
|
kvm_vcpu_unmap(vcpu, &map, true);
|
||||||
|
|
||||||
if (!exchanged)
|
if (!exchanged)
|
||||||
return X86EMUL_CMPXCHG_FAILED;
|
return X86EMUL_CMPXCHG_FAILED;
|
||||||
|
|
||||||
kvm_vcpu_mark_page_dirty(vcpu, gpa >> PAGE_SHIFT);
|
|
||||||
kvm_page_track_write(vcpu, gpa, new, bytes);
|
kvm_page_track_write(vcpu, gpa, new, bytes);
|
||||||
|
|
||||||
return X86EMUL_CONTINUE;
|
return X86EMUL_CONTINUE;
|
||||||
|
|
Loading…
Reference in New Issue