|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxc/x86: XSAVE related adjustments
On 22/03/16 13:05, Jan Beulich wrote:
> - don't unintentionally increase features reported by sub-leaf 0
> EDX:EAX
> - don't discard the known flags in sub-leaves 2..63 ECX
> - handle components 32...62 (EDX) in sub-leaf 1 consistently with
> 0...31 (ECX)
> - zap sub-leaves beyond 62
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> While obviously requiring re-basing on either end when taking Andrew's
> CPUID levelling series into account, the changes done here appear to
> be orthogonal to those done in his series.
>
> --- a/tools/libxc/xc_cpuid_x86.c
> +++ b/tools/libxc/xc_cpuid_x86.c
> @@ -281,10 +281,14 @@ static void intel_xc_cpuid_policy(xc_int
> }
> }
>
> +/* Leaf 1, EAX: */
> #define XSAVEOPT (1 << 0)
> #define XSAVEC (1 << 1)
> #define XGETBV1 (1 << 2)
> #define XSAVES (1 << 3)
Hmm - I should convert these to be X86_FEATURESET_xxx values.
> +/* Leaves beyond 1, ECX: */
> +#define XSTATE_XSS (1 << 0)
> +#define XSTATE_ALIGN64 (1 << 1)
> /* Configure extended state enumeration leaves (0x0000000D for xsave) */
> static void xc_cpuid_config_xsave(xc_interface *xch,
> const struct cpuid_domain_info *info,
> @@ -300,9 +304,9 @@ static void xc_cpuid_config_xsave(xc_int
> {
> case 0:
> /* EAX: low 32bits of xfeature_enabled_mask */
> - regs[0] = info->xfeature_mask & 0xFFFFFFFF;
> + regs[0] &= info->xfeature_mask;
> /* EDX: high 32bits of xfeature_enabled_mask */
> - regs[3] = (info->xfeature_mask >> 32) & 0xFFFFFFFF;
> + regs[3] &= info->xfeature_mask >> 32;
> /* ECX: max size required by all HW features */
> {
> unsigned int _input[2] = {0xd, 0x0}, _regs[4];
This is an improvement on the code currently present, but is still
superseded by the final patch of my cpuid series.
> @@ -325,16 +329,20 @@ static void xc_cpuid_config_xsave(xc_int
Between these two hunks, there is a loop bound which is also wrong.
> if ( !info->hvm )
> regs[0] &= ~XSAVES;
> regs[2] &= info->xfeature_mask;
> - regs[3] = 0;
> + regs[3] &= info->xfeature_mask >> 32;
> break;
> - case 2 ... 63: /* sub-leaves */
> + case 2 ... 62: /* per-component sub-leaves */
> if ( !(info->xfeature_mask & (1ULL << input[1])) )
Now I think about it, this check is incomplete. xfeature_mask doesn't
contain xss values.
For now its fine, but it will cause problems when support for Processor
Trace is added.
> {
> regs[0] = regs[1] = regs[2] = regs[3] = 0;
> break;
> }
> /* Don't touch EAX, EBX. Also cleanup ECX and EDX */
> - regs[2] = regs[3] = 0;
> + regs[2] &= XSTATE_XSS | XSTATE_ALIGN64;
> + regs[3] = 0;
> + break;
> + default:
> + regs[0] = regs[1] = regs[2] = regs[3] = 0;
> break;
If you wish, I can fold this patch into the final patch of my cpuid series.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |