|
@@ -1303,6 +1303,49 @@ void test_executing_on_unreadable_memory(int *ptr, u16 pkey)
|
|
|
expected_pk_fault(pkey);
|
|
|
}
|
|
|
|
|
|
+void test_implicit_mprotect_exec_only_memory(int *ptr, u16 pkey)
|
|
|
+{
|
|
|
+ void *p1;
|
|
|
+ int scratch;
|
|
|
+ int ptr_contents;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ dprintf1("%s() start\n", __func__);
|
|
|
+
|
|
|
+ p1 = get_pointer_to_instructions();
|
|
|
+ lots_o_noops_around_write(&scratch);
|
|
|
+ ptr_contents = read_ptr(p1);
|
|
|
+ dprintf2("ptr (%p) contents@%d: %x\n", p1, __LINE__, ptr_contents);
|
|
|
+
|
|
|
+ /* Use a *normal* mprotect(), not mprotect_pkey(): */
|
|
|
+ ret = mprotect(p1, PAGE_SIZE, PROT_EXEC);
|
|
|
+ pkey_assert(!ret);
|
|
|
+
|
|
|
+ dprintf2("pkru: %x\n", rdpkru());
|
|
|
+
|
|
|
+ /* Make sure this is an *instruction* fault */
|
|
|
+ madvise(p1, PAGE_SIZE, MADV_DONTNEED);
|
|
|
+ lots_o_noops_around_write(&scratch);
|
|
|
+ do_not_expect_pk_fault("executing on PROT_EXEC memory");
|
|
|
+ ptr_contents = read_ptr(p1);
|
|
|
+ dprintf2("ptr (%p) contents@%d: %x\n", p1, __LINE__, ptr_contents);
|
|
|
+ expected_pk_fault(UNKNOWN_PKEY);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Put the memory back to non-PROT_EXEC. Should clear the
|
|
|
+ * exec-only pkey off the VMA and allow it to be readable
|
|
|
+ * again. Go to PROT_NONE first to check for a kernel bug
|
|
|
+ * that did not clear the pkey when doing PROT_NONE.
|
|
|
+ */
|
|
|
+ ret = mprotect(p1, PAGE_SIZE, PROT_NONE);
|
|
|
+ pkey_assert(!ret);
|
|
|
+
|
|
|
+ ret = mprotect(p1, PAGE_SIZE, PROT_READ|PROT_EXEC);
|
|
|
+ pkey_assert(!ret);
|
|
|
+ ptr_contents = read_ptr(p1);
|
|
|
+ do_not_expect_pk_fault("plain read on recently PROT_EXEC area");
|
|
|
+}
|
|
|
+
|
|
|
void test_mprotect_pkey_on_unsupported_cpu(int *ptr, u16 pkey)
|
|
|
{
|
|
|
int size = PAGE_SIZE;
|
|
@@ -1327,6 +1370,7 @@ void (*pkey_tests[])(int *ptr, u16 pkey) = {
|
|
|
test_kernel_gup_of_access_disabled_region,
|
|
|
test_kernel_gup_write_to_write_disabled_region,
|
|
|
test_executing_on_unreadable_memory,
|
|
|
+ test_implicit_mprotect_exec_only_memory,
|
|
|
test_ptrace_of_child,
|
|
|
test_pkey_syscalls_on_non_allocated_pkey,
|
|
|
test_pkey_syscalls_bad_args,
|