]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurd: Implement MAP_32BIT
authorSergey Bugaev <bugaevc@gmail.com>
Sun, 23 Apr 2023 21:55:23 +0000 (00:55 +0300)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 24 Apr 2023 20:42:12 +0000 (22:42 +0200)
This is a flag that can be passed to mmap () to request that the mapping
being established should be located in the lower 2 GB area of the
address space, so only the lower 31 (not 32) bits can be set in its
address, and the address can be represented as a 32-bit integer without
truncating it.

This flag is intended to be compatible with Linux, FreeBSD, and Darwin
flags of the same name. Out of those systems, it appears Linux and
FreeBSD take MAP_32BIT to mean "map 31 bit", whereas Darwin allows the
32nd bit to be set in the address as well. The Hurd follows Linux and
FreeBSD behavior.

Unlike on those systems, on the Hurd MAP_32BIT is defined on all
supported architectures (which currently are only i386 and x86_64).

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-Id: <20230423215526.346009-1-bugaevc@gmail.com>

sysdeps/mach/hurd/bits/mman_ext.h
sysdeps/mach/hurd/dl-sysdep.c
sysdeps/mach/hurd/mmap.c

index f022826eee3ad7d6bb52986d26f9a5e9e578491d..bbb94743e9c1658c39021c139663fd669d5110ef 100644 (file)
@@ -22,4 +22,5 @@
 
 #ifdef __USE_GNU
 # define SHM_ANON      ((const char *) 1)
+# define MAP_32BIT     0x1000
 #endif /* __USE_GNU  */
index 6e167e12d836c9ca4e762f2c16e125fb4b4596fe..d7b309e05d6e6eaa245916490bc78a71934d1783 100644 (file)
@@ -451,7 +451,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
 {
   error_t err;
   vm_prot_t vmprot;
-  vm_address_t mapaddr;
+  vm_address_t mapaddr, mask;
   mach_port_t memobj_rd, memobj_wr;
 
   vmprot = VM_PROT_NONE;
@@ -462,6 +462,8 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
   if (prot & PROT_EXEC)
     vmprot |= VM_PROT_EXECUTE;
 
+  mask = (flags & MAP_32BIT) ? ~(vm_address_t) 0x7FFFFFFF : 0;
+
   if (flags & MAP_ANON)
     memobj_rd = MACH_PORT_NULL;
   else
@@ -476,7 +478,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
 
   mapaddr = (vm_address_t) addr;
   err = __vm_map (__mach_task_self (),
-                 &mapaddr, (vm_size_t) len, 0,
+                 &mapaddr, (vm_size_t) len, mask,
                  !(flags & MAP_FIXED),
                  memobj_rd,
                  (vm_offset_t) offset,
@@ -491,7 +493,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
       if (! err)
        err = __vm_map (__mach_task_self (),
                        &mapaddr, (vm_size_t) len,
-                       0,
+                       mask,
                        !(flags & MAP_FIXED),
                        memobj_rd, (vm_offset_t) offset,
                        flags & (MAP_COPY|MAP_PRIVATE),
index 20a41e36d8a59945fe2250f48425842de2b5b431..c3cc18560cf22bcbe55867bb1afd342479dbbaf6 100644 (file)
@@ -36,7 +36,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
   error_t err;
   vm_prot_t vmprot, max_vmprot;
   memory_object_t memobj;
-  vm_address_t mapaddr;
+  vm_address_t mapaddr, mask;
   boolean_t copy;
 
   mapaddr = (vm_address_t) addr;
@@ -55,6 +55,8 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
 
   copy = ! (flags & MAP_SHARED);
 
+  mask = (flags & MAP_32BIT) ? ~(vm_address_t) 0x7FFFFFFF : 0;
+
   switch (flags & MAP_TYPE)
     {
     default:
@@ -134,7 +136,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
     max_vmprot = VM_PROT_ALL;
 
   err = __vm_map (__mach_task_self (),
-                 &mapaddr, (vm_size_t) len, (vm_address_t) 0,
+                 &mapaddr, (vm_size_t) len, mask,
                  mapaddr == 0,
                  memobj, (vm_offset_t) offset,
                  copy, vmprot, max_vmprot,
@@ -149,7 +151,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
          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,
+                           &mapaddr, (vm_size_t) len, mask,
                            0, memobj, (vm_offset_t) offset,
                            copy, vmprot, max_vmprot,
                            copy ? VM_INHERIT_COPY : VM_INHERIT_SHARE);
@@ -159,7 +161,7 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
     {
       if (mapaddr != 0 && (err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS))
        err = __vm_map (__mach_task_self (),
-                       &mapaddr, (vm_size_t) len, (vm_address_t) 0,
+                       &mapaddr, (vm_size_t) len, mask,
                        1, memobj, (vm_offset_t) offset,
                        copy, vmprot, max_vmprot,
                        copy ? VM_INHERIT_COPY : VM_INHERIT_SHARE);