diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-01-30 07:32:42 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:32:42 -0500 |
commit | 345b904c3f7c24fbfadfee7cddd5896d13b176d9 (patch) | |
tree | 4911361d43625a3d05e29149186ec286c3e5f1e7 | |
parent | 83a5101bf2fa7dcf09ffd436078a021d32c97f85 (diff) |
x86: page.h: unify page copying and clearing
# HG changeset patch
# User Jeremy Fitzhardinge <jeremy@xensource.com>
# Date 1199317362 28800
# Node ID 4d9a413a0f4c1d98dbea704f0366457b5117045d
# Parent ba0ec40a50a7aef1a3153cea124c35e261f5a2df
x86: page.h: unify page copying and clearing
Move, and to some extent unify, the various page copying and clearing
functions. The only unification here is that both architectures use
the same function for copying/clearing user and kernel pages.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/asm-x86/page.h | 55 | ||||
-rw-r--r-- | include/asm-x86/page_32.h | 53 | ||||
-rw-r--r-- | include/asm-x86/page_64.h | 20 |
3 files changed, 55 insertions, 73 deletions
diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h index e0fa4a032ea7..2ebb6977e00c 100644 --- a/include/asm-x86/page.h +++ b/include/asm-x86/page.h | |||
@@ -70,6 +70,11 @@ | |||
70 | #define KERNEL_TEXT_SIZE (40*1024*1024) | 70 | #define KERNEL_TEXT_SIZE (40*1024*1024) |
71 | #define KERNEL_TEXT_START _AC(0xffffffff80000000, UL) | 71 | #define KERNEL_TEXT_START _AC(0xffffffff80000000, UL) |
72 | 72 | ||
73 | #ifndef __ASSEMBLY__ | ||
74 | void clear_page(void *page); | ||
75 | void copy_page(void *to, void *from); | ||
76 | #endif /* !__ASSEMBLY__ */ | ||
77 | |||
73 | #endif /* CONFIG_X86_64 */ | 78 | #endif /* CONFIG_X86_64 */ |
74 | 79 | ||
75 | #ifdef CONFIG_X86_32 | 80 | #ifdef CONFIG_X86_32 |
@@ -98,6 +103,34 @@ | |||
98 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | 103 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA |
99 | #endif | 104 | #endif |
100 | 105 | ||
106 | #ifndef __ASSEMBLY__ | ||
107 | #ifdef CONFIG_X86_USE_3DNOW | ||
108 | #include <asm/mmx.h> | ||
109 | |||
110 | static inline void clear_page(void *page) | ||
111 | { | ||
112 | mmx_clear_page(page); | ||
113 | } | ||
114 | |||
115 | static inline void copy_page(void *to, void *from) | ||
116 | { | ||
117 | mmx_copy_page(to, from); | ||
118 | } | ||
119 | #else /* !CONFIG_X86_USE_3DNOW */ | ||
120 | #include <linux/string.h> | ||
121 | |||
122 | static inline void clear_page(void *page) | ||
123 | { | ||
124 | memset(page, 0, PAGE_SIZE); | ||
125 | } | ||
126 | |||
127 | static inline void copy_page(void *to, void *from) | ||
128 | { | ||
129 | memcpy(to, from, PAGE_SIZE); | ||
130 | } | ||
131 | #endif /* CONFIG_X86_3DNOW */ | ||
132 | #endif /* !__ASSEMBLY__ */ | ||
133 | |||
101 | #endif /* CONFIG_X86_32 */ | 134 | #endif /* CONFIG_X86_32 */ |
102 | 135 | ||
103 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) | 136 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) |
@@ -107,6 +140,28 @@ | |||
107 | VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | 140 | VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) |
108 | 141 | ||
109 | 142 | ||
143 | #ifndef __ASSEMBLY__ | ||
144 | struct page; | ||
145 | |||
146 | static void inline clear_user_page(void *page, unsigned long vaddr, | ||
147 | struct page *pg) | ||
148 | { | ||
149 | clear_page(page); | ||
150 | } | ||
151 | |||
152 | static void inline copy_user_page(void *to, void *from, unsigned long vaddr, | ||
153 | struct page *topage) | ||
154 | { | ||
155 | copy_page(to, from); | ||
156 | } | ||
157 | |||
158 | #define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \ | ||
159 | alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) | ||
160 | #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE | ||
161 | |||
162 | #endif /* __ASSEMBLY__ */ | ||
163 | |||
164 | |||
110 | #ifdef CONFIG_X86_32 | 165 | #ifdef CONFIG_X86_32 |
111 | # include "page_32.h" | 166 | # include "page_32.h" |
112 | #else | 167 | #else |
diff --git a/include/asm-x86/page_32.h b/include/asm-x86/page_32.h index 69e520059b26..b4750ef44920 100644 --- a/include/asm-x86/page_32.h +++ b/include/asm-x86/page_32.h | |||
@@ -4,59 +4,6 @@ | |||
4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
5 | #ifndef __ASSEMBLY__ | 5 | #ifndef __ASSEMBLY__ |
6 | 6 | ||
7 | #include <linux/string.h> | ||
8 | |||
9 | #ifdef CONFIG_X86_USE_3DNOW | ||
10 | |||
11 | #include <asm/mmx.h> | ||
12 | |||
13 | static inline void clear_page(void *page) | ||
14 | { | ||
15 | mmx_clear_page(page); | ||
16 | } | ||
17 | |||
18 | static inline void copy_page(void *to, void *from) | ||
19 | { | ||
20 | mmx_copy_page(to, from); | ||
21 | } | ||
22 | |||
23 | #else | ||
24 | |||
25 | /* | ||
26 | * On older X86 processors it's not a win to use MMX here it seems. | ||
27 | * Maybe the K6-III ? | ||
28 | */ | ||
29 | |||
30 | static inline void clear_page(void *page) | ||
31 | { | ||
32 | memset(page, 0, PAGE_SIZE); | ||
33 | } | ||
34 | |||
35 | static inline void copy_page(void *to, void *from) | ||
36 | { | ||
37 | memcpy(to, from, PAGE_SIZE); | ||
38 | } | ||
39 | |||
40 | #endif | ||
41 | |||
42 | struct page; | ||
43 | |||
44 | static void inline clear_user_page(void *page, unsigned long vaddr, | ||
45 | struct page *pg) | ||
46 | { | ||
47 | clear_page(page); | ||
48 | } | ||
49 | |||
50 | static void inline copy_user_page(void *to, void *from, unsigned long vaddr, | ||
51 | struct page *topage) | ||
52 | { | ||
53 | copy_page(to, from); | ||
54 | } | ||
55 | |||
56 | #define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \ | ||
57 | alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) | ||
58 | #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE | ||
59 | |||
60 | /* | 7 | /* |
61 | * These are used to make use of C type-checking.. | 8 | * These are used to make use of C type-checking.. |
62 | */ | 9 | */ |
diff --git a/include/asm-x86/page_64.h b/include/asm-x86/page_64.h index 69ef7cf9dadd..f5e0543b8afa 100644 --- a/include/asm-x86/page_64.h +++ b/include/asm-x86/page_64.h | |||
@@ -7,26 +7,6 @@ | |||
7 | extern unsigned long end_pfn; | 7 | extern unsigned long end_pfn; |
8 | extern unsigned long end_pfn_map; | 8 | extern unsigned long end_pfn_map; |
9 | 9 | ||
10 | void clear_page(void *page); | ||
11 | void copy_page(void *to, void *from); | ||
12 | |||
13 | struct page; | ||
14 | |||
15 | static void inline clear_user_page(void *page, unsigned long vaddr, | ||
16 | struct page *pg) | ||
17 | { | ||
18 | clear_page(page); | ||
19 | } | ||
20 | |||
21 | static void inline copy_user_page(void *to, void *from, unsigned long vaddr, | ||
22 | struct page *topage) | ||
23 | { | ||
24 | copy_page(to, from); | ||
25 | } | ||
26 | |||
27 | #define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \ | ||
28 | alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) | ||
29 | #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE | ||
30 | /* | 10 | /* |
31 | * These are used to make use of C type-checking.. | 11 | * These are used to make use of C type-checking.. |
32 | */ | 12 | */ |