Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 947ccf9c authored by Shan Haitao's avatar Shan Haitao Committed by Konrad Rzeszutek Wilk
Browse files

xen: Allow PV-OPS kernel to detect whether XSAVE is supported



Xen fails to mask XSAVE from the cpuid feature, despite not historically
supporting guest use of XSAVE.  However, now that XSAVE support has been
added to Xen, we need to reliably detect its presence.

The most reliable way to do this is to look at the OSXSAVE feature in
cpuid which is set iff the OS (Xen, in this case), has set
CR4.OSXSAVE.

[ Cleaned up conditional a bit. - Jeremy ]

Signed-off-by: default avatarShan Haitao <haitao.shan@intel.com>
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 61f4237d
Loading
Loading
Loading
Loading
+10 −1
Original line number Original line Diff line number Diff line
@@ -238,6 +238,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
static __init void xen_init_cpuid_mask(void)
static __init void xen_init_cpuid_mask(void)
{
{
	unsigned int ax, bx, cx, dx;
	unsigned int ax, bx, cx, dx;
	unsigned int xsave_mask;


	cpuid_leaf1_edx_mask =
	cpuid_leaf1_edx_mask =
		~((1 << X86_FEATURE_MCE)  |  /* disable MCE */
		~((1 << X86_FEATURE_MCE)  |  /* disable MCE */
@@ -249,8 +250,16 @@ static __init void xen_init_cpuid_mask(void)
		cpuid_leaf1_edx_mask &=
		cpuid_leaf1_edx_mask &=
			~((1 << X86_FEATURE_APIC) |  /* disable local APIC */
			~((1 << X86_FEATURE_APIC) |  /* disable local APIC */
			  (1 << X86_FEATURE_ACPI));  /* disable ACPI */
			  (1 << X86_FEATURE_ACPI));  /* disable ACPI */
	ax = 1;
	xen_cpuid(&ax, &bx, &cx, &dx);


	cpuid_leaf1_ecx_mask &= ~(1 << (X86_FEATURE_XSAVE % 32)); /* disable XSAVE */
	xsave_mask =
		(1 << (X86_FEATURE_XSAVE % 32)) |
		(1 << (X86_FEATURE_OSXSAVE % 32));

	/* Xen will set CR4.OSXSAVE if supported and not disabled by force */
	if ((cx & xsave_mask) != xsave_mask)
		cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */
}
}


static void xen_set_debugreg(int reg, unsigned long val)
static void xen_set_debugreg(int reg, unsigned long val)