Commit 49c3df6aaa6a51071fc135273d1a2515d019099f

Authored by Vivek Goyal
Committed by Andi Kleen
1 parent cfd243d4af

[PATCH] x86: Move swsusp __pa() dependent code to arch portion

o __pa() should be used only on kernel linearly mapped virtual addresses
  and not on kernel text and data addresses.

o Hibernation code needs to determine the physical address associated
  with kernel symbol to mark a section boundary which contains pages which
  don't have to be saved and restored during hibernate/resume operation.

o Move this piece of code in arch dependent section. So that architectures
  which don't have kernel text/data mapped into kernel linearly mapped
  region can come up with their own ways of determining physical addresses
  associated with a kernel text.

Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andi Kleen <ak@suse.de>

Showing 6 changed files with 55 additions and 14 deletions Side-by-side Diff

arch/i386/power/suspend.c
... ... @@ -16,6 +16,9 @@
16 16 /* Defined in arch/i386/power/swsusp.S */
17 17 extern int restore_image(void);
18 18  
  19 +/* References to section boundaries */
  20 +extern const void __nosave_begin, __nosave_end;
  21 +
19 22 /* Pointer to the temporary resume page tables */
20 23 pgd_t *resume_pg_dir;
21 24  
... ... @@ -155,5 +158,16 @@
155 158 /* We have got enough memory and from now on we cannot recover */
156 159 restore_image();
157 160 return 0;
  161 +}
  162 +
  163 +/*
  164 + * pfn_is_nosave - check if given pfn is in the 'nosave' section
  165 + */
  166 +
  167 +int pfn_is_nosave(unsigned long pfn)
  168 +{
  169 + unsigned long nosave_begin_pfn = __pa_symbol(&__nosave_begin) >> PAGE_SHIFT;
  170 + unsigned long nosave_end_pfn = PAGE_ALIGN(__pa_symbol(&__nosave_end)) >> PAGE_SHIFT;
  171 + return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
158 172 }
arch/powerpc/kernel/Makefile
... ... @@ -37,6 +37,7 @@
37 37 obj-$(CONFIG_6xx) += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o
38 38 obj-$(CONFIG_TAU) += tau_6xx.o
39 39 obj32-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_32.o
  40 +obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
40 41 obj32-$(CONFIG_MODULES) += module_32.o
41 42  
42 43 ifeq ($(CONFIG_PPC_MERGE),y)
arch/powerpc/kernel/suspend.c
  1 +/*
  2 + * Suspend support specific for power.
  3 + *
  4 + * Distribute under GPLv2
  5 + *
  6 + * Copyright (c) 2002 Pavel Machek <pavel@suse.cz>
  7 + * Copyright (c) 2001 Patrick Mochel <mochel@osdl.org>
  8 + */
  9 +
  10 +#include <asm/page.h>
  11 +
  12 +/* References to section boundaries */
  13 +extern const void __nosave_begin, __nosave_end;
  14 +
  15 +/*
  16 + * pfn_is_nosave - check if given pfn is in the 'nosave' section
  17 + */
  18 +
  19 +int pfn_is_nosave(unsigned long pfn)
  20 +{
  21 + unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
  22 + unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT;
  23 + return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
  24 +}
arch/x86_64/kernel/suspend.c
... ... @@ -13,6 +13,9 @@
13 13 #include <asm/page.h>
14 14 #include <asm/pgtable.h>
15 15  
  16 +/* References to section boundaries */
  17 +extern const void __nosave_begin, __nosave_end;
  18 +
16 19 struct saved_context saved_context;
17 20  
18 21 unsigned long saved_context_eax, saved_context_ebx, saved_context_ecx, saved_context_edx;
... ... @@ -219,6 +222,17 @@
219 222 return error;
220 223 restore_image();
221 224 return 0;
  225 +}
  226 +
  227 +/*
  228 + * pfn_is_nosave - check if given pfn is in the 'nosave' section
  229 + */
  230 +
  231 +int pfn_is_nosave(unsigned long pfn)
  232 +{
  233 + unsigned long nosave_begin_pfn = __pa_symbol(&__nosave_begin) >> PAGE_SHIFT;
  234 + unsigned long nosave_end_pfn = PAGE_ALIGN(__pa_symbol(&__nosave_end)) >> PAGE_SHIFT;
  235 + return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
222 236 }
223 237 #endif /* CONFIG_SOFTWARE_SUSPEND */
kernel/power/power.h
... ... @@ -23,6 +23,8 @@
23 23 }
24 24 #endif
25 25  
  26 +extern int pfn_is_nosave(unsigned long);
  27 +
26 28 extern struct mutex pm_mutex;
27 29  
28 30 #define power_attr(_name) \
... ... @@ -36,9 +38,6 @@
36 38 }
37 39  
38 40 extern struct subsystem power_subsys;
39   -
40   -/* References to section boundaries */
41   -extern const void __nosave_begin, __nosave_end;
42 41  
43 42 /* Preferred image size in bytes (default 500 MB) */
44 43 extern unsigned long image_size;
kernel/power/snapshot.c
... ... @@ -651,17 +651,6 @@
651 651 #endif /* CONFIG_HIGHMEM */
652 652  
653 653 /**
654   - * pfn_is_nosave - check if given pfn is in the 'nosave' section
655   - */
656   -
657   -static inline int pfn_is_nosave(unsigned long pfn)
658   -{
659   - unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
660   - unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT;
661   - return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
662   -}
663   -
664   -/**
665 654 * saveable - Determine whether a non-highmem page should be included in
666 655 * the suspend image.
667 656 *