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