rustix/backend/linux_raw/mm/types.rs
1use crate::ffi;
2use bitflags::bitflags;
3
4bitflags! {
5 /// `PROT_*` flags for use with [`mmap`].
6 ///
7 /// For `PROT_NONE`, use `ProtFlags::empty()`.
8 ///
9 /// [`mmap`]: crate::mm::mmap
10 #[repr(transparent)]
11 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
12 pub struct ProtFlags: u32 {
13 /// `PROT_READ`
14 const READ = linux_raw_sys::general::PROT_READ;
15 /// `PROT_WRITE`
16 const WRITE = linux_raw_sys::general::PROT_WRITE;
17 /// `PROT_EXEC`
18 const EXEC = linux_raw_sys::general::PROT_EXEC;
19
20 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
21 const _ = !0;
22 }
23}
24
25bitflags! {
26 /// `PROT_*` flags for use with [`mprotect`].
27 ///
28 /// For `PROT_NONE`, use `MprotectFlags::empty()`.
29 ///
30 /// [`mprotect`]: crate::mm::mprotect
31 #[repr(transparent)]
32 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
33 pub struct MprotectFlags: u32 {
34 /// `PROT_READ`
35 const READ = linux_raw_sys::general::PROT_READ;
36 /// `PROT_WRITE`
37 const WRITE = linux_raw_sys::general::PROT_WRITE;
38 /// `PROT_EXEC`
39 const EXEC = linux_raw_sys::general::PROT_EXEC;
40 /// `PROT_GROWSUP`
41 const GROWSUP = linux_raw_sys::general::PROT_GROWSUP;
42 /// `PROT_GROWSDOWN`
43 const GROWSDOWN = linux_raw_sys::general::PROT_GROWSDOWN;
44 /// `PROT_SEM`
45 const SEM = linux_raw_sys::general::PROT_SEM;
46 /// `PROT_BTI`
47 #[cfg(target_arch = "aarch64")]
48 const BTI = linux_raw_sys::general::PROT_BTI;
49 /// `PROT_MTE`
50 #[cfg(target_arch = "aarch64")]
51 const MTE = linux_raw_sys::general::PROT_MTE;
52 /// `PROT_SAO`
53 #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))]
54 const SAO = linux_raw_sys::general::PROT_SAO;
55 /// `PROT_ADI`
56 #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))]
57 const ADI = linux_raw_sys::general::PROT_ADI;
58
59 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
60 const _ = !0;
61 }
62}
63
64bitflags! {
65 /// `MAP_*` flags for use with [`mmap`].
66 ///
67 /// For `MAP_ANONYMOUS` (aka `MAP_ANON`), see [`mmap_anonymous`].
68 ///
69 /// [`mmap`]: crate::mm::mmap
70 /// [`mmap_anonymous`]: crates::mm::mmap_anonymous
71 #[repr(transparent)]
72 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
73 pub struct MapFlags: u32 {
74 /// `MAP_SHARED`
75 const SHARED = linux_raw_sys::general::MAP_SHARED;
76 /// `MAP_SHARED_VALIDATE` (since Linux 4.15)
77 const SHARED_VALIDATE = linux_raw_sys::general::MAP_SHARED_VALIDATE;
78 /// `MAP_PRIVATE`
79 const PRIVATE = linux_raw_sys::general::MAP_PRIVATE;
80 /// `MAP_DENYWRITE`
81 const DENYWRITE = linux_raw_sys::general::MAP_DENYWRITE;
82 /// `MAP_FIXED`
83 const FIXED = linux_raw_sys::general::MAP_FIXED;
84 /// `MAP_FIXED_NOREPLACE` (since Linux 4.17)
85 const FIXED_NOREPLACE = linux_raw_sys::general::MAP_FIXED_NOREPLACE;
86 /// `MAP_GROWSDOWN`
87 const GROWSDOWN = linux_raw_sys::general::MAP_GROWSDOWN;
88 /// `MAP_HUGETLB`
89 const HUGETLB = linux_raw_sys::general::MAP_HUGETLB;
90 /// `MAP_HUGE_2MB` (since Linux 3.8)
91 const HUGE_2MB = linux_raw_sys::general::MAP_HUGE_2MB;
92 /// `MAP_HUGE_1GB` (since Linux 3.8)
93 const HUGE_1GB = linux_raw_sys::general::MAP_HUGE_1GB;
94 /// `MAP_LOCKED`
95 const LOCKED = linux_raw_sys::general::MAP_LOCKED;
96 /// `MAP_NORESERVE`
97 const NORESERVE = linux_raw_sys::general::MAP_NORESERVE;
98 /// `MAP_POPULATE`
99 const POPULATE = linux_raw_sys::general::MAP_POPULATE;
100 /// `MAP_STACK`
101 const STACK = linux_raw_sys::general::MAP_STACK;
102 /// `MAP_SYNC` (since Linux 4.15)
103 #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6")))]
104 const SYNC = linux_raw_sys::general::MAP_SYNC;
105 /// `MAP_UNINITIALIZED`
106 #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6")))]
107 const UNINITIALIZED = linux_raw_sys::general::MAP_UNINITIALIZED;
108 /// `MAP_DROPPABLE`
109 const DROPPABLE = linux_raw_sys::general::MAP_DROPPABLE;
110
111 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
112 const _ = !0;
113 }
114}
115
116bitflags! {
117 /// `MREMAP_*` flags for use with [`mremap`].
118 ///
119 /// For `MREMAP_FIXED`, see [`mremap_fixed`].
120 ///
121 /// [`mremap`]: crate::mm::mremap
122 /// [`mremap_fixed`]: crate::mm::mremap_fixed
123 #[repr(transparent)]
124 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
125 pub struct MremapFlags: u32 {
126 /// `MREMAP_MAYMOVE`
127 const MAYMOVE = linux_raw_sys::general::MREMAP_MAYMOVE;
128 /// `MREMAP_DONTUNMAP` (since Linux 5.7)
129 const DONTUNMAP = linux_raw_sys::general::MREMAP_DONTUNMAP;
130
131 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
132 const _ = !0;
133 }
134}
135
136bitflags! {
137 /// `MS_*` flags for use with [`msync`].
138 ///
139 /// [`msync`]: crate::mm::msync
140 #[repr(transparent)]
141 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
142 pub struct MsyncFlags: u32 {
143 /// `MS_SYNC`—Requests an update and waits for it to complete.
144 const SYNC = linux_raw_sys::general::MS_SYNC;
145 /// `MS_ASYNC`—Specifies that an update be scheduled, but the call
146 /// returns immediately.
147 const ASYNC = linux_raw_sys::general::MS_ASYNC;
148 /// `MS_INVALIDATE`—Asks to invalidate other mappings of the same
149 /// file (so that they can be updated with the fresh values just
150 /// written).
151 const INVALIDATE = linux_raw_sys::general::MS_INVALIDATE;
152
153 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
154 const _ = !0;
155 }
156}
157
158bitflags! {
159 /// `MLOCK_*` flags for use with [`mlock_with`].
160 ///
161 /// [`mlock_with`]: crate::mm::mlock_with
162 #[repr(transparent)]
163 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
164 pub struct MlockFlags: u32 {
165 /// `MLOCK_ONFAULT`
166 const ONFAULT = linux_raw_sys::general::MLOCK_ONFAULT;
167
168 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
169 const _ = !0;
170 }
171}
172
173/// `POSIX_MADV_*` constants for use with [`madvise`].
174///
175/// [`madvise`]: crate::mm::madvise
176#[derive(Debug, Copy, Clone, Eq, PartialEq)]
177#[repr(u32)]
178#[non_exhaustive]
179pub enum Advice {
180 /// `POSIX_MADV_NORMAL`
181 Normal = linux_raw_sys::general::MADV_NORMAL,
182
183 /// `POSIX_MADV_SEQUENTIAL`
184 Sequential = linux_raw_sys::general::MADV_SEQUENTIAL,
185
186 /// `POSIX_MADV_RANDOM`
187 Random = linux_raw_sys::general::MADV_RANDOM,
188
189 /// `POSIX_MADV_WILLNEED`
190 WillNeed = linux_raw_sys::general::MADV_WILLNEED,
191
192 /// `MADV_DONTNEED`
193 LinuxDontNeed = linux_raw_sys::general::MADV_DONTNEED,
194
195 /// `MADV_FREE` (since Linux 4.5)
196 LinuxFree = linux_raw_sys::general::MADV_FREE,
197 /// `MADV_REMOVE`
198 LinuxRemove = linux_raw_sys::general::MADV_REMOVE,
199 /// `MADV_DONTFORK`
200 LinuxDontFork = linux_raw_sys::general::MADV_DONTFORK,
201 /// `MADV_DOFORK`
202 LinuxDoFork = linux_raw_sys::general::MADV_DOFORK,
203 /// `MADV_HWPOISON`
204 LinuxHwPoison = linux_raw_sys::general::MADV_HWPOISON,
205 /// `MADV_SOFT_OFFLINE`
206 #[cfg(not(any(
207 target_arch = "mips",
208 target_arch = "mips32r6",
209 target_arch = "mips64",
210 target_arch = "mips64r6"
211 )))]
212 LinuxSoftOffline = linux_raw_sys::general::MADV_SOFT_OFFLINE,
213 /// `MADV_MERGEABLE`
214 LinuxMergeable = linux_raw_sys::general::MADV_MERGEABLE,
215 /// `MADV_UNMERGEABLE`
216 LinuxUnmergeable = linux_raw_sys::general::MADV_UNMERGEABLE,
217 /// `MADV_HUGEPAGE`
218 LinuxHugepage = linux_raw_sys::general::MADV_HUGEPAGE,
219 /// `MADV_NOHUGEPAGE`
220 LinuxNoHugepage = linux_raw_sys::general::MADV_NOHUGEPAGE,
221 /// `MADV_DONTDUMP` (since Linux 3.4)
222 LinuxDontDump = linux_raw_sys::general::MADV_DONTDUMP,
223 /// `MADV_DODUMP` (since Linux 3.4)
224 LinuxDoDump = linux_raw_sys::general::MADV_DODUMP,
225 /// `MADV_WIPEONFORK` (since Linux 4.14)
226 LinuxWipeOnFork = linux_raw_sys::general::MADV_WIPEONFORK,
227 /// `MADV_KEEPONFORK` (since Linux 4.14)
228 LinuxKeepOnFork = linux_raw_sys::general::MADV_KEEPONFORK,
229 /// `MADV_COLD` (since Linux 5.4)
230 LinuxCold = linux_raw_sys::general::MADV_COLD,
231 /// `MADV_PAGEOUT` (since Linux 5.4)
232 LinuxPageOut = linux_raw_sys::general::MADV_PAGEOUT,
233 /// `MADV_POPULATE_READ` (since Linux 5.14)
234 LinuxPopulateRead = linux_raw_sys::general::MADV_POPULATE_READ,
235 /// `MADV_POPULATE_WRITE` (since Linux 5.14)
236 LinuxPopulateWrite = linux_raw_sys::general::MADV_POPULATE_WRITE,
237 /// `MADV_DONTNEED_LOCKED` (since Linux 5.18)
238 LinuxDontneedLocked = linux_raw_sys::general::MADV_DONTNEED_LOCKED,
239}
240
241#[allow(non_upper_case_globals)]
242impl Advice {
243 /// `POSIX_MADV_DONTNEED`
244 ///
245 /// On Linux, this is mapped to `POSIX_MADV_NORMAL` because Linux's
246 /// `MADV_DONTNEED` differs from `POSIX_MADV_DONTNEED`. See `LinuxDontNeed`
247 /// for the Linux behavior.
248 pub const DontNeed: Self = Self::Normal;
249}
250
251bitflags! {
252 /// `O_*` flags for use with [`userfaultfd`].
253 ///
254 /// [`userfaultfd`]: crate::mm::userfaultfd
255 #[repr(transparent)]
256 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
257 pub struct UserfaultfdFlags: ffi::c_uint {
258 /// `O_CLOEXEC`
259 const CLOEXEC = linux_raw_sys::general::O_CLOEXEC;
260 /// `O_NONBLOCK`
261 const NONBLOCK = linux_raw_sys::general::O_NONBLOCK;
262
263 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
264 const _ = !0;
265 }
266}
267
268bitflags! {
269 /// `MCL_*` flags for use with [`mlockall`].
270 ///
271 /// [`mlockall`]: crate::mm::mlockall
272 #[repr(transparent)]
273 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
274 pub struct MlockAllFlags: u32 {
275 /// Used together with `MCL_CURRENT`, `MCL_FUTURE`, or both. Mark all
276 /// current (with `MCL_CURRENT`) or future (with `MCL_FUTURE`) mappings
277 /// to lock pages when they are faulted in. When used with
278 /// `MCL_CURRENT`, all present pages are locked, but `mlockall` will
279 /// not fault in non-present pages. When used with `MCL_FUTURE`, all
280 /// future mappings will be marked to lock pages when they are faulted
281 /// in, but they will not be populated by the lock when the mapping is
282 /// created. `MCL_ONFAULT` must be used with either `MCL_CURRENT` or
283 /// `MCL_FUTURE` or both.
284 const ONFAULT = linux_raw_sys::general::MCL_ONFAULT;
285 /// Lock all pages which will become mapped into the address space of
286 /// the process in the future. These could be, for instance, new pages
287 /// required by a growing heap and stack as well as new memory-mapped
288 /// files or shared memory regions.
289 const FUTURE = linux_raw_sys::general::MCL_FUTURE;
290 /// Lock all pages which are currently mapped into the address space of
291 /// the process.
292 const CURRENT = linux_raw_sys::general::MCL_CURRENT;
293
294 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
295 const _ = !0;
296 }
297}