1/**
2 * D header file for GNU/Linux
3 *
4 * Authors: Martin Nowak
5 */
6module core.sys.linux.sys.mman;
7
8version (linux):
9extern (C):
10nothrow:
11@system:
12@nogc:
13
14version (ARM)     version = ARM_Any;
15version (AArch64) version = ARM_Any;
16version (HPPA)    version = HPPA_Any;
17version (HPPA64)  version = HPPA_Any;
18version (MIPS32)  version = MIPS_Any;
19version (MIPS64)  version = MIPS_Any;
20version (PPC)     version = PPC_Any;
21version (PPC64)   version = PPC_Any;
22version (RISCV32) version = RISCV_Any;
23version (RISCV64) version = RISCV_Any;
24version (S390)    version = IBMZ_Any;
25version (SPARC)   version = SPARC_Any;
26version (SPARC64) version = SPARC_Any;
27version (SystemZ) version = IBMZ_Any;
28version (X86)     version = X86_Any;
29version (X86_64)  version = X86_Any;
30
31public import core.sys.posix.sys.mman;
32import core.sys.linux.config;
33
34// <bits/mman.h>
35// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/mman.h
36version (PPC_Any)
37{
38    enum PROT_SAO = 0x10;
39
40    static if (_DEFAULT_SOURCE) enum
41    {
42        MAP_GROWSDOWN = 0x00100,
43        MAP_DENYWRITE = 0x00800,
44        MAP_EXECUTABLE = 0x01000,
45        MAP_LOCKED = 0x00080,
46        MAP_NORESERVE = 0x00040,
47        MAP_POPULATE = 0x08000,
48        MAP_NONBLOCK = 0x10000,
49        MAP_STACK = 0x20000,
50        MAP_HUGETLB = 0x40000,
51    }
52
53    // in core.sys.posix.sys.mman
54    // enum
55    // {
56    //     MCL_CURRENT = 0x2000,
57    //     MCL_FUTURE = 0x4000,
58    // }
59}
60// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/riscv/bits/mman.h
61else version (RISCV_Any)
62{
63    static if (_DEFAULT_SOURCE) enum
64    {
65        MAP_GROWSDOWN = 0x00100,
66        MAP_DENYWRITE = 0x00800,
67        MAP_EXECUTABLE = 0x01000,
68        MAP_LOCKED = 0x02000,
69        MAP_NORESERVE = 0x04000,
70        MAP_POPULATE = 0x08000,
71        MAP_NONBLOCK = 0x10000,
72        MAP_STACK = 0x20000,
73        MAP_HUGETLB = 0x40000,
74        MAP_SYNC = 0x80000,
75        MAP_FIXED_NOREPLACE = 0x100000,
76    }
77
78    // in core.sys.posix.sys.mman
79    // enum
80    // {
81    //     MCL_CURRENT = 0x2000,
82    //     MCL_FUTURE = 0x4000,
83    // }
84}
85// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/mman.h
86else version (IBMZ_Any)
87{
88    static if (_DEFAULT_SOURCE) enum
89    {
90        MAP_GROWSDOWN = 0x00100,
91        MAP_DENYWRITE = 0x00800,
92        MAP_EXECUTABLE = 0x01000,
93        MAP_LOCKED = 0x02000,
94        MAP_NORESERVE = 0x04000,
95        MAP_POPULATE = 0x08000,
96        MAP_NONBLOCK = 0x10000,
97        MAP_STACK = 0x20000,
98        MAP_HUGETLB = 0x40000,
99    }
100}
101// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sh/bits/mman.h
102else version (SH)
103{
104    static if (_DEFAULT_SOURCE) enum
105    {
106        MAP_GROWSDOWN = 0x0100,
107        MAP_DENYWRITE = 0x0800,
108        MAP_EXECUTABLE = 0x1000,
109        MAP_LOCKED = 0x2000,
110        MAP_NORESERVE = 0x4000,
111        MAP_POPULATE = 0x8000,
112        MAP_NONBLOCK = 0x10000,
113        MAP_STACK = 0x20000,
114        MAP_HUGETLB = 0x40000,
115    }
116}
117// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/mman.h
118else version (SPARC_Any)
119{
120    static if (_DEFAULT_SOURCE) enum
121    {
122        MAP_GROWSDOWN = 0x0200,
123        MAP_DENYWRITE = 0x0800,
124        MAP_EXECUTABLE = 0x1000,
125        MAP_LOCKED = 0x0100,
126        MAP_NORESERVE = 0x0040,
127        _MAP_NEW = 0x80000000,
128        MAP_POPULATE = 0x8000,
129        MAP_NONBLOCK = 0x10000,
130        MAP_STACK = 0x20000,
131        MAP_HUGETLB = 0x40000,
132    }
133
134    // in core.sys.posix.sys.mman
135    // enum
136    // {
137    //     MCL_CURRENT = 0x2000,
138    //     MCL_FUTURE = 0x4000,
139    // }
140}
141// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/mman.h
142else version (X86_Any)
143{
144    static if (_DEFAULT_SOURCE) enum MAP_32BIT = 0x40;
145
146    static if (_DEFAULT_SOURCE) enum
147    {
148        MAP_GROWSDOWN = 0x00100,
149        MAP_DENYWRITE = 0x00800,
150        MAP_EXECUTABLE = 0x01000,
151        MAP_LOCKED = 0x02000,
152        MAP_NORESERVE = 0x04000,
153        MAP_POPULATE = 0x08000,
154        MAP_NONBLOCK = 0x10000,
155        MAP_STACK = 0x20000,
156        MAP_HUGETLB = 0x40000,
157    }
158}
159// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/aarch64/bits/mman.h
160else version (AArch64)
161{
162    static if (_DEFAULT_SOURCE) enum
163    {
164        MAP_GROWSDOWN = 0x00100,
165        MAP_DENYWRITE = 0x00800,
166        MAP_EXECUTABLE = 0x01000,
167        MAP_LOCKED = 0x02000,
168        MAP_NORESERVE = 0x04000,
169        MAP_POPULATE = 0x08000,
170        MAP_NONBLOCK = 0x10000,
171        MAP_STACK = 0x20000,
172        MAP_HUGETLB = 0x40000,
173    }
174}
175// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/alpha/bits/mman.h
176else version (Alpha)
177{
178    enum
179    {
180        PROT_READ = 0x1,
181        PROT_WRITE = 0x2,
182        PROT_EXEC = 0x4,
183        PROT_NONE = 0x0,
184        PROT_GROWSDOWN = 0x01000000,
185        PROT_GROWSUP = 0x02000000,
186    }
187
188    enum MAP_SHARED = 0x01;
189    enum MAP_PRIVATE = 0x02;
190    static if (_DEFAULT_SOURCE)
191        enum MAP_TYPE = 0x0f;
192
193    enum MAP_FIXED = 0x10;
194    static if (_DEFAULT_SOURCE) enum
195    {
196        MAP_FILE = 0,
197        MAP_ANONYMOUS = MAP_ANON,
198        // in core.sys.posix.sys.mman
199        // MAP_ANON = MAP_ANONYMOUS,
200        MAP_HUGE_SHIFT = 26,
201        MAP_HUGE_MASK = 0x3f,
202    }
203
204    static if (_DEFAULT_SOURCE) enum
205    {
206        MAP_GROWSDOWN = 0x01000,
207        MAP_DENYWRITE = 0x02000,
208        MAP_EXECUTABLE = 0x04000,
209        MAP_LOCKED = 0x08000,
210        MAP_NORESERVE = 0x10000,
211        MAP_POPULATE = 0x20000,
212        MAP_NONBLOCK = 0x40000,
213        MAP_STACK = 0x80000,
214        MAP_HUGETLB = 0x100000,
215    }
216
217    // in core.sys.posix.sys.mman
218    // enum
219    // {
220    //     MS_ASYNC = 1,
221    //     MS_SYNC = 2,
222    //     MS_INVALIDATE = 4,
223    // }
224
225    // in core.sys.posix.sys.mman
226    // enum
227    // {
228    //     MCL_CURRENT = 8192,
229    //     MCL_FUTURE = 16384,
230    // }
231
232    static if (_GNU_SOURCE) enum
233    {
234        MREMAP_MAYMOVE = 1,
235        MREMAP_FIXED = 2,
236    }
237
238    static if (_DEFAULT_SOURCE) enum
239    {
240        MADV_NORMAL = 0,
241        MADV_RANDOM = 1,
242        MADV_SEQUENTIAL = 2,
243        MADV_WILLNEED = 3,
244        MADV_DONTNEED = 6,
245        MADV_REMOVE = 9,
246        MADV_DONTFORK = 10,
247        MADV_DOFORK = 11,
248        MADV_MERGEABLE = 12,
249        MADV_UNMERGEABLE = 13,
250        MADV_HUGEPAGE = 14,
251        MADV_NOHUGEPAGE = 15,
252        MADV_DONTDUMP = 16,
253        MADV_DODUMP = 17,
254        MADV_HWPOISON = 100,
255    }
256
257    // in core.sys.posix.sys.mman
258    // static if (_XOPEN_SOURCE >= 600) enum
259    // {
260    //         POSIX_MADV_NORMAL = 0,
261    //         POSIX_MADV_RANDOM = 1,
262    //         POSIX_MADV_SEQUENTIAL = 2,
263    //         POSIX_MADV_WILLNEED = 3,
264    //         POSIX_MADV_DONTNEED = 6,
265    // }
266}
267// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/arm/bits/mman.h
268else version (ARM)
269{
270    static if (_DEFAULT_SOURCE) enum
271    {
272        MAP_GROWSDOWN = 0x00100,
273        MAP_DENYWRITE = 0x00800,
274        MAP_EXECUTABLE = 0x01000,
275        MAP_LOCKED = 0x02000,
276        MAP_NORESERVE = 0x04000,
277        MAP_POPULATE = 0x08000,
278        MAP_NONBLOCK = 0x10000,
279        MAP_STACK = 0x20000,
280        MAP_HUGETLB = 0x40000,
281    }
282}
283// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/hppa/bits/mman.h
284else version (HPPA_Any)
285{
286    enum
287    {
288        PROT_READ = 0x1,
289        PROT_WRITE = 0x2,
290        PROT_EXEC = 0x4,
291        PROT_NONE = 0x0,
292        PROT_GROWSDOWN = 0x01000000,
293        PROT_GROWSUP = 0x02000000,
294    }
295
296    enum MAP_SHARED = 0x01;
297    enum MAP_PRIVATE = 0x02;
298    static if (_DEFAULT_SOURCE)
299        enum MAP_TYPE = 0x0f;
300
301    enum MAP_FIXED = 0x04;
302    static if (_DEFAULT_SOURCE) enum
303    {
304        MAP_FILE = 0,
305        MAP_ANONYMOUS = MAP_ANON,
306        // in core.sys.posix.sys.mman
307        // MAP_ANON = MAP_ANONYMOUS,
308        MAP_VARIABLE = 0,
309        MAP_HUGE_SHIFT = 26,
310        MAP_HUGE_MASK = 0x3f,
311    }
312
313    static if (_DEFAULT_SOURCE) enum
314    {
315        MAP_DENYWRITE = 0x0800,
316        MAP_EXECUTABLE = 0x1000,
317        MAP_LOCKED = 0x2000,
318        MAP_NORESERVE = 0x4000,
319        MAP_GROWSDOWN = 0x8000,
320        MAP_POPULATE = 0x10000,
321        MAP_NONBLOCK = 0x20000,
322    }
323
324    // in core.sys.posix.sys.mman
325    // enum
326    // {
327    //     MS_ASYNC = 1,
328    //     MS_SYNC = 2,
329    //     MS_INVALIDATE = 4,
330    // }
331
332    // in core.sys.posix.sys.mman
333    // enum
334    // {
335    //     MCL_CURRENT = 1,
336    //     MCL_FUTURE = 2,
337    // }
338
339    static if (_GNU_SOURCE) enum
340    {
341        MREMAP_MAYMOVE = 1,
342        MREMAP_FIXED = 2,
343    }
344
345    static if (_DEFAULT_SOURCE) enum
346    {
347        MADV_NORMAL = 0,
348        MADV_RANDOM = 1,
349        MADV_SEQUENTIAL = 2,
350        MADV_WILLNEED = 3,
351        MADV_DONTNEED = 4,
352        MADV_SPACEAVAIL = 5,
353        MADV_VPS_PURGE = 6,
354        MADV_VPS_INHERIT = 7,
355        MADV_REMOVE = 9,
356        MADV_DONTFORK = 10,
357        MADV_DOFORK = 11,
358        MADV_MERGEABLE = 65,
359        MADV_UNMERGEABLE = 66,
360        MADV_HUGEPAGE = 67,
361        MADV_NOHUGEPAGE = 68,
362        MADV_DONTDUMP = 69,
363    }
364
365    deprecated("MADV_*_PAGES are gone and never had any effect") enum
366    {
367        MADV_4K_PAGES = 12,
368        MADV_16K_PAGES = 14,
369        MADV_64K_PAGES = 16,
370        MADV_256K_PAGES = 18,
371        MADV_1M_PAGES = 20,
372        MADV_4M_PAGES = 22,
373        MADV_16M_PAGES = 24,
374        MADV_64M_PAGES = 26,
375    }
376
377    // in core.sys.posix.sys.mman
378    // static if (_XOPEN_SOURCE >= 600) enum
379    // {
380    //     POSIX_MADV_NORMAL = 0,
381    //     POSIX_MADV_RANDOM = 1,
382    //     POSIX_MADV_SEQUENTIAL = 2,
383    //     POSIX_MADV_WILLNEED = 3,
384    //     POSIX_MADV_DONTNEED = 4,
385    // }
386}
387// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/ia64/bits/mman.h
388else version (IA64)
389{
390    static if (_DEFAULT_SOURCE) enum
391    {
392        MAP_GROWSDOWN = 0x00100,
393        MAP_GROWSUP = 0x00200,
394        MAP_DENYWRITE = 0x00800,
395        MAP_EXECUTABLE = 0x01000,
396        MAP_LOCKED = 0x02000,
397        MAP_NORESERVE = 0x04000,
398        MAP_POPULATE = 0x08000,
399        MAP_NONBLOCK = 0x10000,
400        MAP_STACK = 0x20000,
401        MAP_HUGETLB = 0x40000,
402    }
403}
404// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/m68k/bits/mman.h
405else version (M68K)
406{
407    static if (_DEFAULT_SOURCE) enum
408    {
409        MAP_GROWSDOWN = 0x00100,
410        MAP_DENYWRITE = 0x00800,
411        MAP_EXECUTABLE = 0x01000,
412        MAP_LOCKED = 0x02000,
413        MAP_NORESERVE = 0x04000,
414        MAP_POPULATE = 0x08000,
415        MAP_NONBLOCK = 0x10000,
416        MAP_STACK = 0x20000,
417        MAP_HUGETLB = 0x40000,
418    }
419}
420// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/mman.h
421else version (MIPS_Any)
422{
423    static if (_DEFAULT_SOURCE) enum
424    {
425        MAP_NORESERVE = 0x0400,
426        MAP_GROWSDOWN = 0x1000,
427        MAP_DENYWRITE = 0x2000,
428        MAP_EXECUTABLE = 0x4000,
429        MAP_LOCKED = 0x8000,
430        MAP_POPULATE = 0x10000,
431        MAP_NONBLOCK = 0x20000,
432        MAP_STACK = 0x40000,
433        MAP_HUGETLB = 0x80000,
434    }
435}
436else
437{
438    static assert(0, "unimplemented");
439}
440
441
442// <bits/mman-linux.h>
443// https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/mman-linux.h
444version (Alpha)
445{
446}
447else version (HPPA_Any)
448{
449}
450else
451{
452    // in core.sys.posix.sys.mman
453    // enum PROT_READ = 0x1;
454    // enum PROT_WRITE = 0x2;
455    // enum PROT_EXEC = 0x4;
456    // enum PROT_NONE = 0x0;
457
458    enum PROT_GROWSDOWN = 0x01000000;
459    enum PROT_GROWSUP = 0x02000000;
460
461    enum MAP_SHARED = 0x01;
462    enum MAP_PRIVATE = 0x02;
463    static if (_DEFAULT_SOURCE)
464        enum MAP_TYPE = 0x0f;
465
466    enum MAP_FIXED = 0x10;
467    static if (_DEFAULT_SOURCE) enum
468    {
469        MAP_FILE = 0,
470        MAP_ANONYMOUS = MAP_ANON,
471        // in core.sys.posix.sys.mman
472        // MAP_ANON = 0xXX,
473        MAP_HUGE_SHIFT = 26,
474        MAP_HUGE_MASK = 0x3f,
475    }
476
477    // in core.sys.posix.sys.mman
478    // enum
479    // {
480    //     MS_ASYNC = 1,
481    //     MS_SYNC = 4,
482    //     MS_INVALIDATE = 2,
483    // }
484
485    static if (_GNU_SOURCE) enum
486    {
487        MREMAP_MAYMOVE = 1,
488        MREMAP_FIXED = 2,
489    }
490
491    static if (_DEFAULT_SOURCE) enum
492    {
493        MADV_NORMAL = 0,
494        MADV_RANDOM = 1,
495        MADV_SEQUENTIAL = 2,
496        MADV_WILLNEED = 3,
497        MADV_DONTNEED = 4,
498        MADV_REMOVE = 9,
499        MADV_DONTFORK = 10,
500        MADV_DOFORK = 11,
501        MADV_MERGEABLE = 12,
502        MADV_UNMERGEABLE = 13,
503        MADV_HUGEPAGE = 14,
504        MADV_NOHUGEPAGE = 15,
505        MADV_DONTDUMP = 16,
506        MADV_DODUMP = 17,
507        MADV_HWPOISON = 100,
508    }
509
510    // in core.sys.posix.sys.mman
511    // static if (_XOPEN_SOURCE >= 600) enum
512    // {
513    //     POSIX_MADV_NORMAL = 0,
514    //     POSIX_MADV_RANDOM = 1,
515    //     POSIX_MADV_SEQUENTIAL = 2,
516    //     POSIX_MADV_WILLNEED = 3,
517    //     POSIX_MADV_DONTNEED = 4,
518    // }
519
520    // in core.sys.posix.sys.mman
521    // enum
522    // {
523    //
524    //     MCL_CURRENT = 1,
525    //     MCL_FUTURE = 2,
526    // }
527}
528
529// Workaround https://issues.dlang.org/show_bug.cgi?id=17883
530// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/mman.h
531version (SPARC_Any)
532{
533    static if (_DEFAULT_SOURCE) enum MAP_RENAME = MAP_ANONYMOUS;
534}
535// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/mman.h
536else version (MIPS_Any)
537{
538    static if (_DEFAULT_SOURCE) enum MAP_RENAME = MAP_ANONYMOUS;
539}
540
541// http://sourceware.org/git/?p=glibc.git;a=blob;f=misc/sys/mman.h
542// in core.sys.posix.sys.mman
543// static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off_t);
544// static if (__USE_FILE_OFFSET64)
545//     alias mmap64 mmap;
546// else
547//     void* mmap(void*, size_t, int, int, int, off_t);
548// int munmap(void*, size_t);
549// int mprotect(void *__addr, size_t __len, int __prot);
550// int msync(void *__addr, size_t __len, int __flags);
551static if (_DEFAULT_SOURCE) int madvise(void *__addr, size_t __len, int __advice);
552// static if (_XOPEN_SOURCE >= 600) int posix_madvise(void *__addr, size_t __len, int __advice);
553// int mlock(const(void) *__addr, size_t __len);
554// int munlock(const(void) *__addr, size_t __len);
555// int mlockall(int __flags);
556// int munlockall();
557static if (_DEFAULT_SOURCE) int mincore(void *__start, size_t __len, ubyte *__vec);
558static if (_GNU_SOURCE) void *mremap(void *__addr, size_t __old_len, size_t __new_len, int __flags, ...);
559static if (_GNU_SOURCE) int remap_file_pages(void *__start, size_t __size, int __prot, size_t __pgoff, int __flags);
560// int shm_open(in char *__name, int __oflag, mode_t __mode);
561// int shm_unlink(in char *__name);
562