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

After all the pages are restored to previous address, the page
table switches back to current swapper_pg_dir. However the
swapper_pg_dir currently in used might not be consistent with
previous page table, which might cause issue after resumed.

Fix this issue by switching to original page table after resumed.

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_asm_32.S | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/x86/power/hibernate_asm_32.S 
b/arch/x86/power/hibernate_asm_32.S
index f5103ae96582..6b2b94937113 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -25,6 +25,10 @@ ENTRY(swsusp_arch_suspend)
        pushfl
        popl saved_context_eflags
 
+       /* save cr3 */
+       movl    %cr3, %eax
+       movl    %eax, restore_cr3
+
        FRAME_BEGIN
        call swsusp_save
        FRAME_END
@@ -32,6 +36,8 @@ ENTRY(swsusp_arch_suspend)
 ENDPROC(swsusp_arch_suspend)
 
 ENTRY(restore_image)
+       movl    restore_cr3, %ebp
+
        movl    mmu_cr4_features, %ecx
        movl    temp_pgt, %eax
        movl    %eax, %cr3
@@ -66,9 +72,7 @@ done:
        .align PAGE_SIZE
 ENTRY(restore_registers)
        /* go back to the original page tables */
-       movl    $swapper_pg_dir, %eax
-       subl    $__PAGE_OFFSET, %eax
-       movl    %eax, %cr3
+       movl    %ebp, %cr3
        movl    mmu_cr4_features, %ecx
        jecxz   1f      # cr4 Pentium and higher, skip if zero
        movl    %ecx, %cr4;  # turn PGE back on
-- 
2.17.1

Reply via email to