Re: [PATCH] svm: implement NEXTRIPsave SVM feature

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

 



On 12.04.2010, at 12:20, Avi Kivity wrote:

> On 04/12/2010 12:07 AM, Andre Przywara wrote:
>> On SVM we set the instruction length of skipped instructions
>> to hard-coded, well known values, which could be wrong when (bogus,
>> but valid) prefixes (REX, segment override) are used.
>> Newer AMD processors (Fam10h 45nm and better, aka. PhenomII or
>> AthlonII) have an explicit NEXTRIP field in the VMCB containing the
>> desired information.
>> Since it is cheap to do so, we use this field to override the guessed
>> value on newer processors.
>> A fix for older CPUs would be rather expensive, as it would require
>> to fetch and partially decode the instruction. As the problem is not
>> a security issue and needs special, handcrafted code to trigger
>> (no compiler will ever generate such code), I omit a fix for older
>> CPUs.
>> If someone is interested, I have both a patch for these CPUs as well as
>> demo code triggering this issue: It segfaults under KVM, but runs
>> perfectly on native Linux.
>> 
>> 
>> @@ -319,6 +319,9 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu)
>>  {
>>  	struct vcpu_svm *svm = to_svm(vcpu);
>> 
>> +	if (svm->vmcb->control.next_rip != 0)
>> +		svm->next_rip = svm->vmcb->control.next_rip;
>> +
>>  	if (!svm->next_rip) {
>>  		if (emulate_instruction(vcpu, 0, 0, EMULTYPE_SKIP) !=
>>  				EMULATE_DONE)
>>   
> 
> How does this interact with nested svm?  Suppose we exit a nested guest, then emulate a #VMEXIT, we'll have next_rip from a previous exit?

Since we don't call skip_emulated_instruction on #VMEXIT injection I think we're safe here. The instruction skip is done at the vmrun intercept.


Alex

--
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