1 /*
2 * Check decoding of pkey_alloc syscall.
3 *
4 * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
5 * Copyright (c) 2016-2021 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include "scno.h"
13
14 #include <stdio.h>
15 #include <unistd.h>
16
17 int
18 main(void)
19 {
20 static const kernel_ulong_t flags[] = {
21 0,
22 (kernel_ulong_t) 0xbadc0ded00000000ULL,
23 (kernel_ulong_t) 0xffff0000eeee1111ULL,
24 (kernel_ulong_t) 0x123456789abcdef0ULL,
25 };
26 static const struct {
27 kernel_ulong_t val;
28 const char *str;
29 } rights[] = {
30 { (kernel_ulong_t) 0xbadc0ded00000002ULL,
31 sizeof(kernel_ulong_t) > sizeof(int) ?
32 "PKEY_DISABLE_WRITE|0xbadc0ded00000000" :
33 "PKEY_DISABLE_WRITE" },
34 { 0xdec0ded, "PKEY_DISABLE_ACCESS|PKEY_DISABLE_EXECUTE|"
35 "0xdec0de8" },
36 { 0x7, "PKEY_DISABLE_ACCESS|PKEY_DISABLE_WRITE|"
37 "PKEY_DISABLE_EXECUTE" },
38 { ARG_STR(0) },
39 { 0xbadc0de8, "0xbadc0de8 /* PKEY_??? */" },
40 };
41
42 for (unsigned int i = 0; i < ARRAY_SIZE(flags); ++i) {
43 for (unsigned int j = 0; j < ARRAY_SIZE(rights); ++j) {
44 long rc = syscall(__NR_pkey_alloc,
45 flags[i], rights[j].val);
46 printf("pkey_alloc(%#llx, %s) = %s\n",
47 (unsigned long long) flags[i], rights[j].str,
48 sprintrc(rc));
49 }
50 }
51
52 puts("+++ exited with 0 +++");
53
54 return 0;
55 }