xref: /linux/include/uapi/linux/userfaultfd.h (revision 0289184476c845968ad6ac9083c96cc0f75ca505)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
21038628dSAndrea Arcangeli /*
31038628dSAndrea Arcangeli  *  include/linux/userfaultfd.h
41038628dSAndrea Arcangeli  *
51038628dSAndrea Arcangeli  *  Copyright (C) 2007  Davide Libenzi <davidel@xmailserver.org>
61038628dSAndrea Arcangeli  *  Copyright (C) 2015  Red Hat, Inc.
71038628dSAndrea Arcangeli  *
81038628dSAndrea Arcangeli  */
91038628dSAndrea Arcangeli 
101038628dSAndrea Arcangeli #ifndef _LINUX_USERFAULTFD_H
111038628dSAndrea Arcangeli #define _LINUX_USERFAULTFD_H
121038628dSAndrea Arcangeli 
131038628dSAndrea Arcangeli #include <linux/types.h>
141038628dSAndrea Arcangeli 
152d5de004SAxel Rasmussen /* ioctls for /dev/userfaultfd */
162d5de004SAxel Rasmussen #define USERFAULTFD_IOC 0xAA
172d5de004SAxel Rasmussen #define USERFAULTFD_IOC_NEW _IO(USERFAULTFD_IOC, 0x00)
182d5de004SAxel Rasmussen 
19e067eba5SAndrea Arcangeli /*
20e067eba5SAndrea Arcangeli  * If the UFFDIO_API is upgraded someday, the UFFDIO_UNREGISTER and
21e067eba5SAndrea Arcangeli  * UFFDIO_WAKE ioctls should be defined as _IOW and not as _IOR.  In
22e067eba5SAndrea Arcangeli  * userfaultfd.h we assumed the kernel was reading (instead _IOC_READ
23e067eba5SAndrea Arcangeli  * means the userland is reading).
24e067eba5SAndrea Arcangeli  */
251038628dSAndrea Arcangeli #define UFFD_API ((__u64)0xAA)
267677f7fdSAxel Rasmussen #define UFFD_API_REGISTER_MODES (UFFDIO_REGISTER_MODE_MISSING |	\
277677f7fdSAxel Rasmussen 				 UFFDIO_REGISTER_MODE_WP |	\
287677f7fdSAxel Rasmussen 				 UFFDIO_REGISTER_MODE_MINOR)
29e06f1e1dSShaohua Li #define UFFD_API_FEATURES (UFFD_FEATURE_PAGEFAULT_FLAG_WP |	\
30e06f1e1dSShaohua Li 			   UFFD_FEATURE_EVENT_FORK |		\
3105ce7724SPavel Emelyanov 			   UFFD_FEATURE_EVENT_REMAP |		\
32d811914dSMike Rapoport 			   UFFD_FEATURE_EVENT_REMOVE |		\
33897ab3e0SMike Rapoport 			   UFFD_FEATURE_EVENT_UNMAP |		\
3447dd9245SAndrea Arcangeli 			   UFFD_FEATURE_MISSING_HUGETLBFS |	\
352d6d6f5aSPrakash Sangappa 			   UFFD_FEATURE_MISSING_SHMEM |		\
369d4ac934SAlexey Perevalov 			   UFFD_FEATURE_SIGBUS |		\
377677f7fdSAxel Rasmussen 			   UFFD_FEATURE_THREAD_ID |		\
38964ab004SAxel Rasmussen 			   UFFD_FEATURE_MINOR_HUGETLBFS |	\
39824ddc60SNadav Amit 			   UFFD_FEATURE_MINOR_SHMEM |		\
40b1f9e876SPeter Xu 			   UFFD_FEATURE_EXACT_ADDRESS |		\
412bad466cSPeter Xu 			   UFFD_FEATURE_WP_HUGETLBFS_SHMEM |	\
422bad466cSPeter Xu 			   UFFD_FEATURE_WP_UNPOPULATED)
431038628dSAndrea Arcangeli #define UFFD_API_IOCTLS				\
441038628dSAndrea Arcangeli 	((__u64)1 << _UFFDIO_REGISTER |		\
451038628dSAndrea Arcangeli 	 (__u64)1 << _UFFDIO_UNREGISTER |	\
461038628dSAndrea Arcangeli 	 (__u64)1 << _UFFDIO_API)
471038628dSAndrea Arcangeli #define UFFD_API_RANGE_IOCTLS			\
481f1c6f07SAndrea Arcangeli 	((__u64)1 << _UFFDIO_WAKE |		\
491f1c6f07SAndrea Arcangeli 	 (__u64)1 << _UFFDIO_COPY |		\
50e06f1e1dSShaohua Li 	 (__u64)1 << _UFFDIO_ZEROPAGE |		\
51f6191471SAxel Rasmussen 	 (__u64)1 << _UFFDIO_WRITEPROTECT |	\
52f6191471SAxel Rasmussen 	 (__u64)1 << _UFFDIO_CONTINUE)
53cac67329SMike Rapoport #define UFFD_API_RANGE_IOCTLS_BASIC		\
54cab350afSMike Kravetz 	((__u64)1 << _UFFDIO_WAKE |		\
55f6191471SAxel Rasmussen 	 (__u64)1 << _UFFDIO_COPY |		\
56b1f9e876SPeter Xu 	 (__u64)1 << _UFFDIO_CONTINUE |		\
57b1f9e876SPeter Xu 	 (__u64)1 << _UFFDIO_WRITEPROTECT)
581038628dSAndrea Arcangeli 
591038628dSAndrea Arcangeli /*
601038628dSAndrea Arcangeli  * Valid ioctl command number range with this API is from 0x00 to
611038628dSAndrea Arcangeli  * 0x3F.  UFFDIO_API is the fixed number, everything else can be
621038628dSAndrea Arcangeli  * changed by implementing a different UFFD_API. If sticking to the
631038628dSAndrea Arcangeli  * same UFFD_API more ioctl can be added and userland will be aware of
641038628dSAndrea Arcangeli  * which ioctl the running kernel implements through the ioctl command
651038628dSAndrea Arcangeli  * bitmask written by the UFFDIO_API.
661038628dSAndrea Arcangeli  */
671038628dSAndrea Arcangeli #define _UFFDIO_REGISTER		(0x00)
681038628dSAndrea Arcangeli #define _UFFDIO_UNREGISTER		(0x01)
691038628dSAndrea Arcangeli #define _UFFDIO_WAKE			(0x02)
701f1c6f07SAndrea Arcangeli #define _UFFDIO_COPY			(0x03)
711f1c6f07SAndrea Arcangeli #define _UFFDIO_ZEROPAGE		(0x04)
7263b2d417SAndrea Arcangeli #define _UFFDIO_WRITEPROTECT		(0x06)
73f6191471SAxel Rasmussen #define _UFFDIO_CONTINUE		(0x07)
741038628dSAndrea Arcangeli #define _UFFDIO_API			(0x3F)
751038628dSAndrea Arcangeli 
761038628dSAndrea Arcangeli /* userfaultfd ioctl ids */
771038628dSAndrea Arcangeli #define UFFDIO 0xAA
781038628dSAndrea Arcangeli #define UFFDIO_API		_IOWR(UFFDIO, _UFFDIO_API,	\
791038628dSAndrea Arcangeli 				      struct uffdio_api)
801038628dSAndrea Arcangeli #define UFFDIO_REGISTER		_IOWR(UFFDIO, _UFFDIO_REGISTER, \
811038628dSAndrea Arcangeli 				      struct uffdio_register)
821038628dSAndrea Arcangeli #define UFFDIO_UNREGISTER	_IOR(UFFDIO, _UFFDIO_UNREGISTER,	\
831038628dSAndrea Arcangeli 				     struct uffdio_range)
841038628dSAndrea Arcangeli #define UFFDIO_WAKE		_IOR(UFFDIO, _UFFDIO_WAKE,	\
851038628dSAndrea Arcangeli 				     struct uffdio_range)
861f1c6f07SAndrea Arcangeli #define UFFDIO_COPY		_IOWR(UFFDIO, _UFFDIO_COPY,	\
871f1c6f07SAndrea Arcangeli 				      struct uffdio_copy)
881f1c6f07SAndrea Arcangeli #define UFFDIO_ZEROPAGE		_IOWR(UFFDIO, _UFFDIO_ZEROPAGE,	\
891f1c6f07SAndrea Arcangeli 				      struct uffdio_zeropage)
9063b2d417SAndrea Arcangeli #define UFFDIO_WRITEPROTECT	_IOWR(UFFDIO, _UFFDIO_WRITEPROTECT, \
9163b2d417SAndrea Arcangeli 				      struct uffdio_writeprotect)
92808e9df4SGleb Fotengauer-Malinovskiy #define UFFDIO_CONTINUE		_IOWR(UFFDIO, _UFFDIO_CONTINUE,	\
93f6191471SAxel Rasmussen 				      struct uffdio_continue)
941038628dSAndrea Arcangeli 
95a9b85f94SAndrea Arcangeli /* read() structure */
96a9b85f94SAndrea Arcangeli struct uffd_msg {
97a9b85f94SAndrea Arcangeli 	__u8	event;
98a9b85f94SAndrea Arcangeli 
99a9b85f94SAndrea Arcangeli 	__u8	reserved1;
100a9b85f94SAndrea Arcangeli 	__u16	reserved2;
101a9b85f94SAndrea Arcangeli 	__u32	reserved3;
102a9b85f94SAndrea Arcangeli 
103a9b85f94SAndrea Arcangeli 	union {
104a9b85f94SAndrea Arcangeli 		struct {
105a9b85f94SAndrea Arcangeli 			__u64	flags;
106a9b85f94SAndrea Arcangeli 			__u64	address;
107a36985d3SAndrea Arcangeli 			union {
1089d4ac934SAlexey Perevalov 				__u32 ptid;
109a36985d3SAndrea Arcangeli 			} feat;
110a9b85f94SAndrea Arcangeli 		} pagefault;
111a9b85f94SAndrea Arcangeli 
112a9b85f94SAndrea Arcangeli 		struct {
113893e26e6SPavel Emelyanov 			__u32	ufd;
114893e26e6SPavel Emelyanov 		} fork;
115893e26e6SPavel Emelyanov 
116893e26e6SPavel Emelyanov 		struct {
11772f87654SPavel Emelyanov 			__u64	from;
11872f87654SPavel Emelyanov 			__u64	to;
11972f87654SPavel Emelyanov 			__u64	len;
12072f87654SPavel Emelyanov 		} remap;
12172f87654SPavel Emelyanov 
12272f87654SPavel Emelyanov 		struct {
12305ce7724SPavel Emelyanov 			__u64	start;
12405ce7724SPavel Emelyanov 			__u64	end;
125d811914dSMike Rapoport 		} remove;
12605ce7724SPavel Emelyanov 
12705ce7724SPavel Emelyanov 		struct {
128a9b85f94SAndrea Arcangeli 			/* unused reserved fields */
129a9b85f94SAndrea Arcangeli 			__u64	reserved1;
130a9b85f94SAndrea Arcangeli 			__u64	reserved2;
131a9b85f94SAndrea Arcangeli 			__u64	reserved3;
132a9b85f94SAndrea Arcangeli 		} reserved;
133a9b85f94SAndrea Arcangeli 	} arg;
134a9b85f94SAndrea Arcangeli } __packed;
1351038628dSAndrea Arcangeli 
1363f602d27SPavel Emelyanov /*
137a9b85f94SAndrea Arcangeli  * Start at 0x12 and not at 0 to be more strict against bugs.
1383f602d27SPavel Emelyanov  */
139a9b85f94SAndrea Arcangeli #define UFFD_EVENT_PAGEFAULT	0x12
140a9b85f94SAndrea Arcangeli #define UFFD_EVENT_FORK		0x13
14172f87654SPavel Emelyanov #define UFFD_EVENT_REMAP	0x14
142d811914dSMike Rapoport #define UFFD_EVENT_REMOVE	0x15
143897ab3e0SMike Rapoport #define UFFD_EVENT_UNMAP	0x16
144a9b85f94SAndrea Arcangeli 
145a9b85f94SAndrea Arcangeli /* flags for UFFD_EVENT_PAGEFAULT */
146a9b85f94SAndrea Arcangeli #define UFFD_PAGEFAULT_FLAG_WRITE	(1<<0)	/* If this was a write fault */
147a9b85f94SAndrea Arcangeli #define UFFD_PAGEFAULT_FLAG_WP		(1<<1)	/* If reason is VM_UFFD_WP */
1487677f7fdSAxel Rasmussen #define UFFD_PAGEFAULT_FLAG_MINOR	(1<<2)	/* If reason is VM_UFFD_MINOR */
1493f602d27SPavel Emelyanov 
1501038628dSAndrea Arcangeli struct uffdio_api {
151a9b85f94SAndrea Arcangeli 	/* userland asks for an API number and the features to enable */
1521038628dSAndrea Arcangeli 	__u64 api;
153a9b85f94SAndrea Arcangeli 	/*
154a9b85f94SAndrea Arcangeli 	 * Kernel answers below with the all available features for
155a9b85f94SAndrea Arcangeli 	 * the API, this notifies userland of which events and/or
156a9b85f94SAndrea Arcangeli 	 * which flags for each event are enabled in the current
157a9b85f94SAndrea Arcangeli 	 * kernel.
158a9b85f94SAndrea Arcangeli 	 *
159a9b85f94SAndrea Arcangeli 	 * Note: UFFD_EVENT_PAGEFAULT and UFFD_PAGEFAULT_FLAG_WRITE
160a9b85f94SAndrea Arcangeli 	 * are to be considered implicitly always enabled in all kernels as
161a9b85f94SAndrea Arcangeli 	 * long as the uffdio_api.api requested matches UFFD_API.
162163e11bcSAndrea Arcangeli 	 *
163163e11bcSAndrea Arcangeli 	 * UFFD_FEATURE_MISSING_HUGETLBFS means an UFFDIO_REGISTER
164163e11bcSAndrea Arcangeli 	 * with UFFDIO_REGISTER_MODE_MISSING mode will succeed on
165163e11bcSAndrea Arcangeli 	 * hugetlbfs virtual memory ranges. Adding or not adding
166163e11bcSAndrea Arcangeli 	 * UFFD_FEATURE_MISSING_HUGETLBFS to uffdio_api.features has
167163e11bcSAndrea Arcangeli 	 * no real functional effect after UFFDIO_API returns, but
168163e11bcSAndrea Arcangeli 	 * it's only useful for an initial feature set probe at
169163e11bcSAndrea Arcangeli 	 * UFFDIO_API time. There are two ways to use it:
170163e11bcSAndrea Arcangeli 	 *
171163e11bcSAndrea Arcangeli 	 * 1) by adding UFFD_FEATURE_MISSING_HUGETLBFS to the
172163e11bcSAndrea Arcangeli 	 *    uffdio_api.features before calling UFFDIO_API, an error
173163e11bcSAndrea Arcangeli 	 *    will be returned by UFFDIO_API on a kernel without
174163e11bcSAndrea Arcangeli 	 *    hugetlbfs missing support
175163e11bcSAndrea Arcangeli 	 *
176163e11bcSAndrea Arcangeli 	 * 2) the UFFD_FEATURE_MISSING_HUGETLBFS can not be added in
177163e11bcSAndrea Arcangeli 	 *    uffdio_api.features and instead it will be set by the
178163e11bcSAndrea Arcangeli 	 *    kernel in the uffdio_api.features if the kernel supports
179163e11bcSAndrea Arcangeli 	 *    it, so userland can later check if the feature flag is
180163e11bcSAndrea Arcangeli 	 *    present in uffdio_api.features after UFFDIO_API
181163e11bcSAndrea Arcangeli 	 *    succeeded.
18247dd9245SAndrea Arcangeli 	 *
18347dd9245SAndrea Arcangeli 	 * UFFD_FEATURE_MISSING_SHMEM works the same as
18447dd9245SAndrea Arcangeli 	 * UFFD_FEATURE_MISSING_HUGETLBFS, but it applies to shmem
18547dd9245SAndrea Arcangeli 	 * (i.e. tmpfs and other shmem based APIs).
1862d6d6f5aSPrakash Sangappa 	 *
1872d6d6f5aSPrakash Sangappa 	 * UFFD_FEATURE_SIGBUS feature means no page-fault
1882d6d6f5aSPrakash Sangappa 	 * (UFFD_EVENT_PAGEFAULT) event will be delivered, instead
1892d6d6f5aSPrakash Sangappa 	 * a SIGBUS signal will be sent to the faulting process.
1909d4ac934SAlexey Perevalov 	 *
1919d4ac934SAlexey Perevalov 	 * UFFD_FEATURE_THREAD_ID pid of the page faulted task_struct will
1929d4ac934SAlexey Perevalov 	 * be returned, if feature is not requested 0 will be returned.
1937677f7fdSAxel Rasmussen 	 *
1947677f7fdSAxel Rasmussen 	 * UFFD_FEATURE_MINOR_HUGETLBFS indicates that minor faults
1957677f7fdSAxel Rasmussen 	 * can be intercepted (via REGISTER_MODE_MINOR) for
1967677f7fdSAxel Rasmussen 	 * hugetlbfs-backed pages.
197964ab004SAxel Rasmussen 	 *
198964ab004SAxel Rasmussen 	 * UFFD_FEATURE_MINOR_SHMEM indicates the same support as
199964ab004SAxel Rasmussen 	 * UFFD_FEATURE_MINOR_HUGETLBFS, but for shmem-backed pages instead.
200824ddc60SNadav Amit 	 *
201824ddc60SNadav Amit 	 * UFFD_FEATURE_EXACT_ADDRESS indicates that the exact address of page
202824ddc60SNadav Amit 	 * faults would be provided and the offset within the page would not be
203824ddc60SNadav Amit 	 * masked.
204b1f9e876SPeter Xu 	 *
205b1f9e876SPeter Xu 	 * UFFD_FEATURE_WP_HUGETLBFS_SHMEM indicates that userfaultfd
206b1f9e876SPeter Xu 	 * write-protection mode is supported on both shmem and hugetlbfs.
2072bad466cSPeter Xu 	 *
2082bad466cSPeter Xu 	 * UFFD_FEATURE_WP_UNPOPULATED indicates that userfaultfd
2092bad466cSPeter Xu 	 * write-protection mode will always apply to unpopulated pages
2102bad466cSPeter Xu 	 * (i.e. empty ptes).  This will be the default behavior for shmem
2112bad466cSPeter Xu 	 * & hugetlbfs, so this flag only affects anonymous memory behavior
2122bad466cSPeter Xu 	 * when userfault write-protection mode is registered.
213a9b85f94SAndrea Arcangeli 	 */
214a9b85f94SAndrea Arcangeli #define UFFD_FEATURE_PAGEFAULT_FLAG_WP		(1<<0)
215a9b85f94SAndrea Arcangeli #define UFFD_FEATURE_EVENT_FORK			(1<<1)
21672f87654SPavel Emelyanov #define UFFD_FEATURE_EVENT_REMAP		(1<<2)
217d811914dSMike Rapoport #define UFFD_FEATURE_EVENT_REMOVE		(1<<3)
218163e11bcSAndrea Arcangeli #define UFFD_FEATURE_MISSING_HUGETLBFS		(1<<4)
21947dd9245SAndrea Arcangeli #define UFFD_FEATURE_MISSING_SHMEM		(1<<5)
220897ab3e0SMike Rapoport #define UFFD_FEATURE_EVENT_UNMAP		(1<<6)
2212d6d6f5aSPrakash Sangappa #define UFFD_FEATURE_SIGBUS			(1<<7)
2229d4ac934SAlexey Perevalov #define UFFD_FEATURE_THREAD_ID			(1<<8)
2237677f7fdSAxel Rasmussen #define UFFD_FEATURE_MINOR_HUGETLBFS		(1<<9)
224964ab004SAxel Rasmussen #define UFFD_FEATURE_MINOR_SHMEM		(1<<10)
225824ddc60SNadav Amit #define UFFD_FEATURE_EXACT_ADDRESS		(1<<11)
226b1f9e876SPeter Xu #define UFFD_FEATURE_WP_HUGETLBFS_SHMEM		(1<<12)
2272bad466cSPeter Xu #define UFFD_FEATURE_WP_UNPOPULATED		(1<<13)
2283f602d27SPavel Emelyanov 	__u64 features;
229a9b85f94SAndrea Arcangeli 
2301038628dSAndrea Arcangeli 	__u64 ioctls;
2311038628dSAndrea Arcangeli };
2321038628dSAndrea Arcangeli 
2331038628dSAndrea Arcangeli struct uffdio_range {
2341038628dSAndrea Arcangeli 	__u64 start;
2351038628dSAndrea Arcangeli 	__u64 len;
2361038628dSAndrea Arcangeli };
2371038628dSAndrea Arcangeli 
2381038628dSAndrea Arcangeli struct uffdio_register {
2391038628dSAndrea Arcangeli 	struct uffdio_range range;
2401038628dSAndrea Arcangeli #define UFFDIO_REGISTER_MODE_MISSING	((__u64)1<<0)
2411038628dSAndrea Arcangeli #define UFFDIO_REGISTER_MODE_WP		((__u64)1<<1)
2427677f7fdSAxel Rasmussen #define UFFDIO_REGISTER_MODE_MINOR	((__u64)1<<2)
2431038628dSAndrea Arcangeli 	__u64 mode;
2441038628dSAndrea Arcangeli 
2451038628dSAndrea Arcangeli 	/*
2461038628dSAndrea Arcangeli 	 * kernel answers which ioctl commands are available for the
2471038628dSAndrea Arcangeli 	 * range, keep at the end as the last 8 bytes aren't read.
2481038628dSAndrea Arcangeli 	 */
2491038628dSAndrea Arcangeli 	__u64 ioctls;
2501038628dSAndrea Arcangeli };
2511038628dSAndrea Arcangeli 
2521f1c6f07SAndrea Arcangeli struct uffdio_copy {
2531f1c6f07SAndrea Arcangeli 	__u64 dst;
2541f1c6f07SAndrea Arcangeli 	__u64 src;
2551f1c6f07SAndrea Arcangeli 	__u64 len;
2561f1c6f07SAndrea Arcangeli #define UFFDIO_COPY_MODE_DONTWAKE		((__u64)1<<0)
25772981e0eSAndrea Arcangeli 	/*
25872981e0eSAndrea Arcangeli 	 * UFFDIO_COPY_MODE_WP will map the page write protected on
25972981e0eSAndrea Arcangeli 	 * the fly.  UFFDIO_COPY_MODE_WP is available only if the
26072981e0eSAndrea Arcangeli 	 * write protected ioctl is implemented for the range
26172981e0eSAndrea Arcangeli 	 * according to the uffdio_register.ioctls.
26272981e0eSAndrea Arcangeli 	 */
26372981e0eSAndrea Arcangeli #define UFFDIO_COPY_MODE_WP			((__u64)1<<1)
2641f1c6f07SAndrea Arcangeli 	__u64 mode;
2651f1c6f07SAndrea Arcangeli 
2661f1c6f07SAndrea Arcangeli 	/*
2671f1c6f07SAndrea Arcangeli 	 * "copy" is written by the ioctl and must be at the end: the
2681f1c6f07SAndrea Arcangeli 	 * copy_from_user will not read the last 8 bytes.
2691f1c6f07SAndrea Arcangeli 	 */
2701f1c6f07SAndrea Arcangeli 	__s64 copy;
2711f1c6f07SAndrea Arcangeli };
2721f1c6f07SAndrea Arcangeli 
2731f1c6f07SAndrea Arcangeli struct uffdio_zeropage {
2741f1c6f07SAndrea Arcangeli 	struct uffdio_range range;
2751f1c6f07SAndrea Arcangeli #define UFFDIO_ZEROPAGE_MODE_DONTWAKE		((__u64)1<<0)
2761f1c6f07SAndrea Arcangeli 	__u64 mode;
2771f1c6f07SAndrea Arcangeli 
2781f1c6f07SAndrea Arcangeli 	/*
2791f1c6f07SAndrea Arcangeli 	 * "zeropage" is written by the ioctl and must be at the end:
2801f1c6f07SAndrea Arcangeli 	 * the copy_from_user will not read the last 8 bytes.
2811f1c6f07SAndrea Arcangeli 	 */
2821f1c6f07SAndrea Arcangeli 	__s64 zeropage;
2831f1c6f07SAndrea Arcangeli };
2841f1c6f07SAndrea Arcangeli 
28563b2d417SAndrea Arcangeli struct uffdio_writeprotect {
28663b2d417SAndrea Arcangeli 	struct uffdio_range range;
28763b2d417SAndrea Arcangeli /*
28863b2d417SAndrea Arcangeli  * UFFDIO_WRITEPROTECT_MODE_WP: set the flag to write protect a range,
28963b2d417SAndrea Arcangeli  * unset the flag to undo protection of a range which was previously
29063b2d417SAndrea Arcangeli  * write protected.
29163b2d417SAndrea Arcangeli  *
29263b2d417SAndrea Arcangeli  * UFFDIO_WRITEPROTECT_MODE_DONTWAKE: set the flag to avoid waking up
29363b2d417SAndrea Arcangeli  * any wait thread after the operation succeeds.
29463b2d417SAndrea Arcangeli  *
29563b2d417SAndrea Arcangeli  * NOTE: Write protecting a region (WP=1) is unrelated to page faults,
29663b2d417SAndrea Arcangeli  * therefore DONTWAKE flag is meaningless with WP=1.  Removing write
29763b2d417SAndrea Arcangeli  * protection (WP=0) in response to a page fault wakes the faulting
29863b2d417SAndrea Arcangeli  * task unless DONTWAKE is set.
29963b2d417SAndrea Arcangeli  */
30063b2d417SAndrea Arcangeli #define UFFDIO_WRITEPROTECT_MODE_WP		((__u64)1<<0)
30163b2d417SAndrea Arcangeli #define UFFDIO_WRITEPROTECT_MODE_DONTWAKE	((__u64)1<<1)
30263b2d417SAndrea Arcangeli 	__u64 mode;
30363b2d417SAndrea Arcangeli };
30463b2d417SAndrea Arcangeli 
305f6191471SAxel Rasmussen struct uffdio_continue {
306f6191471SAxel Rasmussen 	struct uffdio_range range;
307f6191471SAxel Rasmussen #define UFFDIO_CONTINUE_MODE_DONTWAKE		((__u64)1<<0)
308*02891844SAxel Rasmussen 	/*
309*02891844SAxel Rasmussen 	 * UFFDIO_CONTINUE_MODE_WP will map the page write protected on
310*02891844SAxel Rasmussen 	 * the fly.  UFFDIO_CONTINUE_MODE_WP is available only if the
311*02891844SAxel Rasmussen 	 * write protected ioctl is implemented for the range
312*02891844SAxel Rasmussen 	 * according to the uffdio_register.ioctls.
313*02891844SAxel Rasmussen 	 */
314*02891844SAxel Rasmussen #define UFFDIO_CONTINUE_MODE_WP			((__u64)1<<1)
315f6191471SAxel Rasmussen 	__u64 mode;
316f6191471SAxel Rasmussen 
317f6191471SAxel Rasmussen 	/*
318f6191471SAxel Rasmussen 	 * Fields below here are written by the ioctl and must be at the end:
319f6191471SAxel Rasmussen 	 * the copy_from_user will not read past here.
320f6191471SAxel Rasmussen 	 */
321f6191471SAxel Rasmussen 	__s64 mapped;
322f6191471SAxel Rasmussen };
323f6191471SAxel Rasmussen 
32437cd0575SLokesh Gidra /*
32537cd0575SLokesh Gidra  * Flags for the userfaultfd(2) system call itself.
32637cd0575SLokesh Gidra  */
32737cd0575SLokesh Gidra 
32837cd0575SLokesh Gidra /*
32937cd0575SLokesh Gidra  * Create a userfaultfd that can handle page faults only in user mode.
33037cd0575SLokesh Gidra  */
33137cd0575SLokesh Gidra #define UFFD_USER_MODE_ONLY 1
33237cd0575SLokesh Gidra 
3331038628dSAndrea Arcangeli #endif /* _LINUX_USERFAULTFD_H */
334