diff options
author | Zhimin Gu <[email protected]> | 2018-09-21 14:28:11 +0800 |
---|---|---|
committer | Rafael J. Wysocki <[email protected]> | 2018-10-03 11:56:34 +0200 |
commit | 32aa276437f6128df63111af13e57fe8f0272af3 (patch) | |
tree | 58a65d9e86baba9db8ba38c66eea8bd0a7d8e3fd /arch/x86/power/hibernate_asm_32.S | |
parent | 0b0a6b1f76835cbaf746e7c72edd374ec0fe818b (diff) |
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 <[email protected]>
Acked-by: Pavel Machek <[email protected]>
Signed-off-by: Chen Yu <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>
Signed-off-by: Rafael J. Wysocki <[email protected]>
Diffstat (limited to 'arch/x86/power/hibernate_asm_32.S')
-rw-r--r-- | arch/x86/power/hibernate_asm_32.S | 10 |
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 |