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

Commit af7cc7d1 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Avi Kivity
Browse files

KVM: x86: introduce vcpu_mmio_gva_to_gpa to cleanup the code



Introduce vcpu_mmio_gva_to_gpa to translate the gva to gpa, we can use it
to cleanup the code between read emulation and write emulation

Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent ffb61bb3
Loading
Loading
Loading
Loading
+31 −11
Original line number Original line Diff line number Diff line
@@ -4010,6 +4010,27 @@ out:
}
}
EXPORT_SYMBOL_GPL(kvm_write_guest_virt_system);
EXPORT_SYMBOL_GPL(kvm_write_guest_virt_system);


static int vcpu_mmio_gva_to_gpa(struct kvm_vcpu *vcpu, unsigned long gva,
				gpa_t *gpa, struct x86_exception *exception,
				bool write)
{
	u32 access = (kvm_x86_ops->get_cpl(vcpu) == 3) ? PFERR_USER_MASK : 0;

	if (write)
		access |= PFERR_WRITE_MASK;

	*gpa = vcpu->arch.walk_mmu->gva_to_gpa(vcpu, gva, access, exception);

	if (*gpa == UNMAPPED_GVA)
		return -1;

	/* For APIC access vmexit */
	if ((*gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE)
		return 1;

	return 0;
}

static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt,
static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt,
				  unsigned long addr,
				  unsigned long addr,
				  void *val,
				  void *val,
@@ -4018,7 +4039,7 @@ static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt,
{
{
	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
	gpa_t gpa;
	gpa_t gpa;
	int handled;
	int handled, ret;


	if (vcpu->mmio_read_completed) {
	if (vcpu->mmio_read_completed) {
		memcpy(val, vcpu->mmio_data, bytes);
		memcpy(val, vcpu->mmio_data, bytes);
@@ -4028,13 +4049,12 @@ static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt,
		return X86EMUL_CONTINUE;
		return X86EMUL_CONTINUE;
	}
	}


	gpa = kvm_mmu_gva_to_gpa_read(vcpu, addr, exception);
	ret = vcpu_mmio_gva_to_gpa(vcpu, addr, &gpa, exception, false);


	if (gpa == UNMAPPED_GVA)
	if (ret < 0)
		return X86EMUL_PROPAGATE_FAULT;
		return X86EMUL_PROPAGATE_FAULT;


	/* For APIC access vmexit */
	if (ret)
	if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE)
		goto mmio;
		goto mmio;


	if (kvm_read_guest_virt(ctxt, addr, val, bytes, exception)
	if (kvm_read_guest_virt(ctxt, addr, val, bytes, exception)
@@ -4086,15 +4106,15 @@ static int emulator_write_emulated_onepage(unsigned long addr,
					   struct kvm_vcpu *vcpu)
					   struct kvm_vcpu *vcpu)
{
{
	gpa_t gpa;
	gpa_t gpa;
	int handled;
	int handled, ret;


	gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
	ret = vcpu_mmio_gva_to_gpa(vcpu, addr, &gpa, exception, true);


	if (gpa == UNMAPPED_GVA)
	if (ret < 0)
		return X86EMUL_PROPAGATE_FAULT;
		return X86EMUL_PROPAGATE_FAULT;


	/* For APIC access vmexit */
	/* For APIC access vmexit */
	if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE)
	if (ret)
		goto mmio;
		goto mmio;


	if (emulator_write_phys(vcpu, gpa, val, bytes))
	if (emulator_write_phys(vcpu, gpa, val, bytes))