Commit | Line | Data |
---|---|---|
1038628d AA |
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 | #define UFFD_API ((__u64)0xAA) | |
3f602d27 PE |
15 | /* FIXME: add "|UFFD_FEATURE_WP" to UFFD_API_FEATURES after implementing it */ |
16 | #define UFFD_API_FEATURES (UFFD_FEATURE_WRITE_BIT) | |
1038628d AA |
17 | #define UFFD_API_IOCTLS \ |
18 | ((__u64)1 << _UFFDIO_REGISTER | \ | |
19 | (__u64)1 << _UFFDIO_UNREGISTER | \ | |
20 | (__u64)1 << _UFFDIO_API) | |
21 | #define UFFD_API_RANGE_IOCTLS \ | |
22 | ((__u64)1 << _UFFDIO_WAKE) | |
23 | ||
24 | /* | |
25 | * Valid ioctl command number range with this API is from 0x00 to | |
26 | * 0x3F. UFFDIO_API is the fixed number, everything else can be | |
27 | * changed by implementing a different UFFD_API. If sticking to the | |
28 | * same UFFD_API more ioctl can be added and userland will be aware of | |
29 | * which ioctl the running kernel implements through the ioctl command | |
30 | * bitmask written by the UFFDIO_API. | |
31 | */ | |
32 | #define _UFFDIO_REGISTER (0x00) | |
33 | #define _UFFDIO_UNREGISTER (0x01) | |
34 | #define _UFFDIO_WAKE (0x02) | |
35 | #define _UFFDIO_API (0x3F) | |
36 | ||
37 | /* userfaultfd ioctl ids */ | |
38 | #define UFFDIO 0xAA | |
39 | #define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \ | |
40 | struct uffdio_api) | |
41 | #define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \ | |
42 | struct uffdio_register) | |
43 | #define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \ | |
44 | struct uffdio_range) | |
45 | #define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \ | |
46 | struct uffdio_range) | |
47 | ||
48 | /* | |
49 | * Valid bits below PAGE_SHIFT in the userfault address read through | |
50 | * the read() syscall. | |
51 | */ | |
52 | #define UFFD_BIT_WRITE (1<<0) /* this was a write fault, MISSING or WP */ | |
53 | #define UFFD_BIT_WP (1<<1) /* handle_userfault() reason VM_UFFD_WP */ | |
54 | #define UFFD_BITS 2 /* two above bits used for UFFD_BIT_* mask */ | |
55 | ||
3f602d27 PE |
56 | /* |
57 | * Features reported in uffdio_api.features field | |
58 | */ | |
59 | #define UFFD_FEATURE_WRITE_BIT (1<<0) /* Corresponds to UFFD_BIT_WRITE */ | |
60 | #define UFFD_FEATURE_WP_BIT (1<<1) /* Corresponds to UFFD_BIT_WP */ | |
61 | ||
1038628d AA |
62 | struct uffdio_api { |
63 | /* userland asks for an API number */ | |
64 | __u64 api; | |
65 | ||
66 | /* kernel answers below with the available features for the API */ | |
3f602d27 | 67 | __u64 features; |
1038628d AA |
68 | __u64 ioctls; |
69 | }; | |
70 | ||
71 | struct uffdio_range { | |
72 | __u64 start; | |
73 | __u64 len; | |
74 | }; | |
75 | ||
76 | struct uffdio_register { | |
77 | struct uffdio_range range; | |
78 | #define UFFDIO_REGISTER_MODE_MISSING ((__u64)1<<0) | |
79 | #define UFFDIO_REGISTER_MODE_WP ((__u64)1<<1) | |
80 | __u64 mode; | |
81 | ||
82 | /* | |
83 | * kernel answers which ioctl commands are available for the | |
84 | * range, keep at the end as the last 8 bytes aren't read. | |
85 | */ | |
86 | __u64 ioctls; | |
87 | }; | |
88 | ||
89 | #endif /* _LINUX_USERFAULTFD_H */ |