mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-19 09:20:07 +00:00
1f14d0c3dd
Default semantic for mmap2 syscall is to take the offset in 4096-byte units. However m68k and ia64 mmap2 implementation take in the configured pageunit units and for both architecture it can be different values. This patch fixes the m68k runtime discover of mmap2 offset unit and adds the ia64 definition to find it at runtime. Checked the basic tst-mmap and tst-mmap-offset on m68k (the system is configured with 4k, so current code is already passing on this system) and a sanity check on x86_64-linux-gnu (which should not be affected by this change). Sergei also states that ia64 loader now work correctly with this change. Adhemerval Zanella <adhemerval.zanella@linaro.org> Sergei Trofimovich <slyfox@inbox.ru> * sysdeps/unix/sysv/linux/m68k/mmap_internal.h (MMAP2_PAGE_SHIFT): Rename to MMAP2_PAGE_UNIT. * sysdeps/unix/sysv/linux/mmap.c: Include mmap_internal iff __OFF_T_MATCHES_OFF64_T is not defined. * sysdeps/unix/sysv/linux/mmap_internal.h (page_unit): Declare as uint64_t. (MMAP2_PAGE_UNIT) [MMAP2_PAGE_UNIT == -1]: Redefine to page_unit. (page_unit) [MMAP2_PAGE_UNIT != -1]: Remove definition.
50 lines
1.7 KiB
C
50 lines
1.7 KiB
C
/* Common mmap definition for Linux implementation.
|
|
Copyright (C) 2017 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef MMAP_INTERNAL_LINUX_H
|
|
#define MMAP_INTERNAL_LINUX_H 1
|
|
|
|
/* This is the minimum mmap2 unit size accept by the kernel. An architecture
|
|
with multiple minimum page sizes (such as m68k) might define it as -1 and
|
|
thus it will queried at runtime. */
|
|
#ifndef MMAP2_PAGE_UNIT
|
|
# define MMAP2_PAGE_UNIT 4096ULL
|
|
#endif
|
|
|
|
#if MMAP2_PAGE_UNIT == -1
|
|
static uint64_t page_unit;
|
|
# define MMAP_CHECK_PAGE_UNIT() \
|
|
if (page_unit == 0) \
|
|
page_unit = __getpagesize ();
|
|
# undef MMAP2_PAGE_UNIT
|
|
# define MMAP2_PAGE_UNIT page_unit
|
|
#else
|
|
# define MMAP_CHECK_PAGE_UNIT()
|
|
#endif
|
|
|
|
/* Do not accept offset not multiple of page size. */
|
|
#define MMAP_OFF_LOW_MASK (MMAP2_PAGE_UNIT - 1)
|
|
|
|
/* An architecture may override this. */
|
|
#ifndef MMAP_CALL
|
|
# define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \
|
|
INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset)
|
|
#endif
|
|
|
|
#endif /* MMAP_INTERNAL_LINUX_H */
|