aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Hansen <dave.hansen@linux.intel.com>2018-05-09 13:13:56 -0400
committerIngo Molnar <mingo@kernel.org>2018-05-14 05:14:45 -0400
commit3488a600d90bcaf061b104dbcfbdc8d99b398312 (patch)
treec56c21499e9a180a2ffde5a37bcb9179a78c6d5e
parentacb25d761d6f2f64e785ccefc71e54f244f1eda4 (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.c30
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 */
1192void 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
1187void test_ptrace_of_child(int *ptr, u16 pkey) 1216void 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,