1
2
3
4
5
6
7
8
9#ifndef _LINUX_USERFAULTFD_H
10#define _LINUX_USERFAULTFD_H
11
12#include <linux/types.h>
13
14
15
16
17
18
19
20#define UFFD_API ((__u64)0xAA)
21#define UFFD_API_FEATURES (UFFD_FEATURE_EVENT_FORK | \
22 UFFD_FEATURE_EVENT_REMAP | \
23 UFFD_FEATURE_EVENT_REMOVE | \
24 UFFD_FEATURE_EVENT_UNMAP | \
25 UFFD_FEATURE_MISSING_HUGETLBFS | \
26 UFFD_FEATURE_MISSING_SHMEM)
27#define UFFD_API_IOCTLS \
28 ((__u64)1 << _UFFDIO_REGISTER | \
29 (__u64)1 << _UFFDIO_UNREGISTER | \
30 (__u64)1 << _UFFDIO_API)
31#define UFFD_API_RANGE_IOCTLS \
32 ((__u64)1 << _UFFDIO_WAKE | \
33 (__u64)1 << _UFFDIO_COPY | \
34 (__u64)1 << _UFFDIO_ZEROPAGE)
35#define UFFD_API_RANGE_IOCTLS_BASIC \
36 ((__u64)1 << _UFFDIO_WAKE | \
37 (__u64)1 << _UFFDIO_COPY)
38
39
40
41
42
43
44
45
46
47#define _UFFDIO_REGISTER (0x00)
48#define _UFFDIO_UNREGISTER (0x01)
49#define _UFFDIO_WAKE (0x02)
50#define _UFFDIO_COPY (0x03)
51#define _UFFDIO_ZEROPAGE (0x04)
52#define _UFFDIO_API (0x3F)
53
54
55#define UFFDIO 0xAA
56#define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \
57 struct uffdio_api)
58#define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \
59 struct uffdio_register)
60#define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \
61 struct uffdio_range)
62#define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \
63 struct uffdio_range)
64#define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, \
65 struct uffdio_copy)
66#define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \
67 struct uffdio_zeropage)
68
69
70struct uffd_msg {
71 __u8 event;
72
73 __u8 reserved1;
74 __u16 reserved2;
75 __u32 reserved3;
76
77 union {
78 struct {
79 __u64 flags;
80 __u64 address;
81 } pagefault;
82
83 struct {
84 __u32 ufd;
85 } fork;
86
87 struct {
88 __u64 from;
89 __u64 to;
90 __u64 len;
91 } remap;
92
93 struct {
94 __u64 start;
95 __u64 end;
96 } remove;
97
98 struct {
99
100 __u64 reserved1;
101 __u64 reserved2;
102 __u64 reserved3;
103 } reserved;
104 } arg;
105} __attribute__((packed));
106
107
108
109
110#define UFFD_EVENT_PAGEFAULT 0x12
111#define UFFD_EVENT_FORK 0x13
112#define UFFD_EVENT_REMAP 0x14
113#define UFFD_EVENT_REMOVE 0x15
114#define UFFD_EVENT_UNMAP 0x16
115
116
117#define UFFD_PAGEFAULT_FLAG_WRITE (1<<0)
118#define UFFD_PAGEFAULT_FLAG_WP (1<<1)
119
120struct uffdio_api {
121
122 __u64 api;
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157#define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0)
158#define UFFD_FEATURE_EVENT_FORK (1<<1)
159#define UFFD_FEATURE_EVENT_REMAP (1<<2)
160#define UFFD_FEATURE_EVENT_REMOVE (1<<3)
161#define UFFD_FEATURE_MISSING_HUGETLBFS (1<<4)
162#define UFFD_FEATURE_MISSING_SHMEM (1<<5)
163#define UFFD_FEATURE_EVENT_UNMAP (1<<6)
164 __u64 features;
165
166 __u64 ioctls;
167};
168
169struct uffdio_range {
170 __u64 start;
171 __u64 len;
172};
173
174struct uffdio_register {
175 struct uffdio_range range;
176#define UFFDIO_REGISTER_MODE_MISSING ((__u64)1<<0)
177#define UFFDIO_REGISTER_MODE_WP ((__u64)1<<1)
178 __u64 mode;
179
180
181
182
183
184 __u64 ioctls;
185};
186
187struct uffdio_copy {
188 __u64 dst;
189 __u64 src;
190 __u64 len;
191
192
193
194
195
196
197#define UFFDIO_COPY_MODE_DONTWAKE ((__u64)1<<0)
198 __u64 mode;
199
200
201
202
203
204 __s64 copy;
205};
206
207struct uffdio_zeropage {
208 struct uffdio_range range;
209#define UFFDIO_ZEROPAGE_MODE_DONTWAKE ((__u64)1<<0)
210 __u64 mode;
211
212
213
214
215
216 __s64 zeropage;
217};
218
219#endif
220