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