WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH] Fix PV CPUID virtualization of XSave

To: Jan Beulich <JBeulich@xxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] Fix PV CPUID virtualization of XSave
From: Haitao Shan <maillists.shan@xxxxxxxxx>
Date: Mon, 19 Sep 2011 21:37:32 +0800
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, Keir Fraser <keir@xxxxxxx>
Delivery-date: Mon, 19 Sep 2011 06:38:26 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=3Ar624nQRLNkjiGfQIgbU9t6PW114CVCs9SNxYI+dbw=; b=E70SUcfhkds/Tb/eIOgopUoO2VvmsfKOKv0cxYhJa5vjP/hCQHi2EuLiexQ+uHXzRD MsVFwePYaGHlAmTJTlT/nxvmkzG51veJ6bljyaaq4cd9Nk2ccD+j7tO0iV86EsT1hdd5 vbuo0uY0xhViiYogNEKh49XV/6ly+fg7Dxb3U=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <CAFQ2Z+eMXPdxjLhyx3Uo_nDhz1BTaaiBJtsUmFrsppznQ2mTUg@xxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <CAFQ2Z+dSjU1dStaKyXry_PfRdJpO5k=35ULGPJ8TTj=5wVuW7w@xxxxxxxxxxxxxx> <4E7313510200007800056713@xxxxxxxxxxxxxxxxxxxx> <CAFQ2Z+eMXPdxjLhyx3Uo_nDhz1BTaaiBJtsUmFrsppznQ2mTUg@xxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Jan, Keir,

Updated patch is attached.

The patch will fix XSave CPUID virtualization for PV guests. The XSave
area size returned by CPUID leaf D is changed dynamically depending on
the XCR0. Tools/libxc only assigns a static value. The fix will adjust
xsave area size during runtime.

Note: This fix is already in HVM cpuid virtualization. And Dom0 is not
affected, either.

Signed-off-by:  Shan Haitao <haitao.shan@xxxxxxxxx>

diff -r e90438f6e6d1 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Wed Sep 14 11:38:13 2011 +0100
+++ b/xen/arch/x86/hvm/hvm.c    Mon Sep 19 14:34:15 2011 +0800
@@ -2426,7 +2426,7 @@ void hvm_cpuid(unsigned int input, unsig
         {
             /* reset EBX to default value first */
             *ebx = XSTATE_AREA_MIN_SIZE;
-            for ( sub_leaf = 2; sub_leaf < 64; sub_leaf++ )
+            for ( sub_leaf = 2; sub_leaf < 63; sub_leaf++ )
             {
                 if ( !(v->arch.xcr0 & (1ULL << sub_leaf)) )
                     continue;
diff -r e90438f6e6d1 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Wed Sep 14 11:38:13 2011 +0100
+++ b/xen/arch/x86/traps.c      Mon Sep 19 14:34:15 2011 +0800
@@ -770,6 +770,30 @@ static void pv_cpuid(struct cpu_user_reg
     {
         if ( !cpuid_hypervisor_leaves(a, c, &a, &b, &c, &d) )
             domain_cpuid(current->domain, a, c, &a, &b, &c, &d);
+
+        switch ( a )
+        {
+        case 0xd:
+        {
+            unsigned int sub_leaf, _eax, _ebx, _ecx, _edx;
+            /* EBX value of main leaf 0 depends on enabled xsave features */
+            if ( c == 0 && current->arch.xcr0 )
+            {
+                /* reset EBX to default value first */
+                b = XSTATE_AREA_MIN_SIZE;
+                for ( sub_leaf = 2; sub_leaf < 63; sub_leaf++ )
+                {
+                    if ( !(current->arch.xcr0 & (1ULL << sub_leaf)) )
+                        continue;
+                    domain_cpuid(current->domain, a, c, &_eax, &_ebx, &_ecx,
+                                 &_edx);
+                    if ( (_eax + _ebx) > b )
+                        b = _eax + _ebx;
+                }
+            }
+        break;
+        }
+        }
         goto out;
     }



2011/9/18 Haitao Shan <maillists.shan@xxxxxxxxx>:
> 2011/9/16 Jan Beulich <JBeulich@xxxxxxxx>:
>>>>> On 16.09.11 at 02:46, Haitao Shan <maillists.shan@xxxxxxxxx> wrote:
>>> Hi, Keir,
>>>
>>> The patch will fix XSave CPUID virtualization for PV guests. The XSave
>>> area size returned by CPUID leaf D is changed dynamically depending on
>>> the XCR0. Tools/libxc only assigns a static value. The fix will adjust
>>> xsave area size during runtime.
>>>
>>> Note: This fix is already in HVM cpuid virtualization. And Dom0 is not
>>> affected, either.
>>>
>>> Signed-off-by:  Shan Haitao <haitao.shan@xxxxxxxxx>
>>>
>>> Shan Haitao
>>>
>>> diff -r 5fe770c8a8a3 xen/arch/x86/traps.c
>>> --- a/xen/arch/x86/traps.c    Tue Sep 06 15:49:40 2011 +0100
>>> +++ b/xen/arch/x86/traps.c    Wed Sep 07 02:09:12 2011 +0800
>>> @@ -770,6 +770,30 @@ static void pv_cpuid(struct cpu_user_reg
>>>      {
>>>          if ( !cpuid_hypervisor_leaves(a, c, &a, &b, &c, &d) )
>>>              domain_cpuid(current->domain, a, c, &a, &b, &c, &d);
>>> +
>>> +        switch ( a )
>>> +        {
>>> +        case 0xd:
>>> +        {
>>> +            unsigned int sub_leaf, _eax, _ebx, _ecx, _edx;
>>> +            /* EBX value of main leaf 0 depends on enabled xsave features
>>> */
>>> +            if ( c == 0 && current->arch.xcr0 )
>>> +            {
>>> +                /* reset EBX to default value first */
>>> +                b = XSTATE_AREA_MIN_SIZE;
>>> +                for ( sub_leaf = 2; sub_leaf < 64; sub_leaf++ )
>>
>> Shouldn't the upper bound be 63 here (as bit 63 serves a different
>> purpose, and if that bit was set code changes would be required in
>> various other places)?
>>
>> Jan
> Nice catch! I will update the patch. The same piece of code is
> borrowed from hvm_cpuid(), where I can change the value from 64 to 63,
> too.
>
> Shan Haitao
>
>>
>>> +                {
>>> +                    if ( !(current->arch.xcr0 & (1ULL << sub_leaf)) )
>>> +                        continue;
>>> +                    domain_cpuid(current->domain, a, c, &_eax, &_ebx, 
>>> &_ecx,
>>> +                                 &_edx);
>>> +                    if ( (_eax + _ebx) > b )
>>> +                        b = _eax + _ebx;
>>> +                }
>>> +            }
>>> +        break;
>>> +        }
>>> +        }
>>>          goto out;
>>>      }
>>
>>
>>
>>
>

Attachment: pv_xsave_cpuid_fix.patch
Description: Binary data

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>