Re: [PATCH v2 1/8] KVM: Fix load_guest_segment_descriptor() to inject page fault

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Gleb Natapov wrote:
On Wed, Feb 10, 2010 at 06:25:42PM +0200, Avi Kivity wrote:
On 02/10/2010 03:50 AM, Takuya Yoshikawa wrote:
This patch injects page fault when reading descriptor in
load_guest_segment_descriptor() fails with FAULT.

Effects of this injection: This function is used by
kvm_load_segment_descriptor() which is necessary for the
following instructions.
 - mov seg,r/m16
 - jmp far
 - pop ?s
This patch makes it possible to emulate the page faults
generated by these instructions. But be sure that unless
we change the kvm_load_segment_descriptor()'s ret value
propagation this patch has no effect.


@@ -4655,6 +4655,7 @@ static int load_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
 {
 	struct descriptor_table dtable;
 	u16 index = selector>>  3;
+	int ret;

 	get_segment_descriptor_dtable(vcpu, selector,&dtable);

@@ -4662,7 +4663,11 @@ static int load_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
 		kvm_queue_exception_e(vcpu, GP_VECTOR, selector&  0xfffc);
 		return X86EMUL_PROPAGATE_FAULT;
 	}
-	return kvm_read_guest_virt(dtable.base + index*8, seg_desc, sizeof(*seg_desc), vcpu);
+	ret = kvm_read_guest_virt(dtable.base + index*8, seg_desc, sizeof(*seg_desc), vcpu);
+	if (ret == X86EMUL_PROPAGATE_FAULT)
+		kvm_inject_page_fault(vcpu, dtable.base + index*8, 0);
+
+	return ret;
 }
If the descriptor table is not aligned, and a descriptor spans two
pages, then we might need to inject a page fault at some other
address.

Also, the injection should be done in kvm_read_guest_virt() to avoid
duplicating code.

This function is used from inside emulator and I hope one day we will
make emulator independent of KVM, so it shouldn't inject event directly,
but rather return them as a result of emulation. Also this function is
used in kvm_report_emulation_failure() may be not the best place to
inject #PF.

Agree. Actually I tried to find how to, at which layer, inject page faults,
but could not find any good way in the current situation.


These instructions however are only emulated in big real mode.
Where did you encounter the need to inject page faults during their
emulation?

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux