1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*
* Check decoding of memfd_create syscall.
*
* Copyright (c) 2015-2018 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
#include <asm/unistd.h>
#include "scno.h"
#ifdef __NR_memfd_create
# include <stdio.h>
# include <stdint.h>
# include <unistd.h>
# ifdef HAVE_LINUX_MEMFD_H
# include <linux/memfd.h>
# endif
# ifndef MFD_HUGE_SHIFT
# define MFD_HUGE_SHIFT 26
# endif
# ifndef MFD_HUGE_MASK
# define MFD_HUGE_MASK 0x3f
# endif
static const char *errstr;
static long
k_memfd_create(const kernel_ulong_t name, const kernel_ulong_t flags)
{
const long rc = syscall(__NR_memfd_create, name, flags);
errstr = sprintrc(rc);
return rc;
}
int
main(void)
{
const size_t size = 255 - (sizeof("memfd:") - 1) + 1;
char *pattern = tail_alloc(size);
fill_memory_ex(pattern, size, '0', 10);
k_memfd_create((uintptr_t) pattern, 0);
printf("memfd_create(\"%.*s\"..., 0) = %s\n",
(int) size - 1, pattern, errstr);
kernel_ulong_t flags = (kernel_ulong_t) 0xfacefeed00000007ULL;
# define flags1_str "MFD_CLOEXEC|MFD_ALLOW_SEALING|MFD_HUGETLB"
k_memfd_create((uintptr_t) pattern, flags);
# if XLAT_VERBOSE
printf("memfd_create(\"%.*s\"..., %s /* %s */) = %s\n",
(int) size - 1, pattern,
"0x7", flags1_str, errstr);
# else
printf("memfd_create(\"%.*s\"..., %s) = %s\n",
(int) size - 1, pattern,
# if XLAT_RAW
"0x7",
# else
flags1_str,
# endif
errstr);
# endif
pattern[size - 1] = '\0';
flags = 30 << MFD_HUGE_SHIFT;
k_memfd_create((uintptr_t) pattern, flags);
# if XLAT_RAW
printf("memfd_create(\"%s\", %#x) = %s\n",
pattern, (unsigned int) flags, errstr);
# elif XLAT_VERBOSE
printf("memfd_create(\"%s\", %#x /* %s */) = %s\n",
pattern, (unsigned int) flags, "30<<MFD_HUGE_SHIFT", errstr);
# else /* XLAT_ABBREV */
printf("memfd_create(\"%s\", 30<<MFD_HUGE_SHIFT) = %s\n",
pattern, errstr);
# endif
pattern += size - 1;
flags = (kernel_ulong_t) -1ULL;
k_memfd_create(0, flags);
flags = -1U & ~(7 | (MFD_HUGE_MASK << MFD_HUGE_SHIFT));
# define memfd_create_fmt "%s|%#x|%u<<MFD_HUGE_SHIFT"
printf("memfd_create(NULL, "
# if XLAT_RAW
"0xffffffff) = %s\n",
# else
# if XLAT_VERBOSE
"0xffffffff /* " memfd_create_fmt " */"
# else /* XLAT_ABBREV */
memfd_create_fmt
# endif
") = %s\n",
flags1_str, (unsigned int) flags, MFD_HUGE_MASK,
# endif
errstr);
puts("+++ exited with 0 +++");
return 0;
}
#else
SKIP_MAIN_UNDEFINED("__NR_memfd_create")
#endif
|