This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] posix: Fix mmap for m68k and ia64 (BZ#21908)
I will commit this shortly if no one opposes it.
On 11/08/2017 16:22, Adhemerval Zanella wrote:
> Ping.
>
> On 06/08/2017 11:30, Adhemerval Zanella wrote:
>> Default semantic for mmap2 syscall is to take the offset in 4096-byte
>> units. However m68k and ia64 mmap2 implementation take in the
>> configured pagesize units and for both architecture it can be
>> different values based on how kernel was built.
>>
>> 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.
>> ---
>> ChangeLog | 12 ++++++++++++
>> sysdeps/unix/sysv/linux/ia64/mmap_internal.h | 29 ++++++++++++++++++++++++++++
>> sysdeps/unix/sysv/linux/m68k/mmap_internal.h | 2 +-
>> sysdeps/unix/sysv/linux/mmap.c | 2 +-
>> sysdeps/unix/sysv/linux/mmap_internal.h | 6 +++---
>> 5 files changed, 46 insertions(+), 5 deletions(-)
>> create mode 100644 sysdeps/unix/sysv/linux/ia64/mmap_internal.h
>>
>> diff --git a/sysdeps/unix/sysv/linux/ia64/mmap_internal.h b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h
>> new file mode 100644
>> index 0000000..dbaaa3f
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h
>> @@ -0,0 +1,29 @@
>> +/* Common mmap definition for Linux implementation. Linux/ia64 version.
>> + 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_IA64_INTERNAL_LINUX_H
>> +#define MMAP_IA64_INTERNAL_LINUX_H
>> +
>> +/* Linux allows PAGE_SHIFT in range of [12-16] and expect
>> + mmap2 offset to be provided in based on the configured pagesize.
>> + Determine the shift dynamically with getpagesize. */
>> +#define MMAP2_PAGE_UNIT -1
>> +
>> +#include_next <mmap_internal.h>
>> +
>> +#endif
>> diff --git a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h
>> index bd8bd38..9fe9d91 100644
>> --- a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h
>> +++ b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h
>> @@ -22,7 +22,7 @@
>> /* ColdFire and Sun 3 kernels have PAGE_SHIFT set to 13 and expect
>> mmap2 offset to be provided in 8K pages. Determine the shift
>> dynamically with getpagesize. */
>> -#define MMAP2_PAGE_SHIFT -1
>> +#define MMAP2_PAGE_UNIT -1
>>
>> #include_next <mmap_internal.h>
>>
>> diff --git a/sysdeps/unix/sysv/linux/mmap.c b/sysdeps/unix/sysv/linux/mmap.c
>> index 98c2f88..59292b6 100644
>> --- a/sysdeps/unix/sysv/linux/mmap.c
>> +++ b/sysdeps/unix/sysv/linux/mmap.c
>> @@ -21,9 +21,9 @@
>> #include <sys/mman.h>
>> #include <sysdep.h>
>> #include <stdint.h>
>> -#include <mmap_internal.h>
>>
>> #ifndef __OFF_T_MATCHES_OFF64_T
>> +# include <mmap_internal.h>
>>
>> /* An architecture may override this. */
>> # ifndef MMAP_ADJUST_OFFSET
>> diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h
>> index 499e389..47c0991 100644
>> --- a/sysdeps/unix/sysv/linux/mmap_internal.h
>> +++ b/sysdeps/unix/sysv/linux/mmap_internal.h
>> @@ -27,13 +27,13 @@
>> #endif
>>
>> #if MMAP2_PAGE_UNIT == -1
>> -static int page_unit;
>> -
>> +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 page_unit MMAP2_PAGE_UNIT
>> # define MMAP_CHECK_PAGE_UNIT()
>> #endif
>>
>>