From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [V0 PATCH 4/6] AMD-PVH: Do not get/set vlapic TPR Date: Mon, 18 Aug 2014 21:16:56 -0400 Message-ID: <53F2A588.7080407@oracle.com> References: <1408153996-16425-1-git-send-email-mukesh.rathor@oracle.com> <1408153996-16425-5-git-send-email-mukesh.rathor@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XJY2n-0004Sa-RJ for xen-devel@lists.xenproject.org; Tue, 19 Aug 2014 01:17:02 +0000 In-Reply-To: <1408153996-16425-5-git-send-email-mukesh.rathor@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Mukesh Rathor , xen-devel@lists.xenproject.org Cc: keir@xen.org, Aravind.Gopalakrishnan@amd.com, jbeulich@suse.com, suravee.suthikulpanit@amd.com List-Id: xen-devel@lists.xenproject.org On 08/15/2014 09:53 PM, Mukesh Rathor wrote: > PVH doesn't use apic emulation hence vlapic->regs ptr is not set for it. > > Signed-off-by: Mukesh Rathor > --- > xen/arch/x86/hvm/svm/svm.c | 25 ++++++++++++++----------- > 1 file changed, 14 insertions(+), 11 deletions(-) > > diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c > index dac16f4..4bb4ff2 100644 > --- a/xen/arch/x86/hvm/svm/svm.c > +++ b/xen/arch/x86/hvm/svm/svm.c > @@ -1052,7 +1052,7 @@ static void noreturn svm_do_resume(struct vcpu *v) > hvm_asid_flush_vcpu(v); > } > > - if ( !vcpu_guestmode ) > + if ( !vcpu_guestmode && vcpu_vlapic(v)->regs ) I think checking explicitly for PVH (i.e. is_pvh_domain()) would be better. Here and below, obviously. -boris > { > vintr_t intr; > > @@ -2247,7 +2247,7 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) > * NB. We need to preserve the low bits of the TPR to make checked builds > * of Windows work, even though they don't actually do anything. > */ > - if ( !vcpu_guestmode ) { > + if ( !vcpu_guestmode && vcpu_vlapic(v)->regs ) { > intr = vmcb_get_vintr(vmcb); > vlapic_set_reg(vcpu_vlapic(v), APIC_TASKPRI, > ((intr.fields.tpr & 0x0F) << 4) | > @@ -2628,15 +2628,18 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) > } > > out: > - if ( vcpu_guestmode ) > - /* Don't clobber TPR of the nested guest. */ > - return; > - > - /* The exit may have updated the TPR: reflect this in the hardware vtpr */ > - intr = vmcb_get_vintr(vmcb); > - intr.fields.tpr = > - (vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xFF) >> 4; > - vmcb_set_vintr(vmcb, intr); > + /* Don't clobber TPR of the nested guest. */ > + if ( vcpu_guestmode && vcpu_vlapic(v)->regs ) > + { > + /* > + * The exit may have updated the TPR: reflect this in the hardware > + * vtpr. > + */ > + intr = vmcb_get_vintr(vmcb); > + intr.fields.tpr = > + (vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xFF) >> 4; > + vmcb_set_vintr(vmcb, intr); > + } > } > > void svm_trace_vmentry(void)