From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x230.google.com (mail-lj1-x230.google.com [IPv6:2a00:1450:4864:20::230]) by sourceware.org (Postfix) with ESMTPS id AC1C83858C83 for ; Sun, 23 Apr 2023 21:55:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AC1C83858C83 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lj1-x230.google.com with SMTP id 38308e7fff4ca-2a7b02615f1so35821091fa.0 for ; Sun, 23 Apr 2023 14:55:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682286929; x=1684878929; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=/yfNzVVfOruWe50R+UZPHrSzw7GSYQOsOpkZLkBE4sc=; b=l+0jjZhmt9MswR2vSz0YUngQUEjBhCPDBw0DpjSpfDZ08yO7v1sHgaB3NzCALNWJ5/ TVZAtJ7mplU+YCGldq2l9xDE7wyDJPT4fH8k8p6xPGhj1s4unb9OLuCHjRF1h9vhBKT4 P0VrJoJJb2QDsJbbXSBRrYL5CrRb3ekYRK0v3K0IOhBl+DIrdGpfloi8KJKiPSEzO6MS 04qU6Las8ZAEYSaTrY30t5bwQR1hFTxMCYGEYxJf1mXFD+GlSUziQ0K737Jyhc/aqDSO lrykcZAcDQ1TcxQWBG0LD3xWfJIPtAA8TaydBl2N7MWI1FgdDKDcjWKBPpCSXCkLQuSD piaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682286929; x=1684878929; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/yfNzVVfOruWe50R+UZPHrSzw7GSYQOsOpkZLkBE4sc=; b=AfKL+RshCnfa5tdBxNLKjgedjYwRYbGQ81QusaZoiSvYEv7pPXP2ztwgsnjpM0fA9q qw8gXrbrFx8MZK+PCj+OX8XQvW/UQJd9dWehO41Qt51+wC4qzcrWuIeE7BNwlPTPFX+Q 4DICaqa79MSAwV5ObMZClqOu1GcXntZ/u/PhITFnkTcwzx9ypcImdCWinVnbi285Odl6 DnB3/nUTHo3z+Qnjm9+AuazW+yfMB9mG91mKzNUc9Q9eTcHi63TCQzWNQ/3sO4QBR2QT zOodKzQpfluw78awn28aztx1zoDQdAe53HHosJbuTbuNT1WRugtJTq9USPjnEvepJZdw opdw== X-Gm-Message-State: AAQBX9edyzPx2e8otFzYUqAL7o8k+QpNUdRLuyKoREV4u7MbG61HoUYl VEyHGzeX/5EzhuFCT5Oj4t+MgMl2Mz4aRA== X-Google-Smtp-Source: AKy350ZTewtIZ5f/t8TqjZ4xhSK76YxNYu2bWX4BqNXR25mOqD0Pnsv9AVNAAXV/KXJ9J4nR99ggCA== X-Received: by 2002:ac2:4243:0:b0:4e8:3f38:7d21 with SMTP id m3-20020ac24243000000b004e83f387d21mr2797654lfl.28.1682286928506; Sun, 23 Apr 2023 14:55:28 -0700 (PDT) Received: from surface-pro-6.. ([2a00:1370:818c:4a57:e26d:6595:78ee:6d64]) by smtp.gmail.com with ESMTPSA id q8-20020ac25a08000000b004ecb06acbb3sm1393905lfn.281.2023.04.23.14.55.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Apr 2023 14:55:28 -0700 (PDT) From: Sergey Bugaev To: libc-alpha@sourceware.org Cc: bug-hurd@gnu.org, Samuel Thibault Subject: [PATCH 1/4] hurd: Implement MAP_32BIT Date: Mon, 24 Apr 2023 00:55:23 +0300 Message-Id: <20230423215526.346009-1-bugaevc@gmail.com> X-Mailer: git-send-email 2.40.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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 --- 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 f022826e..bbb94743 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 6e167e12..d7b309e0 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 20a41e36..c3cc1856 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); -- 2.40.0