1 /*
2 * Check decoding of memfd_create syscall.
3 *
4 * Copyright (c) 2015-2018 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2015-2023 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 <stdint.h>
16 #include <unistd.h>
17 #include <linux/memfd.h>
18
19 static const char *errstr;
20
21 static long
22 k_memfd_create(const kernel_ulong_t name, const kernel_ulong_t flags)
23 {
24 const long rc = syscall(__NR_memfd_create, name, flags);
25 errstr = sprintrc(rc);
26 return rc;
27 }
28
29 int
30 main(void)
31 {
32 const size_t size = 255 - (sizeof("memfd:") - 1) + 1;
33 char *pattern = tail_alloc(size);
34 fill_memory_ex(pattern, size, '0', 10);
35
36 k_memfd_create((uintptr_t) pattern, 0);
37 printf("memfd_create(\"%.*s\"..., 0) = %s\n",
38 (int) size, pattern, errstr);
39
40 kernel_ulong_t flags = (kernel_ulong_t) 0xfacefeed0000001fULL;
41 #define flags1_str \
42 "MFD_CLOEXEC|MFD_ALLOW_SEALING|MFD_HUGETLB|MFD_NOEXEC_SEAL|MFD_EXEC"
43
44 k_memfd_create((uintptr_t) pattern, flags);
45 #if XLAT_VERBOSE
46 printf("memfd_create(\"%.*s\"..., %s /* %s */) = %s\n",
47 (int) size, pattern,
48 "0x1f", flags1_str, errstr);
49 #else
50 printf("memfd_create(\"%.*s\"..., %s) = %s\n",
51 (int) size, pattern,
52 # if XLAT_RAW
53 "0x1f",
54 # else
55 flags1_str,
56 # endif
57 errstr);
58 #endif
59
60 pattern[size - 1] = '\0';
61 flags = 30 << MFD_HUGE_SHIFT;
62 k_memfd_create((uintptr_t) pattern, flags);
63 #if XLAT_RAW
64 printf("memfd_create(\"%s\", %#x) = %s\n",
65 pattern, (unsigned int) flags, errstr);
66 #elif XLAT_VERBOSE
67 printf("memfd_create(\"%s\", %#x /* %s */) = %s\n",
68 pattern, (unsigned int) flags, "30<<MFD_HUGE_SHIFT", errstr);
69 #else /* XLAT_ABBREV */
70 printf("memfd_create(\"%s\", 30<<MFD_HUGE_SHIFT) = %s\n",
71 pattern, errstr);
72 #endif
73
74 flags = (kernel_ulong_t) -1ULL;
75 k_memfd_create(0, flags);
76 flags = -1U & ~(0x1f | (MFD_HUGE_MASK << MFD_HUGE_SHIFT));
77
78 #define memfd_create_fmt "%s|%#x|%u<<MFD_HUGE_SHIFT"
79
80 printf("memfd_create(NULL, "
81 #if XLAT_RAW
82 "0xffffffff) = %s\n",
83 #else
84 # if XLAT_VERBOSE
85 "0xffffffff /* " memfd_create_fmt " */"
86 # else /* XLAT_ABBREV */
87 memfd_create_fmt
88 # endif
89 ") = %s\n",
90 flags1_str, (unsigned int) flags, MFD_HUGE_MASK,
91 #endif
92 errstr);
93
94 puts("+++ exited with 0 +++");
95 return 0;
96 }