#ifndef VLIBC_SYS_MMAN_H #define VLIBC_SYS_MMAN_H /* * vlibc — . * * Memory mapping, protection, and synchronization (POSIX.1-2008). Every * function here is an unbuffered pass-through to the kernel: failures are * reported as -1 (or MAP_FAILED for mmap) with errno set by the syscall * layer. * * Level 1 (onlyposix): mmap, munmap, mprotect, msync, mlock, munlock, * mlockall, munlockall, posix_madvise. * Level 2 (muslmimic): madvise (XSI — posix_madvise is the POSIX base * form), shm_open, shm_unlink. * * All constant values are Linux x86_64 kernel-UAPI facts (asm-generic/ * mman-common.h and mman.h), transcribed, not invented. PROT_*, MAP_*, * MAP_FAILED, MS_* and MCL_* exist at level 1. The POSIX_MADV_* advice * values match the Linux MADV_* values for the same advice (0-4), which is * what lets posix_madvise pass its advice straight to SYS_madvise; the * Linux MADV_* names themselves are gated at level 2 with madvise, the only * function that takes them. MAP_ANONYMOUS is provided as a source * compatibility alias of the primary spelling MAP_ANON (the BSD/POSIX * draft name glibc also accepts). * * POSIX shared memory (shm_open/shm_unlink, level 2) is backed by a real * named file under /dev/shm (tmpfs), NOT by memfd_create: the object is a * path in the shared-memory filesystem, visible there and re-openable by * name until shm_unlink removes it, which matches POSIX's named-object * semantics. vlibc renders name as "/dev/shm/" + name and requires that * name contain no '/' — the object is a single directory entry, so a slash * would escape the namespace (EINVAL). This differs from the POSIX wording * that a name begin with a slash: vlibc names carry no leading slash and * the prefix is added internally. Otherwise shm_open behaves as open(2) on * the rendered path (the oflag access modes plus O_CREAT/O_EXCL/O_TRUNC and * mode bits are honored; O_WRONLY alone is undefined by POSIX and passed * through to the kernel) and shm_unlink as unlink(2) on it. * * None of these declarations carry an intent attribute: every function * changes the caller's address space or performs I/O with side effects and * reports failures through errno, so const/pure would be unsound (the same * rationale unistd.h documents for its I/O family). */ #include #include #include #ifdef __cplusplus extern "C" { #endif /* ---- memory protection ---- */ #define PROT_NONE 0x0 /* page cannot be accessed */ #define PROT_READ 0x1 /* page can be read */ #define PROT_WRITE 0x2 /* page can be written */ #define PROT_EXEC 0x4 /* page can be executed */ /* ---- mapping types and flags ---- */ #define MAP_SHARED 0x01 /* share changes with the file and other mappers */ #define MAP_PRIVATE 0x02 /* private copy-on-write mapping */ #define MAP_FIXED 0x10 /* interpret addr exactly; fail if it cannot be used */ #define MAP_ANON 0x20 /* anonymous mapping, not file-backed (primary name) */ #define MAP_ANONYMOUS MAP_ANON /* source-compatibility alias of MAP_ANON */ /* Value returned by mmap on failure (never a valid mapping address). */ #define MAP_FAILED ((void *)-1) /* ---- msync synchronization flags ---- */ #define MS_ASYNC 0x1 /* return before the writes take effect */ #define MS_INVALIDATE 0x2 /* invalidate other mappings of the file */ #define MS_SYNC 0x4 /* perform synchronous writes */ /* ---- mlockall flags ---- */ #define MCL_CURRENT 0x1 /* lock all currently mapped pages */ #define MCL_FUTURE 0x2 /* lock all pages mapped in the future */ /* ---- posix_madvise advice (Linux MADV_* values, see the header note) ---- */ #define POSIX_MADV_NORMAL 0 /* no special treatment */ #define POSIX_MADV_RANDOM 1 /* pages will be accessed randomly */ #define POSIX_MADV_SEQUENTIAL 2 /* pages will be accessed sequentially */ #define POSIX_MADV_WILLNEED 3 /* pages will be needed soon */ #define POSIX_MADV_DONTNEED 4 /* pages are not needed soon */ /* * Map len bytes starting at offset off of the object open on fildes into * the process address space and return the mapping address, or MAP_FAILED * with errno set. addr is a hint for the placement (0 for "anywhere") * unless flags contains MAP_FIXED; prot is a combination of PROT_* (PROT_NONE * alone forbids all access). With MAP_ANON fildes is ignored and must be -1 * and off 0; the mapping is zero-filled. The mapping is shared or private * per MAP_SHARED/MAP_PRIVATE. len is rounded up to whole pages. */ void * mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); /* * Remove the mapping at addr (a page boundary) covering len bytes; return * 0, or -1 with errno set. The address range becomes invalid. */ int munmap(void *addr, size_t len); /* * Change the protection of the mapped pages at addr covering len bytes to * prot; return 0, or -1 with errno set. addr must be page-aligned. */ int mprotect(void *addr, size_t len, int prot); /* * Flush the mapped pages at addr covering len bytes of a MAP_SHARED mapping * to (or invalidate them from) the underlying object per flags (MS_ASYNC, * MS_SYNC, MS_INVALIDATE); return 0, or -1 with errno set. */ int msync(void *addr, size_t len, int flags); /* * Lock the pages at addr covering len bytes into memory so they are never * paged out; return 0, or -1 with errno set. munlock unlocks them again. */ int mlock(const void *addr, size_t len); int munlock(const void *addr, size_t len); /* * Lock all pages mapped by the process into memory per flags (MCL_CURRENT, * MCL_FUTURE); return 0, or -1 with errno set. munlockall unlocks them. */ int mlockall(int flags); int munlockall(void); /* * Give the kernel advice (one of the POSIX_MADV_* values) about how the * pages at addr covering len bytes will be used; return 0, or -1 with errno * set. The advice may be ignored; the mapping is unchanged. */ int posix_madvise(void *addr, size_t len, int advice); #if VLIBC_LEVEL_GE(2) /* Level 2 (muslmimic): XSI + POSIX shared memory. */ /* ---- madvise advice (Linux x86_64 kernel-UAPI values) ---- */ #define MADV_NORMAL 0 /* no special treatment */ #define MADV_RANDOM 1 /* pages will be accessed randomly */ #define MADV_SEQUENTIAL 2 /* pages will be accessed sequentially */ #define MADV_WILLNEED 3 /* pages will be needed soon */ #define MADV_DONTNEED 4 /* pages are not needed soon; free them */ #define MADV_FREE 8 /* free pages; contents lost on later write */ #define MADV_REMOVE 9 /* free the pages and punch a hole in the file */ #define MADV_DONTFORK 10 /* do not inherit the pages across fork */ #define MADV_DOFORK 11 /* revert MADV_DONTFORK */ #define MADV_MERGEABLE 12 /* enable KSM merging of the pages */ #define MADV_UNMERGEABLE 13 /* revert MADV_MERGEABLE */ #define MADV_HUGEPAGE 14 /* prefer transparent huge pages */ #define MADV_NOHUGEPAGE 15 /* revert MADV_HUGEPAGE */ #define MADV_DONTDUMP 16 /* exclude the pages from core dumps */ #define MADV_DODUMP 17 /* revert MADV_DONTDUMP */ #define MADV_WIPEONFORK 18 /* zero the pages in the child after fork */ #define MADV_KEEPONFORK 19 /* revert MADV_WIPEONFORK */ #define MADV_COLD 20 /* pages will be accessed less soon */ #define MADV_PAGEOUT 21 /* reclaim the pages immediately */ #define MADV_POPULATE_READ 22 /* fault the pages in for reading */ #define MADV_POPULATE_WRITE 23 /* fault the pages in for writing */ #define MADV_DONTNEED_LOCKED 24 /* like MADV_DONTNEED on locked pages */ #define MADV_COLLAPSE 25 /* collapse the range into a THP */ /* * Linux madvise: give the kernel advice (one of the MADV_* values above) * about the pages at addr covering len bytes; return 0, or -1 with errno * set. XSI — posix_madvise (level 1) is the POSIX base form; this is the * raw Linux interface exposing the full MADV_* set. */ int madvise(void *addr, size_t len, int advice); /* * Open (creating with mode if oflag contains O_CREAT) the POSIX shared * memory object name and return a descriptor, or -1 with errno set. The * object is a file under /dev/shm; name must not contain '/', and the * object persists (re-openable by name) until shm_unlink removes it. See * the header note on the naming deviation. oflag behaves as for open(2). */ int shm_open(const char *name, int oflag, mode_t mode); /* * Remove the shared memory object name from /dev/shm; return 0, or -1 with * errno set. Open descriptors of the object stay valid until closed. See * the header note on the naming deviation. */ int shm_unlink(const char *name); #endif /* VLIBC_LEVEL_GE(2) */ #ifdef __cplusplus } #endif #endif /* VLIBC_SYS_MMAN_H */