xref: /aosp_15_r20/external/ltp/include/lapi/userfaultfd.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (C) 2007 Davide Libenzi <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (C) 2015,2022 Red Hat, Inc.
5*49cdfc7eSAndroid Build Coastguard Worker  *
6*49cdfc7eSAndroid Build Coastguard Worker  * Mostly copied/adapted from <linux/userfaultfd.h>
7*49cdfc7eSAndroid Build Coastguard Worker  */
8*49cdfc7eSAndroid Build Coastguard Worker 
9*49cdfc7eSAndroid Build Coastguard Worker #ifndef LAPI_USERFAULTFD_H__
10*49cdfc7eSAndroid Build Coastguard Worker #define LAPI_USERFAULTFD_H__
11*49cdfc7eSAndroid Build Coastguard Worker 
12*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
13*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
14*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/syscalls.h"
15*49cdfc7eSAndroid Build Coastguard Worker 
16*49cdfc7eSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_USERFAULTFD_H
17*49cdfc7eSAndroid Build Coastguard Worker #include <linux/userfaultfd.h>
18*49cdfc7eSAndroid Build Coastguard Worker #endif
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker /* userfaultfd support was added in v4.1 */
21*49cdfc7eSAndroid Build Coastguard Worker #ifndef UFFD_API
22*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_API ((__u64)0xAA)
23*49cdfc7eSAndroid Build Coastguard Worker 
24*49cdfc7eSAndroid Build Coastguard Worker /*
25*49cdfc7eSAndroid Build Coastguard Worker  * Valid ioctl command number range with this API is from 0x00 to
26*49cdfc7eSAndroid Build Coastguard Worker  * 0x3F.  UFFDIO_API is the fixed number, everything else can be
27*49cdfc7eSAndroid Build Coastguard Worker  * changed by implementing a different UFFD_API. If sticking to the
28*49cdfc7eSAndroid Build Coastguard Worker  * same UFFD_API more ioctl can be added and userland will be aware of
29*49cdfc7eSAndroid Build Coastguard Worker  * which ioctl the running kernel implements through the ioctl command
30*49cdfc7eSAndroid Build Coastguard Worker  * bitmask written by the UFFDIO_API.
31*49cdfc7eSAndroid Build Coastguard Worker  */
32*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_REGISTER		(0x00)
33*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_UNREGISTER		(0x01)
34*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_WAKE			(0x02)
35*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_COPY			(0x03)
36*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_ZEROPAGE		(0x04)
37*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_API			(0x3F)
38*49cdfc7eSAndroid Build Coastguard Worker 
39*49cdfc7eSAndroid Build Coastguard Worker /* userfaultfd ioctl ids */
40*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO 0xAA
41*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_API		_IOWR(UFFDIO, _UFFDIO_API,	\
42*49cdfc7eSAndroid Build Coastguard Worker 				      struct uffdio_api)
43*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_REGISTER		_IOWR(UFFDIO, _UFFDIO_REGISTER, \
44*49cdfc7eSAndroid Build Coastguard Worker 				      struct uffdio_register)
45*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_UNREGISTER	_IOR(UFFDIO, _UFFDIO_UNREGISTER,	\
46*49cdfc7eSAndroid Build Coastguard Worker 				     struct uffdio_range)
47*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_WAKE		_IOR(UFFDIO, _UFFDIO_WAKE,	\
48*49cdfc7eSAndroid Build Coastguard Worker 				     struct uffdio_range)
49*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_COPY		_IOWR(UFFDIO, _UFFDIO_COPY,	\
50*49cdfc7eSAndroid Build Coastguard Worker 				      struct uffdio_copy)
51*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_ZEROPAGE		_IOWR(UFFDIO, _UFFDIO_ZEROPAGE,	\
52*49cdfc7eSAndroid Build Coastguard Worker 				      struct uffdio_zeropage)
53*49cdfc7eSAndroid Build Coastguard Worker 
54*49cdfc7eSAndroid Build Coastguard Worker /* read() structure */
55*49cdfc7eSAndroid Build Coastguard Worker struct uffd_msg {
56*49cdfc7eSAndroid Build Coastguard Worker 	__u8	event;
57*49cdfc7eSAndroid Build Coastguard Worker 
58*49cdfc7eSAndroid Build Coastguard Worker 	__u8	reserved1;
59*49cdfc7eSAndroid Build Coastguard Worker 	__u16	reserved2;
60*49cdfc7eSAndroid Build Coastguard Worker 	__u32	reserved3;
61*49cdfc7eSAndroid Build Coastguard Worker 
62*49cdfc7eSAndroid Build Coastguard Worker 	union {
63*49cdfc7eSAndroid Build Coastguard Worker 		struct {
64*49cdfc7eSAndroid Build Coastguard Worker 			__u64	flags;
65*49cdfc7eSAndroid Build Coastguard Worker 			__u64	address;
66*49cdfc7eSAndroid Build Coastguard Worker 		} pagefault;
67*49cdfc7eSAndroid Build Coastguard Worker 
68*49cdfc7eSAndroid Build Coastguard Worker 		struct {
69*49cdfc7eSAndroid Build Coastguard Worker 			/* unused reserved fields */
70*49cdfc7eSAndroid Build Coastguard Worker 			__u64	reserved1;
71*49cdfc7eSAndroid Build Coastguard Worker 			__u64	reserved2;
72*49cdfc7eSAndroid Build Coastguard Worker 			__u64	reserved3;
73*49cdfc7eSAndroid Build Coastguard Worker 		} reserved;
74*49cdfc7eSAndroid Build Coastguard Worker 	} arg;
75*49cdfc7eSAndroid Build Coastguard Worker } __packed;
76*49cdfc7eSAndroid Build Coastguard Worker 
77*49cdfc7eSAndroid Build Coastguard Worker /*
78*49cdfc7eSAndroid Build Coastguard Worker  * Start at 0x12 and not at 0 to be more strict against bugs.
79*49cdfc7eSAndroid Build Coastguard Worker  */
80*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_EVENT_PAGEFAULT	0x12
81*49cdfc7eSAndroid Build Coastguard Worker 
82*49cdfc7eSAndroid Build Coastguard Worker /* flags for UFFD_EVENT_PAGEFAULT */
83*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_PAGEFAULT_FLAG_WRITE	(1<<0)	/* If this was a write fault */
84*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_PAGEFAULT_FLAG_WP		(1<<1)	/* If reason is VM_UFFD_WP */
85*49cdfc7eSAndroid Build Coastguard Worker 
86*49cdfc7eSAndroid Build Coastguard Worker struct uffdio_api {
87*49cdfc7eSAndroid Build Coastguard Worker 	/* userland asks for an API number and the features to enable */
88*49cdfc7eSAndroid Build Coastguard Worker 	__u64 api;
89*49cdfc7eSAndroid Build Coastguard Worker 	/*
90*49cdfc7eSAndroid Build Coastguard Worker 	 * Kernel answers below with the all available features for
91*49cdfc7eSAndroid Build Coastguard Worker 	 * the API, this notifies userland of which events and/or
92*49cdfc7eSAndroid Build Coastguard Worker 	 * which flags for each event are enabled in the current
93*49cdfc7eSAndroid Build Coastguard Worker 	 * kernel.
94*49cdfc7eSAndroid Build Coastguard Worker 	 *
95*49cdfc7eSAndroid Build Coastguard Worker 	 * Note: UFFD_EVENT_PAGEFAULT and UFFD_PAGEFAULT_FLAG_WRITE
96*49cdfc7eSAndroid Build Coastguard Worker 	 * are to be considered implicitly always enabled in all kernels as
97*49cdfc7eSAndroid Build Coastguard Worker 	 * long as the uffdio_api.api requested matches UFFD_API.
98*49cdfc7eSAndroid Build Coastguard Worker 	 */
99*49cdfc7eSAndroid Build Coastguard Worker 	__u64 features;
100*49cdfc7eSAndroid Build Coastguard Worker 
101*49cdfc7eSAndroid Build Coastguard Worker 	__u64 ioctls;
102*49cdfc7eSAndroid Build Coastguard Worker };
103*49cdfc7eSAndroid Build Coastguard Worker 
104*49cdfc7eSAndroid Build Coastguard Worker struct uffdio_range {
105*49cdfc7eSAndroid Build Coastguard Worker 	__u64 start;
106*49cdfc7eSAndroid Build Coastguard Worker 	__u64 len;
107*49cdfc7eSAndroid Build Coastguard Worker };
108*49cdfc7eSAndroid Build Coastguard Worker 
109*49cdfc7eSAndroid Build Coastguard Worker struct uffdio_register {
110*49cdfc7eSAndroid Build Coastguard Worker 	struct uffdio_range range;
111*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_REGISTER_MODE_MISSING	((__u64)1<<0)
112*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_REGISTER_MODE_WP		((__u64)1<<1)
113*49cdfc7eSAndroid Build Coastguard Worker 	__u64 mode;
114*49cdfc7eSAndroid Build Coastguard Worker 
115*49cdfc7eSAndroid Build Coastguard Worker 	/*
116*49cdfc7eSAndroid Build Coastguard Worker 	 * kernel answers which ioctl commands are available for the
117*49cdfc7eSAndroid Build Coastguard Worker 	 * range, keep at the end as the last 8 bytes aren't read.
118*49cdfc7eSAndroid Build Coastguard Worker 	 */
119*49cdfc7eSAndroid Build Coastguard Worker 	__u64 ioctls;
120*49cdfc7eSAndroid Build Coastguard Worker };
121*49cdfc7eSAndroid Build Coastguard Worker 
122*49cdfc7eSAndroid Build Coastguard Worker struct uffdio_copy {
123*49cdfc7eSAndroid Build Coastguard Worker 	__u64 dst;
124*49cdfc7eSAndroid Build Coastguard Worker 	__u64 src;
125*49cdfc7eSAndroid Build Coastguard Worker 	__u64 len;
126*49cdfc7eSAndroid Build Coastguard Worker 	/*
127*49cdfc7eSAndroid Build Coastguard Worker 	 * There will be a wrprotection flag later that allows to map
128*49cdfc7eSAndroid Build Coastguard Worker 	 * pages wrprotected on the fly. And such a flag will be
129*49cdfc7eSAndroid Build Coastguard Worker 	 * available if the wrprotection ioctl are implemented for the
130*49cdfc7eSAndroid Build Coastguard Worker 	 * range according to the uffdio_register.ioctls.
131*49cdfc7eSAndroid Build Coastguard Worker 	 */
132*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_COPY_MODE_DONTWAKE		((__u64)1<<0)
133*49cdfc7eSAndroid Build Coastguard Worker 	__u64 mode;
134*49cdfc7eSAndroid Build Coastguard Worker 
135*49cdfc7eSAndroid Build Coastguard Worker 	/*
136*49cdfc7eSAndroid Build Coastguard Worker 	 * "copy" is written by the ioctl and must be at the end: the
137*49cdfc7eSAndroid Build Coastguard Worker 	 * copy_from_user will not read the last 8 bytes.
138*49cdfc7eSAndroid Build Coastguard Worker 	 */
139*49cdfc7eSAndroid Build Coastguard Worker 	__s64 copy;
140*49cdfc7eSAndroid Build Coastguard Worker };
141*49cdfc7eSAndroid Build Coastguard Worker 
142*49cdfc7eSAndroid Build Coastguard Worker struct uffdio_zeropage {
143*49cdfc7eSAndroid Build Coastguard Worker 	struct uffdio_range range;
144*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_ZEROPAGE_MODE_DONTWAKE		((__u64)1<<0)
145*49cdfc7eSAndroid Build Coastguard Worker 	__u64 mode;
146*49cdfc7eSAndroid Build Coastguard Worker 
147*49cdfc7eSAndroid Build Coastguard Worker 	/*
148*49cdfc7eSAndroid Build Coastguard Worker 	 * "zeropage" is written by the ioctl and must be at the end:
149*49cdfc7eSAndroid Build Coastguard Worker 	 * the copy_from_user will not read the last 8 bytes.
150*49cdfc7eSAndroid Build Coastguard Worker 	 */
151*49cdfc7eSAndroid Build Coastguard Worker 	__s64 zeropage;
152*49cdfc7eSAndroid Build Coastguard Worker };
153*49cdfc7eSAndroid Build Coastguard Worker #endif /* UFFD_API */
154*49cdfc7eSAndroid Build Coastguard Worker 
155*49cdfc7eSAndroid Build Coastguard Worker 
156*49cdfc7eSAndroid Build Coastguard Worker /* UFFD_USER_MODE_ONLY was added in v5.11 */
157*49cdfc7eSAndroid Build Coastguard Worker #ifndef UFFD_USER_MODE_ONLY
158*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_USER_MODE_ONLY 1
159*49cdfc7eSAndroid Build Coastguard Worker #endif /* UFFD_USER_MODE_ONLY */
160*49cdfc7eSAndroid Build Coastguard Worker 
161*49cdfc7eSAndroid Build Coastguard Worker 
162*49cdfc7eSAndroid Build Coastguard Worker /* UFFD_PAGEFAULT_FLAG_MINOR and UFFDIO_CONTINUE were added in v5.13 */
163*49cdfc7eSAndroid Build Coastguard Worker #ifndef UFFD_PAGEFAULT_FLAG_MINOR
164*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_FEATURE_MINOR_HUGETLBFS		(1<<9)
165*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_REGISTER_MODE_MINOR	((__u64)1<<2)
166*49cdfc7eSAndroid Build Coastguard Worker 
167*49cdfc7eSAndroid Build Coastguard Worker #define _UFFDIO_CONTINUE		(0x07)
168*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_CONTINUE		_IOWR(UFFDIO, _UFFDIO_CONTINUE,	\
169*49cdfc7eSAndroid Build Coastguard Worker 				      struct uffdio_continue)
170*49cdfc7eSAndroid Build Coastguard Worker 
171*49cdfc7eSAndroid Build Coastguard Worker struct uffdio_continue {
172*49cdfc7eSAndroid Build Coastguard Worker 	struct uffdio_range range;
173*49cdfc7eSAndroid Build Coastguard Worker #define UFFDIO_CONTINUE_MODE_DONTWAKE		((__u64)1<<0)
174*49cdfc7eSAndroid Build Coastguard Worker 	__u64 mode;
175*49cdfc7eSAndroid Build Coastguard Worker 
176*49cdfc7eSAndroid Build Coastguard Worker 	/*
177*49cdfc7eSAndroid Build Coastguard Worker 	 * Fields below here are written by the ioctl and must be at the end:
178*49cdfc7eSAndroid Build Coastguard Worker 	 * the copy_from_user will not read past here.
179*49cdfc7eSAndroid Build Coastguard Worker 	 */
180*49cdfc7eSAndroid Build Coastguard Worker 	__s64 mapped;
181*49cdfc7eSAndroid Build Coastguard Worker };
182*49cdfc7eSAndroid Build Coastguard Worker #endif /* UFFD_PAGEFAULT_FLAG_MINOR */
183*49cdfc7eSAndroid Build Coastguard Worker 
184*49cdfc7eSAndroid Build Coastguard Worker 
185*49cdfc7eSAndroid Build Coastguard Worker /* UFFD_FEATURE_MINOR_SHMEM was added in v5.14 */
186*49cdfc7eSAndroid Build Coastguard Worker #ifndef UFFD_FEATURE_MINOR_SHMEM
187*49cdfc7eSAndroid Build Coastguard Worker #define UFFD_FEATURE_MINOR_SHMEM		(1<<10)
188*49cdfc7eSAndroid Build Coastguard Worker #endif /* UFFD_FEATURE_MINOR_SHMEM */
189*49cdfc7eSAndroid Build Coastguard Worker 
190*49cdfc7eSAndroid Build Coastguard Worker #endif /* LAPI_USERFAULTFD_H__ */
191