diff options
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 75f1b109aae..0dcd42eb94e 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++; |
