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

Commit 83b8e28b authored by Suresh Siddha's avatar Suresh Siddha Committed by H. Peter Anvin
Browse files

x86: xsave: restore xcr0 during resume



Add the missing XCR0(XFEATURE_ENABLED_MASK) restore during resume.

Reported-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent f65bc214
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/suspend.h>
#include <linux/suspend.h>
#include <asm/mtrr.h>
#include <asm/mtrr.h>
#include <asm/mce.h>
#include <asm/mce.h>
#include <asm/xcr.h>


static struct saved_context saved_context;
static struct saved_context saved_context;


@@ -124,6 +125,12 @@ static void __restore_processor_state(struct saved_context *ctxt)
	if (boot_cpu_has(X86_FEATURE_SEP))
	if (boot_cpu_has(X86_FEATURE_SEP))
		enable_sep_cpu();
		enable_sep_cpu();


	/*
	 * restore XCR0 for xsave capable cpu's.
	 */
	if (cpu_has_xsave)
		xsetbv(XCR_XFEATURE_ENABLED_MASK, pcntxt_mask);

	fix_processor_context();
	fix_processor_context();
	do_fpu_end();
	do_fpu_end();
	mtrr_ap_init();
	mtrr_ap_init();
+7 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@
#include <asm/page.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/pgtable.h>
#include <asm/mtrr.h>
#include <asm/mtrr.h>
#include <asm/xcr.h>


static void fix_processor_context(void);
static void fix_processor_context(void);


@@ -122,6 +123,12 @@ static void __restore_processor_state(struct saved_context *ctxt)
	wrmsrl(MSR_GS_BASE, ctxt->gs_base);
	wrmsrl(MSR_GS_BASE, ctxt->gs_base);
	wrmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base);
	wrmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base);


	/*
	 * restore XCR0 for xsave capable cpu's.
	 */
	if (cpu_has_xsave)
		xsetbv(XCR_XFEATURE_ENABLED_MASK, pcntxt_mask);

	fix_processor_context();
	fix_processor_context();


	do_fpu_end();
	do_fpu_end();