summaryrefslogtreecommitdiffstats
path: root/arch/x86/power/hibernate_asm_32.S
diff options
context:
space:
mode:
authorZhimin Gu <kookoo.gu@intel.com>2018-09-21 14:28:11 +0800
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-10-03 11:56:34 +0200
commit32aa276437f6128df63111af13e57fe8f0272af3 (patch)
tree58a65d9e86baba9db8ba38c66eea8bd0a7d8e3fd /arch/x86/power/hibernate_asm_32.S
parent0b0a6b1f76835cbaf746e7c72edd374ec0fe818b (diff)
downloadlinux-32aa276437f6128df63111af13e57fe8f0272af3.tar.bz2
x86-32, hibernate: Switch to original page table after resumed
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 resume. Fix this issue by switching to original page table after resume, and the address of the original page table is saved in the hibernation image header. Move the manipulation of restore_cr3 into common code blocks. Signed-off-by: Zhimin Gu <kookoo.gu@intel.com> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Chen Yu <yu.c.chen@intel.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'arch/x86/power/hibernate_asm_32.S')
-rw-r--r--arch/x86/power/hibernate_asm_32.S10
1 files 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