Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_mmap.c
Show First 20 Lines • Show All 214 Lines • ▼ Show 20 Lines | #endif | ||||
size = uap->len; | size = uap->len; | ||||
prot = uap->prot; | prot = uap->prot; | ||||
flags = uap->flags; | flags = uap->flags; | ||||
pos = uap->pos; | pos = uap->pos; | ||||
fp = NULL; | fp = NULL; | ||||
/* | /* | ||||
* Ignore old flags that used to be defined but did not do anything. | |||||
*/ | |||||
if (td->td_proc->p_osrel < P_OSREL_MAP_RENAME) | |||||
flags &= ~(MAP_RESERVED0020 | MAP_RESERVED0040); | |||||
/* | |||||
* Enforce the constraints. | * Enforce the constraints. | ||||
* Mapping of length 0 is only allowed for old binaries. | * Mapping of length 0 is only allowed for old binaries. | ||||
* Anonymous mapping shall specify -1 as filedescriptor and | * Anonymous mapping shall specify -1 as filedescriptor and | ||||
* zero position for new code. Be nice to ancient a.out | * zero position for new code. Be nice to ancient a.out | ||||
* binaries and correct pos for anonymous mapping, since old | * binaries and correct pos for anonymous mapping, since old | ||||
* ld.so sometimes issues anonymous map requests with non-zero | * ld.so sometimes issues anonymous map requests with non-zero | ||||
* pos. | * pos. | ||||
*/ | */ | ||||
if (!SV_CURPROC_FLAG(SV_AOUT)) { | if (!SV_CURPROC_FLAG(SV_AOUT)) { | ||||
if ((uap->len == 0 && curproc->p_osrel >= P_OSREL_MAP_ANON) || | if ((uap->len == 0 && curproc->p_osrel >= P_OSREL_MAP_ANON) || | ||||
((flags & MAP_ANON) != 0 && (uap->fd != -1 || pos != 0))) | ((flags & MAP_ANON) != 0 && (uap->fd != -1 || pos != 0))) | ||||
return (EINVAL); | return (EINVAL); | ||||
} else { | } else { | ||||
if ((flags & MAP_ANON) != 0) | if ((flags & MAP_ANON) != 0) | ||||
pos = 0; | pos = 0; | ||||
} | } | ||||
if (flags & MAP_STACK) { | if (flags & MAP_STACK) { | ||||
if ((uap->fd != -1) || | if ((uap->fd != -1) || | ||||
((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE))) | ((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE))) | ||||
return (EINVAL); | return (EINVAL); | ||||
flags |= MAP_ANON; | flags |= MAP_ANON; | ||||
pos = 0; | pos = 0; | ||||
} | } | ||||
if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_RENAME | | if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_HASSEMAPHORE | | ||||
MAP_NORESERVE | MAP_HASSEMAPHORE | MAP_STACK | MAP_NOSYNC | | MAP_STACK | MAP_NOSYNC | MAP_ANON | MAP_EXCL | MAP_NOCORE | | ||||
MAP_ANON | MAP_EXCL | MAP_NOCORE | MAP_PREFAULT_READ | | MAP_PREFAULT_READ | | ||||
#ifdef MAP_32BIT | #ifdef MAP_32BIT | ||||
MAP_32BIT | | MAP_32BIT | | ||||
#endif | #endif | ||||
MAP_ALIGNMENT_MASK)) != 0) | MAP_ALIGNMENT_MASK)) != 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
if ((flags & (MAP_EXCL | MAP_FIXED)) == MAP_EXCL) | if ((flags & (MAP_EXCL | MAP_FIXED)) == MAP_EXCL) | ||||
return (EINVAL); | return (EINVAL); | ||||
if ((flags & (MAP_SHARED | MAP_PRIVATE)) == (MAP_SHARED | MAP_PRIVATE)) | if ((flags & (MAP_SHARED | MAP_PRIVATE)) == (MAP_SHARED | MAP_PRIVATE)) | ||||
▲ Show 20 Lines • Show All 1,460 Lines • Show Last 20 Lines |