1  /* Linux mmap system call.  x86-64 version.
       2     Copyright (C) 2015-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of the GNU C Library.
       5  
       6     The GNU C Library is free software; you can redistribute it and/or
       7     modify it under the terms of the GNU Lesser General Public License as
       8     published by the Free Software Foundation; either version 2.1 of the
       9     License, or (at your option) any later version.
      10  
      11     The GNU C Library is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14     Lesser General Public License for more details.
      15  
      16     You should have received a copy of the GNU Lesser General Public
      17     License along with the GNU C Library; if not, see
      18     <https://www.gnu.org/licenses/>.  */
      19  
      20  #ifndef MMAP_X86_64_INTERNAL_H
      21  #define MMAP_X86_64_INTERNAL_H
      22  
      23  #include <ldsodefs.h>
      24  
      25  /* If the Prefer_MAP_32BIT_EXEC bit is set, try to map executable or
      26      denywrite pages with MAP_32BIT first.  */
      27  #define MMAP_PREPARE(addr, len, prot, flags, fd, offset)		\
      28    if ((addr) == NULL							\
      29        && (((prot) & PROT_EXEC) != 0					\
      30  	  || ((flags) & MAP_DENYWRITE) != 0)				\
      31        && HAS_ARCH_FEATURE (Prefer_MAP_32BIT_EXEC))			\
      32      {									\
      33        void *ret = (void*) INLINE_SYSCALL_CALL (mmap, (addr), (len),	\
      34  					      (prot),			\
      35  					      (flags) | MAP_32BIT,	\
      36  					      (fd), (offset));		\
      37        if (ret != MAP_FAILED)						\
      38  	return ret;							\
      39      }
      40  
      41  #include_next <mmap_internal.h>
      42  
      43  #endif