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.
This commit is contained in:
Ulrich Drepper 2000-01-03 23:22:35 +00:00
parent 1ecdfd3254
commit e3aaaa2732
4 changed files with 87 additions and 10 deletions

View File

@ -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

View 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
@ -23,12 +23,12 @@
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)

View File

@ -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)

View 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