0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LINUX_USERFAULTFD_H
0011 #define _LINUX_USERFAULTFD_H
0012
0013 #include <linux/types.h>
0014
0015
0016
0017
0018
0019
0020
0021 #define UFFD_API ((__u64)0xAA)
0022 #define UFFD_API_REGISTER_MODES (UFFDIO_REGISTER_MODE_MISSING | \
0023 UFFDIO_REGISTER_MODE_WP | \
0024 UFFDIO_REGISTER_MODE_MINOR)
0025 #define UFFD_API_FEATURES (UFFD_FEATURE_PAGEFAULT_FLAG_WP | \
0026 UFFD_FEATURE_EVENT_FORK | \
0027 UFFD_FEATURE_EVENT_REMAP | \
0028 UFFD_FEATURE_EVENT_REMOVE | \
0029 UFFD_FEATURE_EVENT_UNMAP | \
0030 UFFD_FEATURE_MISSING_HUGETLBFS | \
0031 UFFD_FEATURE_MISSING_SHMEM | \
0032 UFFD_FEATURE_SIGBUS | \
0033 UFFD_FEATURE_THREAD_ID | \
0034 UFFD_FEATURE_MINOR_HUGETLBFS | \
0035 UFFD_FEATURE_MINOR_SHMEM | \
0036 UFFD_FEATURE_EXACT_ADDRESS | \
0037 UFFD_FEATURE_WP_HUGETLBFS_SHMEM)
0038 #define UFFD_API_IOCTLS \
0039 ((__u64)1 << _UFFDIO_REGISTER | \
0040 (__u64)1 << _UFFDIO_UNREGISTER | \
0041 (__u64)1 << _UFFDIO_API)
0042 #define UFFD_API_RANGE_IOCTLS \
0043 ((__u64)1 << _UFFDIO_WAKE | \
0044 (__u64)1 << _UFFDIO_COPY | \
0045 (__u64)1 << _UFFDIO_ZEROPAGE | \
0046 (__u64)1 << _UFFDIO_WRITEPROTECT | \
0047 (__u64)1 << _UFFDIO_CONTINUE)
0048 #define UFFD_API_RANGE_IOCTLS_BASIC \
0049 ((__u64)1 << _UFFDIO_WAKE | \
0050 (__u64)1 << _UFFDIO_COPY | \
0051 (__u64)1 << _UFFDIO_CONTINUE | \
0052 (__u64)1 << _UFFDIO_WRITEPROTECT)
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 #define _UFFDIO_REGISTER (0x00)
0063 #define _UFFDIO_UNREGISTER (0x01)
0064 #define _UFFDIO_WAKE (0x02)
0065 #define _UFFDIO_COPY (0x03)
0066 #define _UFFDIO_ZEROPAGE (0x04)
0067 #define _UFFDIO_WRITEPROTECT (0x06)
0068 #define _UFFDIO_CONTINUE (0x07)
0069 #define _UFFDIO_API (0x3F)
0070
0071
0072 #define UFFDIO 0xAA
0073 #define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \
0074 struct uffdio_api)
0075 #define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \
0076 struct uffdio_register)
0077 #define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \
0078 struct uffdio_range)
0079 #define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \
0080 struct uffdio_range)
0081 #define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, \
0082 struct uffdio_copy)
0083 #define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \
0084 struct uffdio_zeropage)
0085 #define UFFDIO_WRITEPROTECT _IOWR(UFFDIO, _UFFDIO_WRITEPROTECT, \
0086 struct uffdio_writeprotect)
0087 #define UFFDIO_CONTINUE _IOWR(UFFDIO, _UFFDIO_CONTINUE, \
0088 struct uffdio_continue)
0089
0090
0091 struct uffd_msg {
0092 __u8 event;
0093
0094 __u8 reserved1;
0095 __u16 reserved2;
0096 __u32 reserved3;
0097
0098 union {
0099 struct {
0100 __u64 flags;
0101 __u64 address;
0102 union {
0103 __u32 ptid;
0104 } feat;
0105 } pagefault;
0106
0107 struct {
0108 __u32 ufd;
0109 } fork;
0110
0111 struct {
0112 __u64 from;
0113 __u64 to;
0114 __u64 len;
0115 } remap;
0116
0117 struct {
0118 __u64 start;
0119 __u64 end;
0120 } remove;
0121
0122 struct {
0123
0124 __u64 reserved1;
0125 __u64 reserved2;
0126 __u64 reserved3;
0127 } reserved;
0128 } arg;
0129 } __packed;
0130
0131
0132
0133
0134 #define UFFD_EVENT_PAGEFAULT 0x12
0135 #define UFFD_EVENT_FORK 0x13
0136 #define UFFD_EVENT_REMAP 0x14
0137 #define UFFD_EVENT_REMOVE 0x15
0138 #define UFFD_EVENT_UNMAP 0x16
0139
0140
0141 #define UFFD_PAGEFAULT_FLAG_WRITE (1<<0)
0142 #define UFFD_PAGEFAULT_FLAG_WP (1<<1)
0143 #define UFFD_PAGEFAULT_FLAG_MINOR (1<<2)
0144
0145 struct uffdio_api {
0146
0147 __u64 api;
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203 #define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0)
0204 #define UFFD_FEATURE_EVENT_FORK (1<<1)
0205 #define UFFD_FEATURE_EVENT_REMAP (1<<2)
0206 #define UFFD_FEATURE_EVENT_REMOVE (1<<3)
0207 #define UFFD_FEATURE_MISSING_HUGETLBFS (1<<4)
0208 #define UFFD_FEATURE_MISSING_SHMEM (1<<5)
0209 #define UFFD_FEATURE_EVENT_UNMAP (1<<6)
0210 #define UFFD_FEATURE_SIGBUS (1<<7)
0211 #define UFFD_FEATURE_THREAD_ID (1<<8)
0212 #define UFFD_FEATURE_MINOR_HUGETLBFS (1<<9)
0213 #define UFFD_FEATURE_MINOR_SHMEM (1<<10)
0214 #define UFFD_FEATURE_EXACT_ADDRESS (1<<11)
0215 #define UFFD_FEATURE_WP_HUGETLBFS_SHMEM (1<<12)
0216 __u64 features;
0217
0218 __u64 ioctls;
0219 };
0220
0221 struct uffdio_range {
0222 __u64 start;
0223 __u64 len;
0224 };
0225
0226 struct uffdio_register {
0227 struct uffdio_range range;
0228 #define UFFDIO_REGISTER_MODE_MISSING ((__u64)1<<0)
0229 #define UFFDIO_REGISTER_MODE_WP ((__u64)1<<1)
0230 #define UFFDIO_REGISTER_MODE_MINOR ((__u64)1<<2)
0231 __u64 mode;
0232
0233
0234
0235
0236
0237 __u64 ioctls;
0238 };
0239
0240 struct uffdio_copy {
0241 __u64 dst;
0242 __u64 src;
0243 __u64 len;
0244 #define UFFDIO_COPY_MODE_DONTWAKE ((__u64)1<<0)
0245
0246
0247
0248
0249
0250
0251 #define UFFDIO_COPY_MODE_WP ((__u64)1<<1)
0252 __u64 mode;
0253
0254
0255
0256
0257
0258 __s64 copy;
0259 };
0260
0261 struct uffdio_zeropage {
0262 struct uffdio_range range;
0263 #define UFFDIO_ZEROPAGE_MODE_DONTWAKE ((__u64)1<<0)
0264 __u64 mode;
0265
0266
0267
0268
0269
0270 __s64 zeropage;
0271 };
0272
0273 struct uffdio_writeprotect {
0274 struct uffdio_range range;
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288 #define UFFDIO_WRITEPROTECT_MODE_WP ((__u64)1<<0)
0289 #define UFFDIO_WRITEPROTECT_MODE_DONTWAKE ((__u64)1<<1)
0290 __u64 mode;
0291 };
0292
0293 struct uffdio_continue {
0294 struct uffdio_range range;
0295 #define UFFDIO_CONTINUE_MODE_DONTWAKE ((__u64)1<<0)
0296 __u64 mode;
0297
0298
0299
0300
0301
0302 __s64 mapped;
0303 };
0304
0305
0306
0307
0308
0309
0310
0311
0312 #define UFFD_USER_MODE_ONLY 1
0313
0314 #endif