diff options
Diffstat (limited to 'sysdeps/mach/hurd/mmap.c')
-rw-r--r-- | sysdeps/mach/hurd/mmap.c | 188 |
1 files changed, 0 insertions, 188 deletions
diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c deleted file mode 100644 index dbd718a688..0000000000 --- a/sysdeps/mach/hurd/mmap.c +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (C) 1994-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sys/types.h> -#include <sys/mman.h> -#include <errno.h> -#include <hurd.h> -#include <hurd/fd.h> - -/* Map addresses starting near ADDR and extending for LEN bytes. from - OFFSET into the file FD describes according to PROT and FLAGS. If ADDR - is nonzero, it is the desired mapping address. If the MAP_FIXED bit is - set in FLAGS, the mapping will be at ADDR exactly (which must be - page-aligned); otherwise the system chooses a convenient nearby address. - The return value is the actual mapping address chosen or (__ptr_t) -1 - for errors (in which case `errno' is set). A successful `mmap' call - deallocates any previous mapping for the affected region. */ - -__ptr_t -__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) -{ - error_t err; - vm_prot_t vmprot; - memory_object_t memobj; - vm_address_t mapaddr; - - mapaddr = (vm_address_t) addr; - - /* ADDR and OFFSET must be page-aligned. */ - if ((mapaddr & (__vm_page_size - 1)) || (offset & (__vm_page_size - 1))) - return (__ptr_t) (long int) __hurd_fail (EINVAL); - - if ((flags & (MAP_TYPE|MAP_INHERIT)) == MAP_ANON - && prot == (PROT_READ|PROT_WRITE)) /* cf VM_PROT_DEFAULT */ - { - /* vm_allocate has (a little) less overhead in the kernel too. */ - err = __vm_allocate (__mach_task_self (), &mapaddr, len, mapaddr == 0); - - if (err == KERN_NO_SPACE) - { - if (flags & MAP_FIXED) - { - /* XXX this is not atomic as it is in unix! */ - /* The region is already allocated; deallocate it first. */ - err = __vm_deallocate (__mach_task_self (), mapaddr, len); - if (!err) - err = __vm_allocate (__mach_task_self (), &mapaddr, len, 0); - } - else if (mapaddr != 0) - err = __vm_allocate (__mach_task_self (), &mapaddr, len, 1); - } - - return err ? (__ptr_t) (long int) __hurd_fail (err) : (__ptr_t) mapaddr; - } - - vmprot = VM_PROT_NONE; - if (prot & PROT_READ) - vmprot |= VM_PROT_READ; - if (prot & PROT_WRITE) - vmprot |= VM_PROT_WRITE; - if (prot & PROT_EXEC) - vmprot |= VM_PROT_EXECUTE; - - switch (flags & MAP_TYPE) - { - default: - return (__ptr_t) (long int) __hurd_fail (EINVAL); - - case MAP_ANON: - memobj = MACH_PORT_NULL; - break; - - case MAP_FILE: - case 0: /* Allow, e.g., just MAP_SHARED. */ - { - mach_port_t robj, wobj; - if (err = HURD_DPORT_USE (fd, __io_map (port, &robj, &wobj))) - { - if (err == MIG_BAD_ID || err == EOPNOTSUPP || err == ENOSYS) - err = ENODEV; /* File descriptor doesn't support mmap. */ - return (__ptr_t) (long int) __hurd_dfail (fd, err); - } - switch (prot & (PROT_READ|PROT_WRITE)) - { - /* Although it apparently doesn't make sense to map a file with - protection set to PROT_NONE, it is actually sometimes done. - In particular, that's how localedef reserves some space for - the locale archive file, the rationale being that some - implementations take into account whether the mapping is - anonymous or not when selecting addresses. */ - case PROT_NONE: - case PROT_READ: - memobj = robj; - if (wobj != MACH_PORT_NULL) - __mach_port_deallocate (__mach_task_self (), wobj); - break; - case PROT_WRITE: - memobj = wobj; - if (robj != MACH_PORT_NULL) - __mach_port_deallocate (__mach_task_self (), robj); - break; - case PROT_READ|PROT_WRITE: - if (robj == wobj) - { - memobj = wobj; - /* Remove extra reference. */ - __mach_port_deallocate (__mach_task_self (), memobj); - } - else if (wobj == MACH_PORT_NULL && /* Not writable by mapping. */ - !(flags & MAP_SHARED)) - /* The file can only be mapped for reading. Since we are - making a private mapping, we will never try to write the - object anyway, so we don't care. */ - memobj = robj; - else - { - __mach_port_deallocate (__mach_task_self (), wobj); - return (__ptr_t) (long int) __hurd_fail (EACCES); - } - break; - default: - __builtin_unreachable (); - } - break; - /* XXX handle MAP_NOEXTEND */ - } - } - - /* XXX handle MAP_INHERIT */ - - err = __vm_map (__mach_task_self (), - &mapaddr, (vm_size_t) len, (vm_address_t) 0, - mapaddr == 0, - memobj, (vm_offset_t) offset, - ! (flags & MAP_SHARED), - vmprot, VM_PROT_ALL, - (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY); - - if (err == KERN_NO_SPACE) - { - if (flags & MAP_FIXED) - { - /* XXX this is not atomic as it is in unix! */ - /* The region is already allocated; deallocate it first. */ - err = __vm_deallocate (__mach_task_self (), mapaddr, len); - if (! err) - err = __vm_map (__mach_task_self (), - &mapaddr, (vm_size_t) len, (vm_address_t) 0, - 0, memobj, (vm_offset_t) offset, - ! (flags & MAP_SHARED), - vmprot, VM_PROT_ALL, - (flags & MAP_SHARED) ? VM_INHERIT_SHARE - : VM_INHERIT_COPY); - } - else if (mapaddr != 0) - err = __vm_map (__mach_task_self (), - &mapaddr, (vm_size_t) len, (vm_address_t) 0, - 1, memobj, (vm_offset_t) offset, - ! (flags & MAP_SHARED), - vmprot, VM_PROT_ALL, - (flags & MAP_SHARED) ? VM_INHERIT_SHARE - : VM_INHERIT_COPY); - } - - if (memobj != MACH_PORT_NULL) - __mach_port_deallocate (__mach_task_self (), memobj); - - if (err) - return (__ptr_t) (long int) __hurd_fail (err); - - return (__ptr_t) mapaddr; -} - -weak_alias (__mmap, mmap) |