[PATCH lucid] UBUNTU: SAUCE: dove: avoid page table overwrite when resuming from hibernation

Eric Miao eric.miao at canonical.com
Fri Apr 23 07:14:01 UTC 2010


BTW, this may apply to other ARM variants as well, but the hibernation
feature should really be made common first of all in that sense.

commit 1f3ebd28c0e8adf7f7a1fc85377a57d8dbc56267
Author: Eric Miao <eric.miao at canonical.com>
Date:   Fri Apr 23 14:16:17 2010 +0800

    UBUNTU: SAUCE: dove: avoid page table overwrite when resuming from
hibernation

    BugLink: http://bugs.launchpad.net/bugs/509006

    Resuming from hibernation is OK if 'resume=/dev/sdaX' is explicitly
    specified on the kernel command line, but it fails if scripts in
    initramfs are used to trigger the resume. It turned out to be page
    table being overwritten when restoring the memory content because
    it's using a normal user process's page table in the latter case,
    which is not safe and could be overwritten. Fix this by using the
    safe swapper_pg_dir during restoring.

    Signed-off-by: Eric Miao <eric.miao at canonical.com>

diff --git a/arch/arm/mach-dove/Makefile b/arch/arm/mach-dove/Makefile
index 0be1e1c..c5c028f 100755
--- a/arch/arm/mach-dove/Makefile
+++ b/arch/arm/mach-dove/Makefile
@@ -1,3 +1,5 @@
+AFLAGS_swsusp.o			:= -DTEXT_OFFSET=$(TEXT_OFFSET)
+
 obj-y				+= clock.o common.o addr-map.o irq.o pcie.o mpp.o \
 				sdhci_cam_mbus.o
 obj-$(CONFIG_MACH_DOVE_RD_AVNG)	+= dove-rd-avng-setup.o
diff --git a/arch/arm/mach-dove/swsusp.S b/arch/arm/mach-dove/swsusp.S
index 4f4a884..8e308d8 100644
--- a/arch/arm/mach-dove/swsusp.S
+++ b/arch/arm/mach-dove/swsusp.S
@@ -28,6 +28,7 @@
  */

 #include <linux/linkage.h>
+#include <asm/memory.h>
 #include <asm/segment.h>
 #include <asm/page.h>
 #include <asm/asm-offsets.h>
@@ -209,8 +210,14 @@ FUNC(swsusp_arch_suspend)

 FUNC_END(swsusp_arch_suspend)

+#define KERNEL_RAM_PADDR	(PHYS_OFFSET + TEXT_OFFSET)
+
 FUNC(swsusp_arch_resume)
 	/* set page table if needed */
+	ldr	r0, =(KERNEL_RAM_PADDR - 0x4000)
+	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
+	mcr	p15, 0, r0, c8, c7, 0		@ invalidate I,D TLBs
+	mcr	p15, 0, r0, c7, c5, 4		@ ISB

 	/*
 	 * retore "nr_copy_pages" pages which are saved and specified




More information about the kernel-team mailing list