Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 3 Jan 2000 23:22:35 +0000 (23:22 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 3 Jan 2000 23:22:35 +0000 (23:22 +0000)
2000-01-03  Philip Blundell  <philb@gnu.org>

* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_MMAP2_SYSCALL,
__ASSUME_TRUNCATE64_SYSCALL, __ASSUME_STAT64_SYSCALL): Define on
ARM for kernels >= 2.3.35.

2000-01-03  Philip Blundell  <philb@gnu.org>

* sysdeps/unix/sysv/linux/arm/mmap.S: Remove mmap64 alias.
Optimise error handling a little.
* sysdeps/unix/sysv/linux/arm/mmap64.S: New file.

ChangeLog
sysdeps/unix/sysv/linux/arm/mmap.S
sysdeps/unix/sysv/linux/arm/mmap64.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/kernel-features.h

index 16e8f89..e9f416a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2000-01-03  Philip Blundell  <philb@gnu.org>
+
+       * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_MMAP2_SYSCALL,
+       __ASSUME_TRUNCATE64_SYSCALL, __ASSUME_STAT64_SYSCALL): Define on
+       ARM for kernels >= 2.3.35.
+
+2000-01-03  Philip Blundell  <philb@gnu.org>
+
+       * sysdeps/unix/sysv/linux/arm/mmap.S: Remove mmap64 alias.
+       Optimise error handling a little.
+       * sysdeps/unix/sysv/linux/arm/mmap64.S: New file.
+
 2000-01-03  Andreas Jaeger  <aj@suse.de>
 
        * include/resolv.h: Remove declarations for __ns_name_ntop and
index fcff57c..31d57e4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000 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
 ENTRY (__mmap)
 
        /* Because we can only get five args through the syscall interface, and
-          mmap() takes six, we need to build a parameter block and pass its    
+          mmap() takes six, we need to build a parameter block and pass its
           address instead.  The 386 port does a similar trick.  */
 
        /* This code previously moved sp into ip and stored the args using
-          stmdb ip!, {a1-a4}.  It did not modify sp, so the stack never had 
-          to be restored after the syscall completed.  It saved an 
+          stmdb ip!, {a1-a4}.  It did not modify sp, so the stack never had
+          to be restored after the syscall completed.  It saved an
           instruction and meant no stack cleanup work was required.
 
           This will not work in the case of a mmap call being interrupted
@@ -47,10 +47,9 @@ ENTRY (__mmap)
        add     sp, sp, #16
 
        cmn     r0, $4096
-       bhs     PLTJMP(syscall_error);
-       ret
+       RETINSTR(movcc, pc, lr)
+       b       PLTJMP(syscall_error);
 
 PSEUDO_END (__mmap)
 
 weak_alias (__mmap, mmap)
-weak_alias (__mmap, mmap64)
diff --git a/sysdeps/unix/sysv/linux/arm/mmap64.S b/sysdeps/unix/sysv/linux/arm/mmap64.S
new file mode 100644 (file)
index 0000000..604bb76
--- /dev/null
@@ -0,0 +1,66 @@
+/* Copyright (C) 2000 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 Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+#define        EINVAL          22
+
+       /* The mmap2 system call takes six arguments, all in registers.  */
+       .text
+ENTRY (__mmap64)
+#ifdef __NR_mmap2
+       stmfd   sp!, {r4, r5, lr}
+       ldr     r5, [sp, $16]
+       ldr     r4, [sp, $12]
+       movs    ip, r5, lsl $20         @ check that offset is page-aligned
+       bne     .Linval
+       ldr     ip, [sp, $20]
+       mov     r5, r5, lsr $12
+       orr     r5, r5, ip, lsl $20     @ compose page offset
+       movs    ip, ip, lsr $12
+       bne     .Linval                 @ check for overflow
+       mov     ip, r0
+       swi     SYS_ify (mmap2)
+       cmn     r0, $4096
+       LOADREGS(ccfd, sp!, {r4, r5, pc})
+       teq     r0, $-ENOSYS
+       ldmnefd sp!, {r4, r5, lr}
+       bne     PLTJMP(syscall_error)
+       /* The current kernel does not support mmap2.  Fall back to plain
+          mmap if the offset is small enough.  */
+       ldr     r5, [sp, $20]
+       mov     r0, ip                  @ first arg was clobbered
+       teq     r5, $0
+       ldmeqfd sp!, {r4, r5, lr}
+       beq     PLTJMP(__mmap)
+.Linval:
+       mov     r0, $-EINVAL
+       ldmfd   sp!, {r4, r5, lr}
+       b       PLTJMP(syscall_error)
+#else
+       /* The kernel headers do not support mmap2.  Fall back to plain
+          mmap if the offset is small enough.  */
+       ldr     ip, [sp, $8]
+       teq     ip, $0
+       beq     PLTJMP(__mmap)
+       mov     r0, $-EINVAL
+       b       PLTJMP(syscall_error)
+#endif
+PSEUDO_END (__mmap64)
+
+weak_alias (__mmap64, mmap64)
index c22b9d1..73bfda6 100644 (file)
@@ -1,6 +1,6 @@
 /* Set flags signalling availability of kernel features based on given
    kernel version number.
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000 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
@@ -95,9 +95,9 @@
 # define __ASSUME_STAT64_SYSCALL       1
 #endif
 
-/* On sparc the truncate64/ftruncate64/mmap2/stat64/lstat64/fstat64
+/* On sparc and ARM the truncate64/ftruncate64/mmap2/stat64/lstat64/fstat64
    syscalls were introduced in 2.3.35.  */
-#if __LINUX_KERNEL_VERSION >= 131875 && defined __sparc__
+#if __LINUX_KERNEL_VERSION >= 131875 && (defined __sparc__ || defined __arm__)
 # define __ASSUME_TRUNCATE64_SYSCALL   1
 # define __ASSUME_MMAP2_SYSCALL                1
 # define __ASSUME_STAT64_SYSCALL       1