1 /* 2 * include/linux/userfaultfd.h 3 * 4 * Copyright (C) 2007 Davide Libenzi <[email protected]> 5 * Copyright (C) 2015 Red Hat, Inc. 6 * 7 */ 8 9 #ifndef _LINUX_USERFAULTFD_H 10 #define _LINUX_USERFAULTFD_H 11 12 #include <linux/types.h> 13 14 /* 15 * If the UFFDIO_API is upgraded someday, the UFFDIO_UNREGISTER and 16 * UFFDIO_WAKE ioctls should be defined as _IOW and not as _IOR. In 17 * userfaultfd.h we assumed the kernel was reading (instead _IOC_READ 18 * means the userland is reading). 19 */ 20 #define UFFD_API ((__u64)0xAA) 21 #define UFFD_API_FEATURES (UFFD_FEATURE_EVENT_EXIT | \ 22 UFFD_FEATURE_EVENT_FORK | \ 23 UFFD_FEATURE_EVENT_REMAP | \ 24 UFFD_FEATURE_EVENT_REMOVE | \ 25 UFFD_FEATURE_EVENT_UNMAP | \ 26 UFFD_FEATURE_MISSING_HUGETLBFS | \ 27 UFFD_FEATURE_MISSING_SHMEM) 28 #define UFFD_API_IOCTLS \ 29 ((__u64)1 << _UFFDIO_REGISTER | \ 30 (__u64)1 << _UFFDIO_UNREGISTER | \ 31 (__u64)1 << _UFFDIO_API) 32 #define UFFD_API_RANGE_IOCTLS \ 33 ((__u64)1 << _UFFDIO_WAKE | \ 34 (__u64)1 << _UFFDIO_COPY | \ 35 (__u64)1 << _UFFDIO_ZEROPAGE) 36 #define UFFD_API_RANGE_IOCTLS_BASIC \ 37 ((__u64)1 << _UFFDIO_WAKE | \ 38 (__u64)1 << _UFFDIO_COPY) 39 40 /* 41 * Valid ioctl command number range with this API is from 0x00 to 42 * 0x3F. UFFDIO_API is the fixed number, everything else can be 43 * changed by implementing a different UFFD_API. If sticking to the 44 * same UFFD_API more ioctl can be added and userland will be aware of 45 * which ioctl the running kernel implements through the ioctl command 46 * bitmask written by the UFFDIO_API. 47 */ 48 #define _UFFDIO_REGISTER (0x00) 49 #define _UFFDIO_UNREGISTER (0x01) 50 #define _UFFDIO_WAKE (0x02) 51 #define _UFFDIO_COPY (0x03) 52 #define _UFFDIO_ZEROPAGE (0x04) 53 #define _UFFDIO_API (0x3F) 54 55 /* userfaultfd ioctl ids */ 56 #define UFFDIO 0xAA 57 #define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \ 58 struct uffdio_api) 59 #define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \ 60 struct uffdio_register) 61 #define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \ 62 struct uffdio_range) 63 #define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \ 64 struct uffdio_range) 65 #define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, \ 66 struct uffdio_copy) 67 #define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \ 68 struct uffdio_zeropage) 69 70 /* read() structure */ 71 struct uffd_msg { 72 __u8 event; 73 74 __u8 reserved1; 75 __u16 reserved2; 76 __u32 reserved3; 77 78 union { 79 struct { 80 __u64 flags; 81 __u64 address; 82 } pagefault; 83 84 struct { 85 __u32 ufd; 86 } fork; 87 88 struct { 89 __u64 from; 90 __u64 to; 91 __u64 len; 92 } remap; 93 94 struct { 95 __u64 start; 96 __u64 end; 97 } remove; 98 99 struct { 100 /* unused reserved fields */ 101 __u64 reserved1; 102 __u64 reserved2; 103 __u64 reserved3; 104 } reserved; 105 } arg; 106 } __packed; 107 108 /* 109 * Start at 0x12 and not at 0 to be more strict against bugs. 110 */ 111 #define UFFD_EVENT_PAGEFAULT 0x12 112 #define UFFD_EVENT_FORK 0x13 113 #define UFFD_EVENT_REMAP 0x14 114 #define UFFD_EVENT_REMOVE 0x15 115 #define UFFD_EVENT_UNMAP 0x16 116 #define UFFD_EVENT_EXIT 0x17 117 118 /* flags for UFFD_EVENT_PAGEFAULT */ 119 #define UFFD_PAGEFAULT_FLAG_WRITE (1<<0) /* If this was a write fault */ 120 #define UFFD_PAGEFAULT_FLAG_WP (1<<1) /* If reason is VM_UFFD_WP */ 121 122 struct uffdio_api { 123 /* userland asks for an API number and the features to enable */ 124 __u64 api; 125 /* 126 * Kernel answers below with the all available features for 127 * the API, this notifies userland of which events and/or 128 * which flags for each event are enabled in the current 129 * kernel. 130 * 131 * Note: UFFD_EVENT_PAGEFAULT and UFFD_PAGEFAULT_FLAG_WRITE 132 * are to be considered implicitly always enabled in all kernels as 133 * long as the uffdio_api.api requested matches UFFD_API. 134 * 135 * UFFD_FEATURE_MISSING_HUGETLBFS means an UFFDIO_REGISTER 136 * with UFFDIO_REGISTER_MODE_MISSING mode will succeed on 137 * hugetlbfs virtual memory ranges. Adding or not adding 138 * UFFD_FEATURE_MISSING_HUGETLBFS to uffdio_api.features has 139 * no real functional effect after UFFDIO_API returns, but 140 * it's only useful for an initial feature set probe at 141 * UFFDIO_API time. There are two ways to use it: 142 * 143 * 1) by adding UFFD_FEATURE_MISSING_HUGETLBFS to the 144 * uffdio_api.features before calling UFFDIO_API, an error 145 * will be returned by UFFDIO_API on a kernel without 146 * hugetlbfs missing support 147 * 148 * 2) the UFFD_FEATURE_MISSING_HUGETLBFS can not be added in 149 * uffdio_api.features and instead it will be set by the 150 * kernel in the uffdio_api.features if the kernel supports 151 * it, so userland can later check if the feature flag is 152 * present in uffdio_api.features after UFFDIO_API 153 * succeeded. 154 * 155 * UFFD_FEATURE_MISSING_SHMEM works the same as 156 * UFFD_FEATURE_MISSING_HUGETLBFS, but it applies to shmem 157 * (i.e. tmpfs and other shmem based APIs). 158 */ 159 #define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0) 160 #define UFFD_FEATURE_EVENT_FORK (1<<1) 161 #define UFFD_FEATURE_EVENT_REMAP (1<<2) 162 #define UFFD_FEATURE_EVENT_REMOVE (1<<3) 163 #define UFFD_FEATURE_MISSING_HUGETLBFS (1<<4) 164 #define UFFD_FEATURE_MISSING_SHMEM (1<<5) 165 #define UFFD_FEATURE_EVENT_UNMAP (1<<6) 166 #define UFFD_FEATURE_EVENT_EXIT (1<<7) 167 __u64 features; 168 169 __u64 ioctls; 170 }; 171 172 struct uffdio_range { 173 __u64 start; 174 __u64 len; 175 }; 176 177 struct uffdio_register { 178 struct uffdio_range range; 179 #define UFFDIO_REGISTER_MODE_MISSING ((__u64)1<<0) 180 #define UFFDIO_REGISTER_MODE_WP ((__u64)1<<1) 181 __u64 mode; 182 183 /* 184 * kernel answers which ioctl commands are available for the 185 * range, keep at the end as the last 8 bytes aren't read. 186 */ 187 __u64 ioctls; 188 }; 189 190 struct uffdio_copy { 191 __u64 dst; 192 __u64 src; 193 __u64 len; 194 /* 195 * There will be a wrprotection flag later that allows to map 196 * pages wrprotected on the fly. And such a flag will be 197 * available if the wrprotection ioctl are implemented for the 198 * range according to the uffdio_register.ioctls. 199 */ 200 #define UFFDIO_COPY_MODE_DONTWAKE ((__u64)1<<0) 201 __u64 mode; 202 203 /* 204 * "copy" is written by the ioctl and must be at the end: the 205 * copy_from_user will not read the last 8 bytes. 206 */ 207 __s64 copy; 208 }; 209 210 struct uffdio_zeropage { 211 struct uffdio_range range; 212 #define UFFDIO_ZEROPAGE_MODE_DONTWAKE ((__u64)1<<0) 213 __u64 mode; 214 215 /* 216 * "zeropage" is written by the ioctl and must be at the end: 217 * the copy_from_user will not read the last 8 bytes. 218 */ 219 __s64 zeropage; 220 }; 221 222 #endif /* _LINUX_USERFAULTFD_H */ 223