summaryrefslogtreecommitdiffstats
path: root/arch/x86/power/hibernate.c
diff options
context:
space:
mode:
authorZhimin Gu <kookoo.gu@intel.com>2018-09-21 08:28:11 +0200
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-10-03 11:56:34 +0200
commit32aa276437f6128df63111af13e57fe8f0272af3 (patch)
tree58a65d9e86baba9db8ba38c66eea8bd0a7d8e3fd /arch/x86/power/hibernate.c
parentx86-32, hibernate: Use the page size macro instead of constant value (diff)
downloadlinux-32aa276437f6128df63111af13e57fe8f0272af3.tar.xz
linux-32aa276437f6128df63111af13e57fe8f0272af3.zip
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.c')
-rw-r--r--arch/x86/power/hibernate.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86/power/hibernate.c b/arch/x86/power/hibernate.c
index e3409e4a9b6a..4935b8139229 100644
--- a/arch/x86/power/hibernate.c
+++ b/arch/x86/power/hibernate.c
@@ -160,6 +160,7 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size)
#ifdef CONFIG_X86_64
rdr->jump_address = (unsigned long)restore_registers;
rdr->jump_address_phys = __pa_symbol(restore_registers);
+#endif
/*
* The restore code fixes up CR3 and CR4 in the following sequence:
@@ -179,7 +180,6 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size)
* have any of the PCID bits set.
*/
rdr->cr3 = restore_cr3 & ~CR3_PCID_MASK;
-#endif
return hibernation_e820_save(rdr->e820_digest);
}
@@ -201,8 +201,8 @@ int arch_hibernation_header_restore(void *addr)
#ifdef CONFIG_X86_64
restore_jump_address = rdr->jump_address;
jump_address_phys = rdr->jump_address_phys;
- restore_cr3 = rdr->cr3;
#endif
+ restore_cr3 = rdr->cr3;
if (hibernation_e820_mismatch(rdr->e820_digest)) {
pr_crit("Hibernate inconsistent memory map detected!\n");