1 /* 2 * This header was generated from the Linux kernel headers by update_headers.py, 3 * to provide necessary information from kernel to userspace, such as constants, 4 * structures, and macros, and thus, contains no copyrightable information. 5 */ 6 #ifndef _LINUX_USERFAULTFD_H 7 #define _LINUX_USERFAULTFD_H 8 #include <linux/types.h> 9 #define UFFD_API ((__u64)0xAA) 10 #define UFFD_API_FEATURES (UFFD_FEATURE_EVENT_FORK | \ 11 UFFD_FEATURE_EVENT_REMAP | \ 12 UFFD_FEATURE_EVENT_REMOVE | \ 13 UFFD_FEATURE_EVENT_UNMAP | \ 14 UFFD_FEATURE_MISSING_HUGETLBFS | \ 15 UFFD_FEATURE_MISSING_SHMEM | \ 16 UFFD_FEATURE_SIGBUS | \ 17 UFFD_FEATURE_THREAD_ID) 18 #define UFFD_API_IOCTLS \ 19 ((__u64)1 << _UFFDIO_REGISTER | \ 20 (__u64)1 << _UFFDIO_UNREGISTER | \ 21 (__u64)1 << _UFFDIO_API) 22 #define UFFD_API_RANGE_IOCTLS \ 23 ((__u64)1 << _UFFDIO_WAKE | \ 24 (__u64)1 << _UFFDIO_COPY | \ 25 (__u64)1 << _UFFDIO_ZEROPAGE) 26 #define UFFD_API_RANGE_IOCTLS_BASIC \ 27 ((__u64)1 << _UFFDIO_WAKE | \ 28 (__u64)1 << _UFFDIO_COPY) 29 #define _UFFDIO_REGISTER (0x00) 30 #define _UFFDIO_UNREGISTER (0x01) 31 #define _UFFDIO_WAKE (0x02) 32 #define _UFFDIO_COPY (0x03) 33 #define _UFFDIO_ZEROPAGE (0x04) 34 #define _UFFDIO_API (0x3F) 35 #define UFFDIO 0xAA 36 #define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \ 37 struct uffdio_api) 38 #define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \ 39 struct uffdio_register) 40 #define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \ 41 struct uffdio_range) 42 #define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \ 43 struct uffdio_range) 44 #define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, \ 45 struct uffdio_copy) 46 #define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \ 47 struct uffdio_zeropage) 48 struct uffd_msg { 49 __u8 event; 50 __u8 reserved1; 51 __u16 reserved2; 52 __u32 reserved3; 53 union { 54 struct { 55 __u64 flags; 56 __u64 address; 57 union { 58 __u32 ptid; 59 } feat; 60 } pagefault; 61 struct { 62 __u32 ufd; 63 } fork; 64 struct { 65 __u64 from; 66 __u64 to; 67 __u64 len; 68 } remap; 69 struct { 70 __u64 start; 71 __u64 end; 72 } remove; 73 struct { 74 75 __u64 reserved1; 76 __u64 reserved2; 77 __u64 reserved3; 78 } reserved; 79 } arg; 80 } __packed; 81 #define UFFD_EVENT_PAGEFAULT 0x12 82 #define UFFD_EVENT_FORK 0x13 83 #define UFFD_EVENT_REMAP 0x14 84 #define UFFD_EVENT_REMOVE 0x15 85 #define UFFD_EVENT_UNMAP 0x16 86 #define UFFD_PAGEFAULT_FLAG_WRITE (1<<0) 87 #define UFFD_PAGEFAULT_FLAG_WP (1<<1) 88 struct uffdio_api { 89 90 __u64 api; 91 92 #define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0) 93 #define UFFD_FEATURE_EVENT_FORK (1<<1) 94 #define UFFD_FEATURE_EVENT_REMAP (1<<2) 95 #define UFFD_FEATURE_EVENT_REMOVE (1<<3) 96 #define UFFD_FEATURE_MISSING_HUGETLBFS (1<<4) 97 #define UFFD_FEATURE_MISSING_SHMEM (1<<5) 98 #define UFFD_FEATURE_EVENT_UNMAP (1<<6) 99 #define UFFD_FEATURE_SIGBUS (1<<7) 100 #define UFFD_FEATURE_THREAD_ID (1<<8) 101 __u64 features; 102 __u64 ioctls; 103 }; 104 struct uffdio_range { 105 __u64 start; 106 __u64 len; 107 }; 108 struct uffdio_register { 109 struct uffdio_range range; 110 #define UFFDIO_REGISTER_MODE_MISSING ((__u64)1<<0) 111 #define UFFDIO_REGISTER_MODE_WP ((__u64)1<<1) 112 __u64 mode; 113 114 __u64 ioctls; 115 }; 116 struct uffdio_copy { 117 __u64 dst; 118 __u64 src; 119 __u64 len; 120 121 #define UFFDIO_COPY_MODE_DONTWAKE ((__u64)1<<0) 122 __u64 mode; 123 124 __s64 copy; 125 }; 126 struct uffdio_zeropage { 127 struct uffdio_range range; 128 #define UFFDIO_ZEROPAGE_MODE_DONTWAKE ((__u64)1<<0) 129 __u64 mode; 130 131 __s64 zeropage; 132 }; 133 #endif 134