This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Ping^2 s390 Re: Remove __ASSUME_MMAP2_SYSCALL
On 20/08/12 12:57, Joseph S. Myers wrote:
> On Wed, 1 Aug 2012, Joseph S. Myers wrote:
>
>> On Fri, 27 Jul 2012, Joseph S. Myers wrote:
>>
>>> This patch does so, removing __ASSUME_MMAP2_SYSCALL and associated
>>> __NR_mmap2 conditionals. Tested x86. Could s390 maintainers please
>>> test and review it? Note that __ASSUME_MMAP2_SYSCALL was never
>>> previously defined for s390-32 at all, despite the conditionals in
>>> s390-specific code - thus the changes to the s390-32 mmap/mmap64 code
>>> are exposing code that was never used before, and you should carefully
>>> review the existing code exposed by my patch, not just that my patch
>>> removes the conditionals correctly. If you find pre-existing issues
>>> with the s390 code then please commit whatever patch of your own you
>>> think appropriate to fix such issues.
>>
>> Ping for the s390-32 review/test of this patch
>> <http://sourceware.org/ml/libc-alpha/2012-07/msg00588.html>.
>
> Second s390-32 ping for this patch. Here is a version that applies
> cleanly to current sources (updated for the other changes to
> kernel-features.h files that have gone in while this patch was pending).
The S/390 bits are ok. Regtested on s390 and s390x.
Thanks!
-Andreas-
>
> 2012-08-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/kernel-features.h
> (__ASSUME_MMAP2_SYSCALL): Remove all definitions.
> * sysdeps/unix/sysv/linux/mmap64.c [__NR_mmap2]: Make code
> unconditional.
> [!__ASSUME_MMAP2_SYSCALL]: Remove conditional code.
> * sysdeps/unix/sysv/linux/i386/mmap.S (__mmap)
> [__ASSUME_MMAP2_SYSCALL]: Make code unconditional.
> (__mmap) [!__ASSUME_MMAP2_SYSCALL]: Remove conditional code.
> * sysdeps/unix/sysv/linux/i386/mmap64.S (__mmap64) [__NR_mmap2]:
> Make code unconditional.
> (__mmap64) [!__ASSUME_MMAP2_SYSCALL]: Remove conditional code.
> (__mmap64) [!__NR_mmap2]: Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-32/mmap.S (__mmap)
> [__ASSUME_MMAP2_SYSCALL]: Make code unconditional.
> (__mmap) [!__ASSUME_MMAP2_SYSCALL]: Remove conditional code.
> * sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S (__mmap64)
> [__NR_mmap2]: Make code unconditional.
> (__mmap64) [!__ASSUME_MMAP2_SYSCALL]: Remove conditional code.
> (__mmap64) [!__NR_mmap2]: Likewise.
>
> ports/ChangeLog.arm:
> 2012-08-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/arm/kernel-features.h
> (__ASSUME_MMAP2_SYSCALL): Remove.
>
> ports/ChangeLog.hppa:
> 2012-08-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/hppa/kernel-features.h
> (__ASSUME_MMAP2_SYSCALL): Remove.
>
> ports/ChangeLog.m68k:
> 2012-08-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/m68k/kernel-features.h
> (__ASSUME_MMAP2_SYSCALL): Remove.
>
> ports/ChangeLog.tile:
> 2012-08-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/tile/kernel-features.h
> (__ASSUME_MMAP2_SYSCALL): Remove.
>
> diff --git a/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h b/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h
> index b003b17..34ed474 100644
> --- a/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h
> +++ b/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h
> @@ -20,9 +20,8 @@
> /* The utimes syscall was added before 2.6.1. */
> #define __ASSUME_UTIMES 1
>
> -/* On ARM the mmap2/stat64/lstat64/fstat64 syscalls were introduced in
> +/* On ARM the stat64/lstat64/fstat64 syscalls were introduced in
> 2.3.35. */
> -#define __ASSUME_MMAP2_SYSCALL 1
> #define __ASSUME_STAT64_SYSCALL 1
>
> /* The signal frame layout changed in 2.6.18. */
> diff --git a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> index 49ba55f..d5bec07 100644
> --- a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> +++ b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> @@ -23,7 +23,6 @@
> and expect the final version here. */
> #define __ASSUME_32BITUIDS 1
> #define __ASSUME_TRUNCATE64_SYSCALL 1
> -#define __ASSUME_MMAP2_SYSCALL 1
> #define __ASSUME_STAT64_SYSCALL 1
> #define __ASSUME_IPC64 1
> #define __ASSUME_ST_INO_64_BIT 1
> diff --git a/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> index 4a8b585..701600e 100644
> --- a/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> +++ b/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> @@ -18,7 +18,6 @@
> <http://www.gnu.org/licenses/>. */
>
> /* These features were surely available with 2.4.12. */
> -#define __ASSUME_MMAP2_SYSCALL 1
> #define __ASSUME_STAT64_SYSCALL 1
>
> /* Many syscalls were added in 2.6.10 for m68k. */
> diff --git a/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h b/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h
> index 956f14c..0463448 100644
> --- a/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h
> +++ b/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h
> @@ -18,7 +18,6 @@
>
>
> /* TILE glibc support starts with 2.6.36, guaranteeing many kernel features. */
> -#define __ASSUME_MMAP2_SYSCALL 1
> #define __ASSUME_STAT64_SYSCALL 1
> #define __ASSUME_UTIMES 1
> #define __ASSUME_FADVISE64_64_SYSCALL 1
> diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
> index c8bf3e1..1f79bde 100644
> --- a/sysdeps/unix/sysv/linux/i386/mmap.S
> +++ b/sysdeps/unix/sysv/linux/i386/mmap.S
> @@ -25,10 +25,6 @@
>
> ENTRY (__mmap)
>
> -/* I don't think it is worthwhile trying to use mmap2 whenever it
> - is available. Only use it when we are sure the syscall exists. */
> -#ifdef __ASSUME_MMAP2_SYSCALL
> -
> /* Save registers. */
> pushl %ebp
> cfi_adjust_cfa_offset (4)
> @@ -73,25 +69,6 @@ L(skip):
> cfi_adjust_cfa_offset (-4)
> cfi_restore (ebp)
>
> -#else
> -
> - /* Save registers. */
> - movl %ebx, %edx
> - cfi_register (ebx, edx)
> -
> - movl $SYS_ify(mmap), %eax /* System call number in %eax. */
> -
> - lea 4(%esp), %ebx /* Address of args is 1st arg. */
> -
> - /* Do the system call trap. */
> - int $0x80
> -
> - /* Restore registers. */
> - movl %edx, %ebx
> - cfi_restore (ebx)
> -
> -#endif
> -
> /* If 0 > %eax > -4096 there was an error. */
> cmpl $-4096, %eax
> ja SYSCALL_ERROR_LABEL
> diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S
> index 7599b85..8855109 100644
> --- a/sysdeps/unix/sysv/linux/i386/mmap64.S
> +++ b/sysdeps/unix/sysv/linux/i386/mmap64.S
> @@ -37,8 +37,6 @@
> .text
> ENTRY (BP_SYM (__mmap64))
>
> -#ifdef __NR_mmap2
> -
> /* Save registers. */
> pushl %ebp
> cfi_adjust_cfa_offset (4)
> @@ -88,12 +86,6 @@ L(do_syscall):
> cfi_adjust_cfa_offset (-4)
> cfi_restore (ebp)
>
> -#ifndef __ASSUME_MMAP2_SYSCALL
> -2:
> - cmp $-ENOSYS, %eax
> - je 3f
> -#endif
> -
> /* If 0 > %eax > -4096 there was an error. */
> cmpl $-4096, %eax
> ja SYSCALL_ERROR_LABEL
> @@ -122,42 +114,6 @@ L(einval):
> cfi_restore (ebp)
> movl $-EINVAL, %eax
> jmp SYSCALL_ERROR_LABEL
> -#endif
> -
> -#if !defined __ASSUME_MMAP2_SYSCALL || !defined __NR_mmap2
> -3:
> - /* Save registers. */
> - movl %ebx, %edx
> - cfi_register (ebx, edx)
> -
> - cmpl $0, OFFHI-SVRSP(%esp)
> - jne L(einval2)
> -
> - movl $SYS_ify(mmap), %eax /* System call number in %eax. */
> -
> - lea ADDR-SVRSP(%esp), %ebx /* Address of args is 1st arg. */
> -
> - /* Do the system call trap. */
> - ENTER_KERNEL
> -
> - /* Restore registers. */
> - movl %edx, %ebx
> - cfi_restore (ebx)
> -
> - /* If 0 > %eax > -4096 there was an error. */
> - cmpl $-4096, %eax
> - ja SYSCALL_ERROR_LABEL
> -
> - /* Successful; return the syscall's value. */
> - ret
> -
> - cfi_register (ebx, edx)
> -L(einval2):
> - movl %edx, %ebx
> - cfi_restore (ebx)
> - movl $-EINVAL, %eax
> - jmp SYSCALL_ERROR_LABEL
> -#endif
>
> PSEUDO_END (BP_SYM (__mmap64))
>
> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
> index 6b0eb95..06e1511 100644
> --- a/sysdeps/unix/sysv/linux/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
> @@ -40,20 +40,14 @@
> /* The sendfile syscall was introduced in 2.2.0. */
> #define __ASSUME_SENDFILE 1
>
> -/* On x86 the mmap2 syscall was introduced in 2.3.31. */
> -#ifdef __i386__
> -# define __ASSUME_MMAP2_SYSCALL 1
> -#endif
> -
> /* On x86 the stat64/lstat64/fstat64 syscalls were introduced in 2.3.34. */
> #ifdef __i386__
> # define __ASSUME_STAT64_SYSCALL 1
> #endif
>
> -/* On sparc the mmap2/stat64/lstat64/fstat64 syscalls were introduced
> - in 2.3.35. */
> +/* On sparc the stat64/lstat64/fstat64 syscalls were introduced in
> + 2.3.35. */
> #if defined __sparc__ && !defined __arch64__
> -# define __ASSUME_MMAP2_SYSCALL 1
> # define __ASSUME_STAT64_SYSCALL 1
> #endif
>
> @@ -70,9 +64,8 @@
> # define __ASSUME_IPC64 1
> #endif
>
> -/* SH kernels got stat64 and mmap2 during 2.4.0-test. */
> +/* SH kernels got stat64 during 2.4.0-test. */
> #ifdef __sh__
> -# define __ASSUME_MMAP2_SYSCALL 1
> # define __ASSUME_STAT64_SYSCALL 1
> #endif
>
> @@ -86,12 +79,6 @@
> MIPS n32). */
> #define __ASSUME_GETDENTS64_SYSCALL 1
>
> -/* Starting with 2.4.5 kernels the mmap2 syscall made it into the official
> - kernel. But PowerPC64 does not support a separate MMAP2 call. */
> -#if defined __powerpc__ && !defined __powerpc64__
> -# define __ASSUME_MMAP2_SYSCALL 1
> -#endif
> -
> /* Beginning with 2.6.12 the clock and timer supports CPU clocks. */
> #define __ASSUME_POSIX_CPU_TIMERS 1
>
> diff --git a/sysdeps/unix/sysv/linux/mmap64.c b/sysdeps/unix/sysv/linux/mmap64.c
> index 495d777..bca15f9 100644
> --- a/sysdeps/unix/sysv/linux/mmap64.c
> +++ b/sysdeps/unix/sysv/linux/mmap64.c
> @@ -1,4 +1,4 @@
> -/* Copyright (C) 1999,2000,2001,2002,2006,2010 Free Software Foundation, Inc.
> +/* Copyright (C) 1999-2012 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
> Contributed by Jakub Jelinek <jakub@redhat.com>, 1999.
>
> @@ -26,76 +26,42 @@
>
> #include <kernel-features.h>
>
> -#ifdef __NR_mmap2
> -
> /* This is always 12, even on architectures where PAGE_SHIFT != 12. */
> -# if MMAP2_PAGE_SHIFT == -1
> +#if MMAP2_PAGE_SHIFT == -1
> static int page_shift;
> -# else
> -# ifndef MMAP2_PAGE_SHIFT
> -# define MMAP2_PAGE_SHIFT 12
> -# endif
> -# define page_shift MMAP2_PAGE_SHIFT
> -# endif
> -
> -# ifndef __ASSUME_MMAP2_SYSCALL
> -static int have_no_mmap2;
> +#else
> +# ifndef MMAP2_PAGE_SHIFT
> +# define MMAP2_PAGE_SHIFT 12
> # endif
> +#define page_shift MMAP2_PAGE_SHIFT
> #endif
>
>
> void *
> __mmap64 (void *addr, size_t len, int prot, int flags, int fd, off64_t offset)
> {
> -#ifdef __NR_mmap2
> -# if MMAP2_PAGE_SHIFT == -1
> +#if MMAP2_PAGE_SHIFT == -1
> if (page_shift == 0)
> {
> int page_size = getpagesize ();
> while ((1 << ++page_shift) != page_size)
> ;
> }
> -# endif
> - if (offset & ((1 << page_shift) - 1))
> - {
> - __set_errno (EINVAL);
> - return MAP_FAILED;
> - }
> -# ifndef __ASSUME_MMAP2_SYSCALL
> - if (! have_no_mmap2)
> -# endif
> - {
> -# ifndef __ASSUME_MMAP2_SYSCALL
> - int saved_errno = errno;
> -# endif
> - void *result;
> - __ptrvalue (result) = (void *__unbounded)
> - INLINE_SYSCALL (mmap2, 6, __ptrvalue (addr),
> - len, prot, flags, fd,
> - (off_t) (offset >> MMAP2_PAGE_SHIFT));
> -# if __BOUNDED_POINTERS__
> - __ptrlow (result) = __ptrvalue (result);
> - __ptrhigh (result) = __ptrvalue (result) + len;
> -# endif
> -# ifndef __ASSUME_MMAP2_SYSCALL
> - if (result != MAP_FAILED || errno != ENOSYS)
> -# endif
> - return result;
> -
> -# ifndef __ASSUME_MMAP2_SYSCALL
> - __set_errno (saved_errno);
> - have_no_mmap2 = 1;
> -# endif
> - }
> #endif
> -#ifndef __ASSUME_MMAP2_SYSCALL
> - if (offset != (off_t) offset || (offset + len) != (off_t) (offset + len))
> + if (offset & ((1 << page_shift) - 1))
> {
> __set_errno (EINVAL);
> return MAP_FAILED;
> }
> -
> - return __mmap (addr, len, prot, flags, fd, (off_t) offset);
> + void *result;
> + __ptrvalue (result) = (void *__unbounded)
> + INLINE_SYSCALL (mmap2, 6, __ptrvalue (addr),
> + len, prot, flags, fd,
> + (off_t) (offset >> MMAP2_PAGE_SHIFT));
> +#if __BOUNDED_POINTERS__
> + __ptrlow (result) = __ptrvalue (result);
> + __ptrhigh (result) = __ptrvalue (result) + len;
> #endif
> + return result;
> }
> weak_alias (__mmap64, mmap64)
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
> index 6e5ba94..0357ab4 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S
> @@ -1,4 +1,4 @@
> -/* Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc.
> +/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
> Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
> This file is part of the GNU C Library.
>
> @@ -40,8 +40,8 @@ ENTRY(__mmap)
> cfi_adjust_cfa_offset (120)
> st %r1,0(%r15) /* store back chain */
>
> - /* Store parameters on stack, because old_mmap/mmap2
> - * take only one parameter: a pointer to the parameter area
> + /* Store parameters on stack, because mmap2
> + * takes only one parameter: a pointer to the parameter area
> */
> st %r6,0x70(%r15) /* Store 'fd'. */
> st %r5,0x6C(%r15) /* Store 'flags'. */
> @@ -50,10 +50,6 @@ ENTRY(__mmap)
> st %r2,0x60(%r15) /* Store 'start'. */
> l %r1,216(%r15) /* Load offset. */
>
> -#ifdef __ASSUME_MMAP2_SYSCALL
> - /* I don't think it is worthwhile trying to use mmap2 whenever
> - * it is available. Only use it when we are sure the syscall
> - * exists. */
> tml %r1,0x0fff /* Offset page aligned ? */
> lhi %r2,-EINVAL
> jnz 1f /* No -> EINVAL. */
> @@ -61,11 +57,6 @@ ENTRY(__mmap)
> st %r1,0x74(%r15) /* Store page offset. */
> la %r2,0x60(%r15) /* Load address of parameter list. */
> svc SYS_ify(mmap2) /* Do the system call trap. */
> -#else
> - st %r1,0x74(%r15) /* Store offset unmodified. */
> - la %r2,0x60(%r15) /* Load address of parameter list. */
> - svc SYS_ify(mmap) /* Do the system call trap. */
> -#endif
>
> 1: l %r15,0(%r15) /* Load back chain. */
> cfi_adjust_cfa_offset (-120)
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
> index ad6d254..8b4bd45 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S
> @@ -1,4 +1,4 @@
> -/* Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc.
> +/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
> Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
> This file is part of the GNU C Library.
>
> @@ -41,15 +41,14 @@ ENTRY(__mmap64)
> cfi_adjust_cfa_offset (120)
> st %r1,0(%r15) /* Store back chain. */
>
> - /* Store parameters on stack, because mmap2 and old_mmap
> - * take only one parameter: a pointer to the parameter area. */
> + /* Store parameters on stack, because mmap2
> + * takes only one parameter: a pointer to the parameter area. */
> st %r6,0x70(%r15) /* Store 'fd'. */
> st %r5,0x6C(%r15) /* Store 'flags'. */
> st %r4,0x68(%r15) /* Store 'prot'. */
> st %r3,0x64(%r15) /* Store 'length'. */
> st %r2,0x60(%r15) /* Store 'start'. */
>
> -#ifdef __NR_mmap2
> lm %r0,%r1,216(%r15) /* Load 64 bit offset. */
> tml %r1,0x0fff /* Offset page aligned ? */
> jnz 2f /* No -> EINVAL. */
> @@ -61,11 +60,6 @@ ENTRY(__mmap64)
> la %r2,0x60(%r15) /* Load address of parameter list. */
> svc SYS_ify(mmap2) /* Do the system call trap. */
>
> -#ifndef __ASSUME_MMAP2_SYSCALL
> - chi %r2,-ENOSYS
> - je 1f
> -#endif
> -
> l %r15,0(%r15) /* Load back chain. */
> cfi_adjust_cfa_offset (-120)
> lm %r6,%r15,24(%r15) /* Load registers. */
> @@ -78,31 +72,6 @@ ENTRY(__mmap64)
> /* Successful; return the syscall's value. */
> br %r14
>
> -#endif
> -
> -#if !defined __ASSUME_MMAP2_SYSCALL || !defined __NR_mmap2
> -1: lm %r0,%r1,216(%r15) /* Load 64 bit offset. */
> - st %r1,0x74(%r15) /* Store lower word of offset. */
> - ltr %r0,%r0 /* Offset > 2^32 ? */
> - jnz 2f
> - alr %r1,%r3 /* Add length to offset. */
> - brc 3,2f /* Carry -> EINVAL. */
> -
> - la %r2,0x60(%r15) /* Load address of parameter list. */
> - svc SYS_ify(mmap) /* Do the system call trap. */
> -
> - l %r15,0(%r15) /* Load back chain. */
> - lm %r6,%r15,24(%r15) /* Load registers. */
> -
> - /* Check gpr 2 for error. */
> - lhi %r0,-4096
> - clr %r2,%r0
> - jnl SYSCALL_ERROR_LABEL
> -
> - /* Successful; return the syscall's value. */
> - br %r14
> -#endif
> -
> 2: lhi %r2,-EINVAL
> l %r15,0(%r15) /* Load back chain. */
> lm %r6,%r15,24(%r15) /* Load registers. */
>