From: Zhimin Gu <kookoo...@intel.com>

Code should be executed in a safe page during page
restoring, as the page where instruction is running
during resume might be scribbled and causes issues.

Backport the code from 64 bit system to fix this bug.

Cc: "Rafael J. Wysocki" <r...@rjwysocki.net>
Signed-off-by: Zhimin Gu <kookoo...@intel.com>
Signed-off-by: Chen Yu <yu.c.c...@intel.com>
---
 arch/x86/power/hibernate_32.c     | 4 ++++
 arch/x86/power/hibernate_asm_32.S | 7 +++++++
 2 files changed, 11 insertions(+)

diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c
index a44bdada4e4e..a9861095fbb8 100644
--- a/arch/x86/power/hibernate_32.c
+++ b/arch/x86/power/hibernate_32.c
@@ -158,6 +158,10 @@ asmlinkage int swsusp_arch_resume(void)
 
        temp_pgt = __pa(resume_pg_dir);
 
+       error = relocate_restore_code();
+       if (error)
+               return error;
+
        /* We have got enough memory and from now on we cannot recover */
        restore_image();
        return 0;
diff --git a/arch/x86/power/hibernate_asm_32.S 
b/arch/x86/power/hibernate_asm_32.S
index 6b2b94937113..e9adda6b6b02 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -39,6 +39,13 @@ ENTRY(restore_image)
        movl    restore_cr3, %ebp
 
        movl    mmu_cr4_features, %ecx
+
+       /* jump to relocated restore code */
+       movl    relocated_restore_code, %eax
+       jmpl    *%eax
+
+/* code below has been relocated to a safe page */
+ENTRY(core_restore_code)
        movl    temp_pgt, %eax
        movl    %eax, %cr3
 
-- 
2.17.1

Reply via email to