public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] hurd: Implement MAP_32BIT
@ 2023-04-24 20:42 Samuel Thibault
  0 siblings, 0 replies; only message in thread
From: Samuel Thibault @ 2023-04-24 20:42 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=70b9173caa3a6e8e4cc1c8ebe93ed15a19388687

commit 70b9173caa3a6e8e4cc1c8ebe93ed15a19388687
Author: Sergey Bugaev <bugaevc@gmail.com>
Date:   Mon Apr 24 00:55:23 2023 +0300

    hurd: Implement MAP_32BIT
    
    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>

Diff:
---
 sysdeps/mach/hurd/bits/mman_ext.h |  1 +
 sysdeps/mach/hurd/dl-sysdep.c     |  8 +++++---
 sysdeps/mach/hurd/mmap.c          | 10 ++++++----
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/sysdeps/mach/hurd/bits/mman_ext.h b/sysdeps/mach/hurd/bits/mman_ext.h
index f022826eee..bbb94743e9 100644
--- a/sysdeps/mach/hurd/bits/mman_ext.h
+++ b/sysdeps/mach/hurd/bits/mman_ext.h
@@ -22,4 +22,5 @@
 
 #ifdef __USE_GNU
 # define SHM_ANON	((const char *) 1)
+# define MAP_32BIT	0x1000
 #endif /* __USE_GNU  */
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 6e167e12d8..d7b309e05d 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -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),
diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c
index 20a41e36d8..c3cc18560c 100644
--- a/sysdeps/mach/hurd/mmap.c
+++ b/sysdeps/mach/hurd/mmap.c
@@ -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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-24 20:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-24 20:42 [glibc] hurd: Implement MAP_32BIT Samuel Thibault

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).