| From cf53a7e7c34c226db5d789ddea7ade2018bab9f0 Mon Sep 17 00:00:00 2001 |
| From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> |
| Date: Thu, 9 Jul 2020 08:59:44 +0530 |
| Subject: [PATCH] selftests/powerpc: ptrace-pkey: Update the test to mark an |
| invalid pkey correctly |
| |
| commit 0eaa3b5ca7b5a76e3783639c828498343be66a01 upstream. |
| |
| Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20200709032946.881753-22-aneesh.kumar@linux.ibm.com |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/testing/selftests/powerpc/ptrace/ptrace-pkey.c b/tools/testing/selftests/powerpc/ptrace/ptrace-pkey.c |
| index f9216c7a1829..bc33d748d95b 100644 |
| --- a/tools/testing/selftests/powerpc/ptrace/ptrace-pkey.c |
| +++ b/tools/testing/selftests/powerpc/ptrace/ptrace-pkey.c |
| @@ -66,11 +66,6 @@ static int sys_pkey_alloc(unsigned long flags, unsigned long init_access_rights) |
| return syscall(__NR_pkey_alloc, flags, init_access_rights); |
| } |
| |
| -static int sys_pkey_free(int pkey) |
| -{ |
| - return syscall(__NR_pkey_free, pkey); |
| -} |
| - |
| static int child(struct shared_info *info) |
| { |
| unsigned long reg; |
| @@ -100,7 +95,11 @@ static int child(struct shared_info *info) |
| |
| info->amr1 |= 3ul << pkeyshift(pkey1); |
| info->amr2 |= 3ul << pkeyshift(pkey2); |
| - info->invalid_amr |= info->amr2 | 3ul << pkeyshift(pkey3); |
| + /* |
| + * invalid amr value where we try to force write |
| + * things which are deined by a uamor setting. |
| + */ |
| + info->invalid_amr = info->amr2 | (~0x0UL & ~info->expected_uamor); |
| |
| if (disable_execute) |
| info->expected_iamr |= 1ul << pkeyshift(pkey1); |
| @@ -111,17 +110,12 @@ static int child(struct shared_info *info) |
| |
| info->expected_uamor |= 3ul << pkeyshift(pkey1) | |
| 3ul << pkeyshift(pkey2); |
| - info->invalid_iamr |= 1ul << pkeyshift(pkey1) | 1ul << pkeyshift(pkey2); |
| - info->invalid_uamor |= 3ul << pkeyshift(pkey1); |
| - |
| /* |
| - * We won't use pkey3. We just want a plausible but invalid key to test |
| - * whether ptrace will let us write to AMR bits we are not supposed to. |
| - * |
| - * This also tests whether the kernel restores the UAMOR permissions |
| - * after a key is freed. |
| + * Create an IAMR value different from expected value. |
| + * Kernel will reject an IAMR and UAMOR change. |
| */ |
| - sys_pkey_free(pkey3); |
| + info->invalid_iamr = info->expected_iamr | (1ul << pkeyshift(pkey1) | 1ul << pkeyshift(pkey2)); |
| + info->invalid_uamor = info->expected_uamor & ~(0x3ul << pkeyshift(pkey1)); |
| |
| printf("%-30s AMR: %016lx pkey1: %d pkey2: %d pkey3: %d\n", |
| user_write, info->amr1, pkey1, pkey2, pkey3); |
| @@ -196,9 +190,9 @@ static int parent(struct shared_info *info, pid_t pid) |
| PARENT_SKIP_IF_UNSUPPORTED(ret, &info->child_sync); |
| PARENT_FAIL_IF(ret, &info->child_sync); |
| |
| - info->amr1 = info->amr2 = info->invalid_amr = regs[0]; |
| - info->expected_iamr = info->invalid_iamr = regs[1]; |
| - info->expected_uamor = info->invalid_uamor = regs[2]; |
| + info->amr1 = info->amr2 = regs[0]; |
| + info->expected_iamr = regs[1]; |
| + info->expected_uamor = regs[2]; |
| |
| /* Wake up child so that it can set itself up. */ |
| ret = prod_child(&info->child_sync); |
| -- |
| 2.27.0 |
| |