[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging-4.14] x86/S3: Restore CR4 earlier during resume



commit 9c1cc643ac3651950ec054a41c970e3fc6ee6da6
Author:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Tue Oct 20 14:43:40 2020 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Oct 20 14:43:40 2020 +0200

    x86/S3: Restore CR4 earlier during resume
    
    c/s 4304ff420e5 "x86/S3: Drop {save,restore}_rest_processor_state()
    completely" moved CR4 restoration up into C, to account for the fact that 
MCE
    was explicitly handled later.
    
    However, time_resume() ends up making an EFI Runtime Service call, and EFI
    explodes without OSFXSR, presumably when trying to spill %xmm registers onto
    the stack.
    
    Given this codepath, and the potential for other issues of a similar kind 
(TLB
    flushing vs INVPCID, HVM logic vs VMXE, etc), restore CR4 in asm before
    entering C.
    
    Ignore the previous MCE special case, because its not actually necessary.  
The
    handler is already suitably configured from before suspend.
    
    Fixes: 4304ff420e5 ("x86/S3: Drop {save,restore}_rest_processor_state() 
completely")
    Reported-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    Tested-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
    master commit: 7f66c0dc41ae5f770c614e516810eb1f336e2470
    master date: 2020-10-06 12:28:37 +0100
---
 xen/arch/x86/acpi/power.c       | 3 ---
 xen/arch/x86/acpi/wakeup_prot.S | 6 ++++++
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/xen/arch/x86/acpi/power.c b/xen/arch/x86/acpi/power.c
index 4fb1e7a148..7f162a4df9 100644
--- a/xen/arch/x86/acpi/power.c
+++ b/xen/arch/x86/acpi/power.c
@@ -276,9 +276,6 @@ static int enter_state(u32 state)
 
     mcheck_init(&boot_cpu_data, false);
 
-    /* Restore CR4 from cached value, now MCE is set up. */
-    write_cr4(read_cr4());
-
     printk(XENLOG_INFO "Finishing wakeup from ACPI S%d state.\n", state);
 
     if ( (state == ACPI_STATE_S3) && error )
diff --git a/xen/arch/x86/acpi/wakeup_prot.S b/xen/arch/x86/acpi/wakeup_prot.S
index c6b3fcc93d..15052c300f 100644
--- a/xen/arch/x86/acpi/wakeup_prot.S
+++ b/xen/arch/x86/acpi/wakeup_prot.S
@@ -1,3 +1,4 @@
+#include <asm/asm_defns.h>
 #include <asm/msr-index.h>
 #include <asm/page.h>
 #include <asm/processor.h>
@@ -110,6 +111,11 @@ ENTRY(s3_resume)
 
         call    load_system_tables
 
+        /* Restore CR4 from the cpuinfo block. */
+        GET_STACK_END(bx)
+        mov     STACK_CPUINFO_FIELD(cr4)(%rbx), %rax
+        mov     %rax, %cr4
+
 .Lsuspend_err:
         pop     %r15
         pop     %r14
--
generated by git-patchbot for /home/xen/git/xen.git#staging-4.14



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.