diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-07-01 19:46:37 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-08 07:16:30 -0400 |
commit | 5a654ba7a88d90483d0f0586297ea9075d755fc8 (patch) | |
tree | d3832d3d7ba02dd7f39f125536d754fcb2ea0b83 /arch/x86/mm/pageattr-test.c | |
parent | ef5e94af16c0c82452e1ea5d387e1203dd2198d6 (diff) |
x86/cpa: use an undefined PTE bit for testing CPA
Rather than using _PAGE_GLOBAL - which not all CPUs support - to test
CPA, use one of the reserved-for-software-use PTE flags instead. This
allows CPA testing to work on CPUs which don't support PGD.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Stephen Tweedie <sct@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm/pageattr-test.c')
-rw-r--r-- | arch/x86/mm/pageattr-test.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c index 75f1b109aae8..0dcd42eb94e6 100644 --- a/arch/x86/mm/pageattr-test.c +++ b/arch/x86/mm/pageattr-test.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * self test for change_page_attr. | 2 | * self test for change_page_attr. |
3 | * | 3 | * |
4 | * Clears the global bit on random pages in the direct mapping, then reverts | 4 | * Clears the a test pte bit on random pages in the direct mapping, |
5 | * and compares page tables forwards and afterwards. | 5 | * then reverts and compares page tables forwards and afterwards. |
6 | */ | 6 | */ |
7 | #include <linux/bootmem.h> | 7 | #include <linux/bootmem.h> |
8 | #include <linux/kthread.h> | 8 | #include <linux/kthread.h> |
@@ -32,6 +32,13 @@ enum { | |||
32 | GPS = (1<<30) | 32 | GPS = (1<<30) |
33 | }; | 33 | }; |
34 | 34 | ||
35 | #define PAGE_TESTBIT __pgprot(_PAGE_UNUSED1) | ||
36 | |||
37 | static int pte_testbit(pte_t pte) | ||
38 | { | ||
39 | return pte_flags(pte) & _PAGE_UNUSED1; | ||
40 | } | ||
41 | |||
35 | struct split_state { | 42 | struct split_state { |
36 | long lpg, gpg, spg, exec; | 43 | long lpg, gpg, spg, exec; |
37 | long min_exec, max_exec; | 44 | long min_exec, max_exec; |
@@ -165,15 +172,14 @@ static int pageattr_test(void) | |||
165 | continue; | 172 | continue; |
166 | } | 173 | } |
167 | 174 | ||
168 | err = change_page_attr_clear(addr[i], len[i], | 175 | err = change_page_attr_set(addr[i], len[i], PAGE_TESTBIT); |
169 | __pgprot(_PAGE_GLOBAL)); | ||
170 | if (err < 0) { | 176 | if (err < 0) { |
171 | printk(KERN_ERR "CPA %d failed %d\n", i, err); | 177 | printk(KERN_ERR "CPA %d failed %d\n", i, err); |
172 | failed++; | 178 | failed++; |
173 | } | 179 | } |
174 | 180 | ||
175 | pte = lookup_address(addr[i], &level); | 181 | pte = lookup_address(addr[i], &level); |
176 | if (!pte || pte_global(*pte) || pte_huge(*pte)) { | 182 | if (!pte || !pte_testbit(*pte) || pte_huge(*pte)) { |
177 | printk(KERN_ERR "CPA %lx: bad pte %Lx\n", addr[i], | 183 | printk(KERN_ERR "CPA %lx: bad pte %Lx\n", addr[i], |
178 | pte ? (u64)pte_val(*pte) : 0ULL); | 184 | pte ? (u64)pte_val(*pte) : 0ULL); |
179 | failed++; | 185 | failed++; |
@@ -198,14 +204,13 @@ static int pageattr_test(void) | |||
198 | failed++; | 204 | failed++; |
199 | continue; | 205 | continue; |
200 | } | 206 | } |
201 | err = change_page_attr_set(addr[i], len[i], | 207 | err = change_page_attr_clear(addr[i], len[i], PAGE_TESTBIT); |
202 | __pgprot(_PAGE_GLOBAL)); | ||
203 | if (err < 0) { | 208 | if (err < 0) { |
204 | printk(KERN_ERR "CPA reverting failed: %d\n", err); | 209 | printk(KERN_ERR "CPA reverting failed: %d\n", err); |
205 | failed++; | 210 | failed++; |
206 | } | 211 | } |
207 | pte = lookup_address(addr[i], &level); | 212 | pte = lookup_address(addr[i], &level); |
208 | if (!pte || !pte_global(*pte)) { | 213 | if (!pte || pte_testbit(*pte)) { |
209 | printk(KERN_ERR "CPA %lx: bad pte after revert %Lx\n", | 214 | printk(KERN_ERR "CPA %lx: bad pte after revert %Lx\n", |
210 | addr[i], pte ? (u64)pte_val(*pte) : 0ULL); | 215 | addr[i], pte ? (u64)pte_val(*pte) : 0ULL); |
211 | failed++; | 216 | failed++; |