[PATCH] x86: Save and restore the fixed-range MTRRs of the BSP when suspending
Note: This patch didn'nt need an update since it's initial post. Some BIOSes may modify fixed-range MTRRs in SMM, e.g. when they transition the system into ACPI mode, which is entered thru an SMI, triggered by Linux in acpi_enable(). SMIs which cause that Linux is interrupted and BIOS code is executed (which may change e.g. fixed-range MTRRs) in SMM may be raised by an embedded system controller which is often found in notebooks also at other occasions. If we would not update our copy of the fixed-range MTRRs before suspending to RAM or to disk, restore_processor_state() would set the fixed-range MTRRs of the BSP using old backup values which may be outdated and this could cause the system to fail later during resume. This patch ensures that our copy of the fixed-range MTRRs is updated when saving the boot processor state on suspend to disk and suspend to RAM. In combination with other patches this allows to fix s2ram and s2disk on the Acer Ferrari 1000 notebook and at least s2disk on the Acer Ferrari 5000 notebook. Signed-off-by: Bernhard Kaindl <bk@suse.de> Signed-off-by: Andi Kleen <ak@suse.de> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andi Kleen <ak@suse.de> Cc: Dave Jones <davej@codemonkey.org.uk>
This commit is contained in:
parent
2b1f6278d7
commit
3ebad59056
|
@ -21,6 +21,7 @@ unsigned long saved_context_eflags;
|
||||||
|
|
||||||
void __save_processor_state(struct saved_context *ctxt)
|
void __save_processor_state(struct saved_context *ctxt)
|
||||||
{
|
{
|
||||||
|
mtrr_save_fixed_ranges(NULL);
|
||||||
kernel_fpu_begin();
|
kernel_fpu_begin();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <asm/proto.h>
|
#include <asm/proto.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/mtrr.h>
|
||||||
|
|
||||||
/* References to section boundaries */
|
/* References to section boundaries */
|
||||||
extern const void __nosave_begin, __nosave_end;
|
extern const void __nosave_begin, __nosave_end;
|
||||||
|
@ -48,6 +49,7 @@ void __save_processor_state(struct saved_context *ctxt)
|
||||||
rdmsrl(MSR_FS_BASE, ctxt->fs_base);
|
rdmsrl(MSR_FS_BASE, ctxt->fs_base);
|
||||||
rdmsrl(MSR_GS_BASE, ctxt->gs_base);
|
rdmsrl(MSR_GS_BASE, ctxt->gs_base);
|
||||||
rdmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base);
|
rdmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base);
|
||||||
|
mtrr_save_fixed_ranges(NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* control registers
|
* control registers
|
||||||
|
|
Loading…
Reference in a new issue