11#include " common.hpp"
22#include < cstdint>
3- #include < sys/mman.h >
3+ #include < sys/mman.hpp >
44#include < errno.h>
55#include < util/alloc_buddy.hpp>
66#include < os>
@@ -54,9 +54,11 @@ uintptr_t mmap_allocation_end() {
5454 return alloc->highest_used ();
5555}
5656
57- static void * sys_mmap (void * addr, size_t length, int /* prot*/ , int flags ,
57+ static void * sys_mmap (void * addr, size_t length, int /* prot*/ , int _flags ,
5858 int fd, off_t /* offset*/ )
5959{
60+ using os::mmap::Flags;
61+ const Flags flags = static_cast <Flags>(_flags);
6062
6163 // TODO: Implement minimal functionality to be POSIX compliant
6264 // https://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html
@@ -68,37 +70,38 @@ static void* sys_mmap(void * addr, size_t length, int /*prot*/, int flags,
6870 return MAP_FAILED;
6971 }
7072
71- if ((flags & MAP_ANONYMOUS) == 0 ) {
73+ if (util::missing_flag (flags, Flags::Anonymous) ) {
7274 Expects (false && " We only support MAP_ANONYMOUS calls to mmap()" );
7375 errno = ENOTSUP;
7476 return MAP_FAILED;
7577 }
7678
77- if ((flags & MAP_FIXED) > 0 ) {
79+ if (util::has_flag (flags, Flags::Fixed) ) {
7880 Expects (false && " MAP_FIXED not supported." );
7981 errno = ENOTSUP;
8082 return MAP_FAILED;
8183 }
8284
83- if ((( flags & MAP_PRIVATE) > 0 ) && (( flags & MAP_ANONYMOUS) == 0 )) {
84- Expects (false && " MAP_PRIVATE only supported for MAP_ANONYMOUS " );
85+ if (util::has_flag ( flags, Flags::Private) && util::missing_flag ( flags, Flags::Anonymous )) {
86+ Expects (false && " MAP_PRIVATE only supported for MAP_ANONYMOS " );
8587 errno = ENOTSUP;
8688 return MAP_FAILED;
8789 }
8890
89- if ((( flags & MAP_PRIVATE) > 0 ) && (addr != 0 )) {
91+ if (util::has_flag ( flags, Flags::Private ) && (addr != 0 )) {
9092 Expects (false && " MAP_PRIVATE only supported for new allocations (address=0)." );
9193 errno = ENOTSUP;
9294 return MAP_FAILED;
9395 }
9496
95- if ((( flags & MAP_SHARED) == 0 ) && (( flags & MAP_PRIVATE) == 0 )) {
97+ if (util::missing_flag ( flags, Flags::Shared) && util::missing_flag ( flags, Flags::Private )) {
9698 Expects (false && " MAP_SHARED or MAP_PRIVATE must be set." );
9799 errno = ENOTSUP;
98100 return MAP_FAILED;
99101 }
100102
101103 // If we get here, the following should be true:
104+ //
102105 // MAP_ANONYMOUS set + MAP_SHARED or MAP_PRIVATE
103106 // fd should be 0, address should be 0 for MAP_PRIVATE
104107 // (address is in any case ignored)
0 commit comments