diff options
| author | Dave Hansen <dave.hansen@linux.intel.com> | 2018-05-09 13:13:56 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2018-05-14 05:14:45 -0400 |
| commit | 3488a600d90bcaf061b104dbcfbdc8d99b398312 (patch) | |
| tree | c56c21499e9a180a2ffde5a37bcb9179a78c6d5e | |
| parent | acb25d761d6f2f64e785ccefc71e54f244f1eda4 (diff) | |
x86/pkeys/selftests: Add a test for pkey 0
Protection key 0 is the default key for all memory and will
not normally come back from pkey_alloc(). But, you might
still want pass it to mprotect_pkey().
This check ensures that you can use pkey 0.
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michael Ellermen <mpe@ellerman.id.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ram Pai <linuxram@us.ibm.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/20180509171356.9E40B254@viggo.jf.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
| -rw-r--r-- | tools/testing/selftests/x86/protection_keys.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c index 986ed38a2b25..460b4bdf4c1e 100644 --- a/tools/testing/selftests/x86/protection_keys.c +++ b/tools/testing/selftests/x86/protection_keys.c | |||
| @@ -1184,6 +1184,35 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey) | |||
| 1184 | } | 1184 | } |
| 1185 | } | 1185 | } |
| 1186 | 1186 | ||
| 1187 | /* | ||
| 1188 | * pkey 0 is special. It is allocated by default, so you do not | ||
| 1189 | * have to call pkey_alloc() to use it first. Make sure that it | ||
| 1190 | * is usable. | ||
| 1191 | */ | ||
| 1192 | void test_mprotect_with_pkey_0(int *ptr, u16 pkey) | ||
| 1193 | { | ||
| 1194 | long size; | ||
| 1195 | int prot; | ||
| 1196 | |||
| 1197 | assert(pkey_last_malloc_record); | ||
| 1198 | size = pkey_last_malloc_record->size; | ||
| 1199 | /* | ||
| 1200 | * This is a bit of a hack. But mprotect() requires | ||
| 1201 | * huge-page-aligned sizes when operating on hugetlbfs. | ||
| 1202 | * So, make sure that we use something that's a multiple | ||
| 1203 | * of a huge page when we can. | ||
| 1204 | */ | ||
| 1205 | if (size >= HPAGE_SIZE) | ||
| 1206 | size = HPAGE_SIZE; | ||
| 1207 | prot = pkey_last_malloc_record->prot; | ||
| 1208 | |||
| 1209 | /* Use pkey 0 */ | ||
| 1210 | mprotect_pkey(ptr, size, prot, 0); | ||
| 1211 | |||
| 1212 | /* Make sure that we can set it back to the original pkey. */ | ||
| 1213 | mprotect_pkey(ptr, size, prot, pkey); | ||
| 1214 | } | ||
| 1215 | |||
| 1187 | void test_ptrace_of_child(int *ptr, u16 pkey) | 1216 | void test_ptrace_of_child(int *ptr, u16 pkey) |
| 1188 | { | 1217 | { |
| 1189 | __attribute__((__unused__)) int peek_result; | 1218 | __attribute__((__unused__)) int peek_result; |
| @@ -1378,6 +1407,7 @@ void (*pkey_tests[])(int *ptr, u16 pkey) = { | |||
| 1378 | test_kernel_gup_write_to_write_disabled_region, | 1407 | test_kernel_gup_write_to_write_disabled_region, |
| 1379 | test_executing_on_unreadable_memory, | 1408 | test_executing_on_unreadable_memory, |
| 1380 | test_implicit_mprotect_exec_only_memory, | 1409 | test_implicit_mprotect_exec_only_memory, |
| 1410 | test_mprotect_with_pkey_0, | ||
| 1381 | test_ptrace_of_child, | 1411 | test_ptrace_of_child, |
| 1382 | test_pkey_syscalls_on_non_allocated_pkey, | 1412 | test_pkey_syscalls_on_non_allocated_pkey, |
| 1383 | test_pkey_syscalls_bad_args, | 1413 | test_pkey_syscalls_bad_args, |
