at v4.11 6.2 kB view raw
1/* 2 * include/linux/userfaultfd.h 3 * 4 * Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org> 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_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 * Valid ioctl command number range with this API is from 0x00 to 41 * 0x3F. UFFDIO_API is the fixed number, everything else can be 42 * changed by implementing a different UFFD_API. If sticking to the 43 * same UFFD_API more ioctl can be added and userland will be aware of 44 * which ioctl the running kernel implements through the ioctl command 45 * bitmask written by the UFFDIO_API. 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/* userfaultfd ioctl ids */ 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/* read() structure */ 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 /* unused reserved fields */ 100 __u64 reserved1; 101 __u64 reserved2; 102 __u64 reserved3; 103 } reserved; 104 } arg; 105} __packed; 106 107/* 108 * Start at 0x12 and not at 0 to be more strict against bugs. 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/* flags for UFFD_EVENT_PAGEFAULT */ 117#define UFFD_PAGEFAULT_FLAG_WRITE (1<<0) /* If this was a write fault */ 118#define UFFD_PAGEFAULT_FLAG_WP (1<<1) /* If reason is VM_UFFD_WP */ 119 120struct uffdio_api { 121 /* userland asks for an API number and the features to enable */ 122 __u64 api; 123 /* 124 * Kernel answers below with the all available features for 125 * the API, this notifies userland of which events and/or 126 * which flags for each event are enabled in the current 127 * kernel. 128 * 129 * Note: UFFD_EVENT_PAGEFAULT and UFFD_PAGEFAULT_FLAG_WRITE 130 * are to be considered implicitly always enabled in all kernels as 131 * long as the uffdio_api.api requested matches UFFD_API. 132 * 133 * UFFD_FEATURE_MISSING_HUGETLBFS means an UFFDIO_REGISTER 134 * with UFFDIO_REGISTER_MODE_MISSING mode will succeed on 135 * hugetlbfs virtual memory ranges. Adding or not adding 136 * UFFD_FEATURE_MISSING_HUGETLBFS to uffdio_api.features has 137 * no real functional effect after UFFDIO_API returns, but 138 * it's only useful for an initial feature set probe at 139 * UFFDIO_API time. There are two ways to use it: 140 * 141 * 1) by adding UFFD_FEATURE_MISSING_HUGETLBFS to the 142 * uffdio_api.features before calling UFFDIO_API, an error 143 * will be returned by UFFDIO_API on a kernel without 144 * hugetlbfs missing support 145 * 146 * 2) the UFFD_FEATURE_MISSING_HUGETLBFS can not be added in 147 * uffdio_api.features and instead it will be set by the 148 * kernel in the uffdio_api.features if the kernel supports 149 * it, so userland can later check if the feature flag is 150 * present in uffdio_api.features after UFFDIO_API 151 * succeeded. 152 * 153 * UFFD_FEATURE_MISSING_SHMEM works the same as 154 * UFFD_FEATURE_MISSING_HUGETLBFS, but it applies to shmem 155 * (i.e. tmpfs and other shmem based APIs). 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 * kernel answers which ioctl commands are available for the 182 * range, keep at the end as the last 8 bytes aren't read. 183 */ 184 __u64 ioctls; 185}; 186 187struct uffdio_copy { 188 __u64 dst; 189 __u64 src; 190 __u64 len; 191 /* 192 * There will be a wrprotection flag later that allows to map 193 * pages wrprotected on the fly. And such a flag will be 194 * available if the wrprotection ioctl are implemented for the 195 * range according to the uffdio_register.ioctls. 196 */ 197#define UFFDIO_COPY_MODE_DONTWAKE ((__u64)1<<0) 198 __u64 mode; 199 200 /* 201 * "copy" is written by the ioctl and must be at the end: the 202 * copy_from_user will not read the last 8 bytes. 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 * "zeropage" is written by the ioctl and must be at the end: 214 * the copy_from_user will not read the last 8 bytes. 215 */ 216 __s64 zeropage; 217}; 218 219#endif /* _LINUX_USERFAULTFD_H */