Make linux(4) handle MAP_32BIT.

This unbreaks Mono (mono-devel-4.6.2.7+dfsg-1ubuntu1 from Ubuntu Bionic);
previously would crash on "amd64_is_imm32" assert.

MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D23306
This commit is contained in:
Edward Tomasz Napierala 2020-01-24 12:08:23 +00:00
parent b3fb13eb55
commit 618b55c2e2
2 changed files with 9 additions and 1 deletions

View File

@ -113,6 +113,14 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
if (flags & LINUX_MAP_GROWSDOWN)
bsd_flags |= MAP_STACK;
#if defined(__amd64__)
/*
* According to the Linux mmap(2) man page, "MAP_32BIT flag
* is ignored when MAP_FIXED is set."
*/
if ((flags & LINUX_MAP_32BIT) && (flags & LINUX_MAP_FIXED) == 0)
bsd_flags |= MAP_32BIT;
/*
* PROT_READ, PROT_WRITE, or PROT_EXEC implies PROT_READ and PROT_EXEC
* on Linux/i386 if the binary requires executable stack.
@ -121,7 +129,6 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
*
* XXX. Linux checks that the file system is not mounted with noexec.
*/
#if defined(__amd64__)
linux_fixup_prot(td, &prot);
#endif

View File

@ -39,6 +39,7 @@
#define LINUX_MAP_PRIVATE 0x0002
#define LINUX_MAP_FIXED 0x0010
#define LINUX_MAP_ANON 0x0020
#define LINUX_MAP_32BIT 0x0040
#define LINUX_MAP_GROWSDOWN 0x0100
#define LINUX_PROT_GROWSDOWN 0x01000000