public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: Alexander Graf <agraf@suse.de>
Cc: Andre Przywara <andre.przywara@amd.com>, kvm@vger.kernel.org
Subject: Re: [PATCH] svm: implement NEXTRIPsave SVM feature
Date: Mon, 12 Apr 2010 13:34:56 +0300	[thread overview]
Message-ID: <4BC2F750.4020007@redhat.com> (raw)
In-Reply-To: <204DAA35-1D05-4738-B65C-C68C622B52FF@suse.de>

On 04/12/2010 01:29 PM, Alexander Graf wrote:
> 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.
>
>    

I think you're right.  If the guest intercepts, we don't 
skip_emulated_instruction().  If the guest doesn't intercept, we keep 
the nested vmcb, so next_rip is right.

Neat.

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


  reply	other threads:[~2010-04-12 10:35 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-11 21:07 [PATCH] svm: implement NEXTRIPsave SVM feature Andre Przywara
2010-04-11 21:40 ` Alexander Graf
2010-04-11 21:43   ` Alexander Graf
2010-04-11 21:51     ` Andre Przywara
2010-04-11 21:57       ` Alexander Graf
2010-04-11 22:13         ` Andre Przywara
2010-04-11 22:18           ` Alexander Graf
2010-04-12 10:20 ` Avi Kivity
2010-04-12 10:29   ` Alexander Graf
2010-04-12 10:34     ` Avi Kivity [this message]
2010-04-13 16:31 ` Marcelo Tosatti

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BC2F750.4020007@redhat.com \
    --to=avi@redhat.com \
    --cc=agraf@suse.de \
    --cc=andre.przywara@amd.com \
    --cc=kvm@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox