Commit 49c3df6aaa6a51071fc135273d1a2515d019099f
Committed by
Andi Kleen
1 parent
cfd243d4af
Exists in
master
and in
7 other branches
[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 | * |