x86, sleep: Always save the value of EFER
authorH. Peter Anvin <hpa@zytor.com>
Fri, 13 Nov 2009 23:28:14 +0000 (15:28 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 16 Nov 2009 21:44:57 +0000 (13:44 -0800)
Always save the value of EFER, regardless of the state of NX.  Since
EFER may not actually exist, use rdmsr_safe() to do so.

v2: check the return value from rdmsr_safe() instead of relying on
    the output values being unchanged on error.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Nigel Cunningham <nigel@tuxonice.net>
LKML-Reference: <1258154897-6770-3-git-send-email-hpa@zytor.com>
Acked-by: Kees Cook <kees.cook@canonical.com>
arch/x86/kernel/acpi/sleep.c

index 4a41145..82e5086 100644 (file)
@@ -78,12 +78,9 @@ int acpi_save_state_mem(void)
 #ifndef CONFIG_64BIT
        store_gdt((struct desc_ptr *)&header->pmode_gdt);
 
-       header->pmode_efer_low = nx_enabled;
-       if (header->pmode_efer_low & 1) {
-               /* This is strange, why not save efer, always? */
-               rdmsr(MSR_EFER, header->pmode_efer_low,
-                       header->pmode_efer_high);
-       }
+       if (rdmsr_safe(MSR_EFER, &header->pmode_efer_low,
+                      &header->pmode_efer_high))
+               header->pmode_efer_low = header->pmode_efer_high = 0;
 #endif /* !CONFIG_64BIT */
 
        header->pmode_cr0 = read_cr0();