This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: posix_fadvise change


On Fri, Aug 15, 2003 at 11:25:04PM -0700, Ulrich Drepper wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> I've checked in some change which change the interface of posix_fadvise.
>  It's a reaction to the problem with the posix_fadvise Andrew Morton
> discovered a few days ago.  The changes are now in the Linux kernel and
> even in POSIX (well, they'll be in the next draft).
> 
> The compatibilty code was nasty, but on x86 we also hit the 6 argument
> limit so I had to write the code in asm.  hammer and ia64 should work,
> too, maybe alpha too.  I haven't done work on any other arch.
> 
> While doing this I found another problem: the posix_madvise function is
> supposed to return the error value, not -1 on failure.  So it is split
> from the madvise code.  And I had to introduce a new magic prefix for
> the syscalls.list list.  V indicates the error value has to be returned.
>  Again, no work done for platforms other than x86, hammer, ia64.  And I
> haven't even checked the latter two yet.

The following patch adds magic for various other arches.
Furthermore, fixes a few problems I discovered.
One is, even on non-i386 32-bit arches we need both
posix_fadvise64@@GLIBC_2.3.3 and posix_fadvise64@GLIBC_2.2
always, no matter whether __NR_posix_fadvise64 and/or
__NR_posix_fadvise64_64 are defined in kernel headers (so we cannot use
syscalls.list for that, otherwise if kernel headers don't define them,
we would end up using sysdeps/generic versions, but that one doesn't have
symbol versioning stuff for @GLIBC_2.2/@@GLIBC_2.3.3).

2003-08-16  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/powerpc/powerpc32/sysdep.h (PSEUDO_ERRVAL,
	PSEUDO_RET_ERRVAL, ret_ERRVAL, PSEUDO_END_ERRVAL): Define.
	* sysdeps/powerpc/powerpc64/sysdep.h (PSEUDO_ERRVAL,
	PSEUDO_RET_ERRVAL, ret_ERRVAL, PSEUDO_END_ERRVAL): Define.
	* sysdeps/unix/alpha/sysdep.h (PSEUDO_ERRVAL,
	ret_ERRVAL, PSEUDO_END_ERRVAL): Define.
	* sysdeps/unix/mips/sysdep.h (PSEUDO_ERRVAL,
	ret_ERRVAL, PSEUDO_END_ERRVAL): Define.
	* sysdeps/unix/sparc/sysdep.h (PSEUDO_ERRVAL,
	ret_ERRVAL): Define.
	* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (PSEUDO_ERRVAL,
	PSEUDO_END_ERRVAL, ret_ERRVAL): Define.
	* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (PSEUDO_ERRVAL,
	PSEUDO_END_ERRVAL, ret_ERRVAL): Define.
	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (PSEUDO_ERRVAL):
	Define.
	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h (PSEUDO_ERRVAL,
	PSEUDO_END_ERRVAL, ret_ERRVAL): Define.
	* sysdeps/unix/sysdep.h (PSEUDO_END_ERRVAL): Define.

	* sysdeps/unix/sysv/linux/syscalls.list (posix_fadvise64,
	posix_fadvise64_64): Remove.
	* sysdeps/unix/sysv/linux/alpha/syscalls.list (posix_fadvise64): Add
	V flag.
	* sysdeps/unix/sysv/linux/ia64/syscalls.list (posix_fadvise64):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list
	(posix_fadvise64): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
	(posix_fadvise64): Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
	(posix_fadvise64): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/syscalls.list (posix_fadvise64):
	Likewise.
	* sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S: Moved to...
	* sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: ...here.
	(__posix_fadvise64_l64): Fix a typo in fadvise64 syscall invocation.
	(__posix_fadvise64_l32): New function.
	* sysdeps/unix/sysv/linux/i386/Makefile: Revert last change.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions (libc): Export
	posix_fadvise64@@GLIBC_2.3.3.
	* sysdeps/unix/sysv/linux/s390/s390-32/Versions (libc): Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/Versions (libc): Likewise.
	* sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Return
	error value.
	* sysdeps/unix/sysv/linux/posix_fadvise64.c: New file.

--- libc/sysdeps/powerpc/powerpc32/sysdep.h.jj	2003-03-23 14:42:22.000000000 -0500
+++ libc/sysdeps/powerpc/powerpc32/sysdep.h	2003-08-16 06:07:52.000000000 -0400
@@ -144,6 +144,19 @@
 #define	PSEUDO_END_NOERRNO(name)					      \
   END (name)
 
+#define PSEUDO_ERRVAL(name, syscall_name, args)				      \
+  .section ".text";							      \
+  ENTRY (name)								      \
+    DO_CALL (SYS_ify (syscall_name));
+
+#define PSEUDO_RET_ERRVAL						      \
+    blr
+#define ret_ERRVAL PSEUDO_RET_ERRVAL
+
+#undef	PSEUDO_END_ERRVAL
+#define	PSEUDO_END_ERRVAL(name)						      \
+  END (name)
+
 /* Local labels stripped out by the linker.  */
 #undef L
 #define L(x) .L##x
--- libc/sysdeps/powerpc/powerpc64/sysdep.h.jj	2003-06-12 18:29:25.000000000 -0400
+++ libc/sysdeps/powerpc/powerpc64/sysdep.h	2003-08-16 06:09:06.000000000 -0400
@@ -249,6 +249,20 @@ LT_LABELSUFFIX(name,_name_end): ; \
 #define	PSEUDO_END_NOERRNO(name) \
   END (name)
 
+#define PSEUDO_ERRVAL(name, syscall_name, args) \
+  .section ".text";	\
+  ENTRY (name) \
+  DO_CALL (SYS_ify (syscall_name));
+
+#define PSEUDO_RET_ERRVAL \
+    blr
+
+#define ret_ERRVAL PSEUDO_RET_ERRVAL
+
+#undef	PSEUDO_END_ERRVAL
+#define	PSEUDO_END_ERRVAL(name) \
+  END (name)
+
 /* Label in text section.  */
 /* ppc64 function descriptors which requires . notation */
 #define C_TEXT(name) .##name
--- libc/sysdeps/unix/alpha/sysdep.h.jj	2003-06-20 12:24:35.000000000 -0400
+++ libc/sysdeps/unix/alpha/sysdep.h	2003-08-16 06:11:08.000000000 -0400
@@ -134,6 +134,21 @@ __LABEL(name)						\
 
 #define ret_NOERRNO ret
 
+#define PSEUDO_ERRVAL(name, syscall_name, args)	\
+	.globl name;					\
+	.align 4;					\
+	.ent name,0;					\
+__LABEL(name)						\
+	PSEUDO_PROLOGUE;				\
+	PSEUDO_PREPARE_ARGS				\
+	lda	v0, SYS_ify(syscall_name);		\
+	call_pal PAL_callsys;
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(sym)  END(sym)
+
+#define ret_ERRVAL ret
+
 #define r0	v0
 #define r1	a4
 
--- libc/sysdeps/unix/mips/sysdep.h.jj	2003-03-29 03:15:28.000000000 -0500
+++ libc/sysdeps/unix/mips/sysdep.h	2003-08-16 06:13:20.000000000 -0400
@@ -51,6 +51,18 @@
 
 #define ret_NOERRNO ret
 
+#define PSEUDO_ERRVAL(name, syscall_name, args)	\
+  .align 2;						\
+  ENTRY(name)						\
+  .set noreorder;					\
+  li v0, SYS_ify(syscall_name);				\
+  syscall
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(sym) .end sym; .size sym,.-sym
+
+#define ret_ERRVAL ret
+
 #define r0	v0
 #define r1	v1
 /* The mips move insn is d,s.  */
--- libc/sysdeps/unix/sparc/sysdep.h.jj	2003-03-23 14:42:22.000000000 -0500
+++ libc/sysdeps/unix/sparc/sysdep.h	2003-08-16 04:09:50.000000000 -0400
@@ -58,8 +58,15 @@
   mov SYS_ify(syscall_name), %g1;		\
   ta 0
 
+#define	PSEUDO_ERRVAL(name, syscall_name, args) \
+  .global syscall_error;			\
+  ENTRY (name)					\
+  mov SYS_ify(syscall_name), %g1;		\
+  ta 0
+
 #define	ret		retl; nop
 #define	ret_NOERRNO	retl; nop
+#define	ret_ERRVAL	retl; nop
 #define	r0		%o0
 #define	r1		%o1
 #define	MOVE(x,y)	mov x, y
--- libc/sysdeps/unix/sysv/linux/alpha/syscalls.list.jj	2003-08-16 06:22:34.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/alpha/syscalls.list	2003-08-16 07:04:59.000000000 -0400
@@ -21,7 +21,7 @@ getpriority	-	getpriority	i:ii	__getprio
 mmap		-	mmap		b:aniiii __mmap		mmap __mmap64 mmap64
 llseek		EXTRA	lseek		C:3	__libc_lseek	__lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64
 lseek		llseek	-
-posix_fadvise64	-	fadvise64	4	posix_fadvise64	posix_fadvise
+posix_fadvise64	-	fadvise64	Vi:iiii	posix_fadvise64	posix_fadvise
 pread		-	pread64		C:4	__libc_pread	__libc_pread64 __pread pread __pread64 pread64
 pwrite		-	pwrite64		C:4	__libc_pwrite	__libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64
 fstatfs		-	fstatfs		i:ip	__fstatfs	fstatfs __fstatfs64 fstatfs64
--- libc/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S.jj	2003-08-16 07:48:11.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S	2003-08-16 07:54:24.000000000 -0400
@@ -0,0 +1,132 @@
+/* Copyright (C) 1995,96,97,98,99,2000,2002,2003 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
+
+#include "kernel-features.h"
+
+#define EINVAL	22
+#define ENOSYS	38
+#define EOVERFLOW 75
+
+#define SVRSP	16		/* saved register space */
+#define PARMS	LINKAGE+SVRSP	/* space for 4 saved regs */
+#define FD	PARMS
+#define OFFLO	FD+4
+#define OFFHI	OFFLO+4
+#define LENLO	OFFHI+4
+#define LENHI	LENLO+4
+#define FLAGS	LENHI+4
+
+	.text
+ENTRY (BP_SYM (__posix_fadvise64_l64))
+
+#ifdef __NR_fadvise64_64
+
+	/* Save registers.  */
+	pushl	%ebp
+	pushl	%ebx
+	pushl	%esi
+	pushl	%edi
+
+	movl	FD(%esp), %ebx
+	movl	OFFLO(%esp), %ecx
+	movl	OFFHI(%esp), %edx
+	movl	LENLO(%esp), %esi
+	movl	LENHI(%esp), %edi
+	movl	FLAGS(%esp), %ebp
+
+	movl	$SYS_ify(fadvise64_64), %eax
+	ENTER_KERNEL
+
+	/* Restore registers.  */
+	popl	%edi
+	popl	%esi
+	popl	%ebx
+	popl	%ebp
+
+#ifndef __ASSUME_FADVISE64_64_SYSCALL
+	cmpl	$-ENOSYS, %eax
+	je	1f
+#endif
+
+	/* The function returns zero, or the error number.  So all we
+	   have to do is negate the value passed back from the kernel.  */
+	/* If 0 > %eax > -4096 there was an error.  */
+	negl	%eax
+
+	/* Successful; return the syscall's value.  */
+	ret
+#endif
+
+#if defined __NR_fadvise64 \
+    && (!defined __ASSUME_FADVISE64_64_SYSCALL || !defined __NR_fadvise64_64)
+1:	/* Save registers.  */
+	pushl	%ebx
+	pushl	%esi
+	pushl	%edi
+
+	/* Overflow check.  */
+	cmpl	$0, LENHI(%esp)
+	jne	L(overflow)
+
+	movl	FD(%esp), %ebx
+	movl	OFFLO(%esp), %ecx
+	movl	OFFHI(%esp), %edx
+	movl	LENLO(%esp), %esi
+	movl	FLAGS(%esp), %edi
+
+	movl	$SYS_ify(fadvise64), %eax
+	ENTER_KERNEL
+
+	/* Restore registers.  */
+	popl	%edi
+	popl	%esi
+	popl	%ebx
+
+	/* If 0 > %eax > -4096 there was an error.  */
+	negl	%eax
+
+	/* Successful; return the syscall's value.  */
+	ret
+
+L(overflow):
+	movl	$EOVERFLOW, %eax
+	ret
+#elif
+	movl	$ENOSYS, %eax
+	ret
+#endif
+
+END (BP_SYM (__posix_fadvise64_l64))
+
+#ifdef __NR_fadvise64
+PSEUDO_ERRVAL (__posix_fadvise64_l32, posix_fadvise64, 5)
+	ret
+PSEUDO_END_ERRVAL (__posix_fadvise64_l32)
+#else
+ENTRY (BP_SYM (__posix_fadvise64_l32))
+	movl	$ENOSYS, %eax
+	ret
+END (BP_SYM (__posix_fadvise64_l32))
+#endif
+
+default_symbol_version (__posix_fadvise64_l64, posix_fadvise64, GLIBC_2.3.3)
+symbol_version (__posix_fadvise64_l32, posix_fadvise64, GLIBC_2.2)
--- libc/sysdeps/unix/sysv/linux/i386/Makefile.jj	2003-08-16 06:22:35.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/i386/Makefile	2003-08-16 07:54:42.000000000 -0400
@@ -12,7 +12,3 @@ endif
 ifeq ($(subdir),resource)
 sysdep_routines += oldgetrlimit64
 endif
-
-ifeq ($(subdir),io)
-sysdep_routines += posix_fadvise64_64
-endif
--- libc/sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S.jj	2003-08-16 06:22:35.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S	2003-08-16 07:48:08.000000000 -0400
@@ -1,120 +0,0 @@
-/* Copyright (C) 1995,96,97,98,99,2000,2002,2003 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, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
-
-#include "kernel-features.h"
-
-#define EINVAL	22
-#define ENOSYS	38
-#define EOVERFLOW 75
-
-#define SVRSP	16		/* saved register space */
-#define PARMS	LINKAGE+SVRSP	/* space for 4 saved regs */
-#define FD	PARMS
-#define OFFLO	FD+4
-#define OFFHI	OFFLO+4
-#define LENLO	OFFHI+4
-#define LENHI	LENLO+4
-#define FLAGS	LENHI+4
-
-	.text
-ENTRY (BP_SYM (__posix_fadvise64_l64))
-
-#ifdef __NR_fadvise64_64
-
-	/* Save registers.  */
-	pushl	%ebp
-	pushl	%ebx
-	pushl	%esi
-	pushl	%edi
-
-	movl	FD(%esp), %ebx
-	movl	OFFLO(%esp), %ecx
-	movl	OFFHI(%esp), %edx
-	movl	LENLO(%esp), %esi
-	movl	LENHI(%esp), %edi
-	movl	FLAGS(%esp), %ebp
-
-	movl	$SYS_ify(fadvise64_64), %eax
-	ENTER_KERNEL
-
-	/* Restore registers.  */
-	popl	%edi
-	popl	%esi
-	popl	%ebx
-	popl	%ebp
-
-#ifndef __ASSUME_FADVISE64_64_SYSCALL
-	cmpl	$-ENOSYS, %eax
-	je	1f
-#endif
-
-	/* The function returns zero, or the error number.  So all we
-	   have to do is negate the value passed back from the kernel.  */
-	/* If 0 > %eax > -4096 there was an error.  */
-	negl	%eax
-
-	/* Successful; return the syscall's value.  */
-	ret
-#endif
-
-#if defined __NR_fadvise64 \
-    && (!defined __ASSUME_FADVISE64_64_SYSCALL || !defined __NR_fadvise64_64)
-1:	/* Save registers.  */
-	pushl	%ebx
-	pushl	%esi
-	pushl	%edi
-
-	/* Overflow check.  */
-	cmpl	$0, LENHI(%esp)
-	jne	L(overflow)
-
-	movl	FD(%esp), %ebx
-	movl	OFFLO(%esp), %ecx
-	movl	OFFHI(%esp), %edx
-	movl	LENLO(%esp), %esi
-	movl	FLAGS(%esp), %edi
-
-	movl	$SYS_ify(fadvise64_64), %eax
-	ENTER_KERNEL
-
-	/* Restore registers.  */
-	popl	%edi
-	popl	%esi
-	popl	%ebx
-
-	/* If 0 > %eax > -4096 there was an error.  */
-	negl	%eax
-
-	/* Successful; return the syscall's value.  */
-	ret
-
-L(overflow):
-	movl	$EOVERFLOW, %eax
-	ret
-#elif
-	movl	$ENOSYS, %eax
-	ret
-#endif
-
-PSEUDO_END_NOERRNO (BP_SYM (__posix_fadvise64_l64))
-
-default_symbol_version (__posix_fadvise64_l64, posix_fadvise64, GLIBC_2.3.3)
--- libc/sysdeps/unix/sysv/linux/ia64/syscalls.list.jj	2003-08-16 06:22:35.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/ia64/syscalls.list	2003-08-16 07:06:38.000000000 -0400
@@ -5,7 +5,7 @@ umount2		-	umount		2	__umount2	umount2
 # Whee! 64-bit systems naturally implement llseek.
 llseek		EXTRA	lseek		C:3	__libc_lseek	__lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64
 lseek		llseek	-
-posix_fadvise64	-	fadvise64	4	posix_fadvise64	posix_fadvise
+posix_fadvise64	-	fadvise64	Vi:iiii	posix_fadvise64	posix_fadvise
 pread		-	pread		C:4	__libc_pread	__libc_pread64 __pread pread __pread64 pread64
 pwrite		-	pwrite		C:4	__libc_pwrite	__libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64
 fstatfs		-	fstatfs		i:ip	__fstatfs	fstatfs fstatfs64 __fstatfs64
--- libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions.jj	2002-09-05 06:12:15.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions	2003-08-16 07:09:34.000000000 -0400
@@ -20,4 +20,7 @@ libc {
     # s*
     scandir64;
   }
+  GLIBC_2.3.3 {
+    posix_fadvise64;
+  }
 }
--- libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list.jj	2003-02-05 18:29:25.000000000 -0500
+++ libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list	2003-08-16 07:07:10.000000000 -0400
@@ -25,7 +25,7 @@ s_getrlimit	getrlimit getrlimit	i:ip	__s
 s_lstat64	lxstat64 lstat64	i:sp	__syscall_lstat64
 s_mmap2		mmap64	mmap2		b:aniiii __syscall_mmap2
 s_poll		poll	poll		i:pii	__syscall_poll
-posix_fadvise64	-	fadvise64	4	posix_fadvise64	posix_fadvise
+posix_fadvise64	-	fadvise64	Vi:iiii	posix_fadvise64	posix_fadvise
 s_ptrace	ptrace	ptrace		i:iipp	__syscall_ptrace
 s_putpmsg	putpmsg	putpmsg		i:ippii	__syscall_putpmsg
 s_reboot	reboot	reboot		i:iii	__syscall_reboot
--- libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h.jj	2003-03-26 13:04:22.000000000 -0500
+++ libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h	2003-08-16 04:15:54.000000000 -0400
@@ -69,6 +69,17 @@
 #define PSEUDO_END_NOERRNO(name)					      \
   END (name)
 
+#undef PSEUDO_ERRVAL
+#define	PSEUDO_ERRVAL(name, syscall_name, args)				      \
+  .text;                                                                      \
+  ENTRY (name)							              \
+    DO_CALL (syscall_name, args);					      \
+    lcr %r2,%r2
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name)						      \
+  END (name)
+
 #ifndef PIC
 # define SYSCALL_ERROR_LABEL 0f
 # define SYSCALL_ERROR_HANDLER \
@@ -156,6 +167,9 @@
 #define ret_NOERRNO							      \
     br      14
 
+#define ret_ERRVAL							      \
+    br      14
+
 #endif /* __ASSEMBLER__ */
 
 #undef INLINE_SYSCALL
--- libc/sysdeps/unix/sysv/linux/s390/s390-32/Versions.jj	2002-08-23 05:29:14.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/s390/s390-32/Versions	2003-08-16 07:13:05.000000000 -0400
@@ -23,5 +23,8 @@ libc {
     # v*
     versionsort64;
   }
+  GLIBC_2.3.3 {
+    posix_fadvise64;
+  }
 }
 
--- libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h.jj	2003-05-05 14:23:10.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h	2003-08-16 06:19:45.000000000 -0400
@@ -83,6 +83,18 @@
   SYSCALL_ERROR_HANDLER;						      \
   END (name)
 
+#undef PSEUDO_ERRVAL
+#define	PSEUDO_ERRVAL(name, syscall_name, args)				      \
+  .text;								      \
+  ENTRY (name)								      \
+    DO_CALL (syscall_name, args);					      \
+    lcgr %r2,%r2
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name)						      \
+  SYSCALL_ERROR_HANDLER;						      \
+  END (name)
+
 #ifndef PIC
 # define SYSCALL_ERROR_LABEL syscall_error
 # define SYSCALL_ERROR_HANDLER
@@ -158,6 +170,9 @@
 #define ret_NOERRNO							      \
     br	    14
 
+#define ret_ERRVAL							      \
+    br	    14
+
 #endif /* __ASSEMBLER__ */
 
 #undef INLINE_SYSCALL
--- libc/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list.jj	2003-03-10 14:21:15.000000000 -0500
+++ libc/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list	2003-08-16 07:07:40.000000000 -0400
@@ -10,7 +10,7 @@ getpeername	-	getpeername	i:ipp	__getpee
 ftruncate	-	ftruncate	2	__ftruncate	ftruncate ftruncate64 __ftruncate64
 truncate	-	truncate	2	truncate	truncate64
 getrlimit	-	getrlimit	2	__getrlimit	getrlimit getrlimit64
-posix_fadvise64	-	fadvise64	4	posix_fadvise64	posix_fadvise
+posix_fadvise64	-	fadvise64	Vi:iiii	posix_fadvise64	posix_fadvise
 setrlimit	-	setrlimit	2	__setrlimit	setrlimit setrlimit64
 vfork		-	vfork		0	__vfork		vfork
 
--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.jj	2003-03-23 14:42:23.000000000 -0500
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h	2003-08-16 04:07:31.000000000 -0400
@@ -36,6 +36,7 @@
 /* Linux/SPARC uses a different trap number */
 #undef PSEUDO
 #undef PSEUDO_NOERRNO
+#undef PSEUDO_ERRVAL
 #undef ENTRY
 #undef END
 #undef LOC
@@ -115,6 +116,12 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_er
 	LOADSYSCALL(syscall_name);				\
 	ta 0x10
 
+#define PSEUDO_ERRVAL(name, syscall_name, args)			\
+	.text;							\
+	ENTRY(name);						\
+	LOADSYSCALL(syscall_name);				\
+	ta 0x10
+
 #else  /* __ASSEMBLER__ */
 
 #define __SYSCALL_STRING						\
--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/Versions.jj	2002-08-23 05:29:15.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/Versions	2003-08-16 07:15:41.000000000 -0400
@@ -17,4 +17,7 @@ libc {
     # s*
     scandir64;
   }
+  GLIBC_2.3.3 {
+    posix_fadvise64;
+  }
 }
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h.jj	2003-04-14 12:48:29.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h	2003-08-16 04:10:57.000000000 -0400
@@ -36,6 +36,7 @@
 /* Linux/SPARC uses a different trap number */
 #undef PSEUDO
 #undef PSEUDO_NOERRNO
+#undef PSEUDO_ERRVAL
 #undef ENTRY
 
 #define ENTRY(name)							\
@@ -108,6 +109,12 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_er
 	LOADSYSCALL(syscall_name);					\
 	ta	0x6d
 
+#define PSEUDO_ERRVAL(name, syscall_name, args)				\
+	.text;								\
+	ENTRY(name);							\
+	LOADSYSCALL(syscall_name);					\
+	ta	0x6d
+
 #undef PSEUDO_END
 #define PSEUDO_END(name)						\
 	.size name,.-name
@@ -116,6 +123,10 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_er
 #define PSEUDO_END_NOERRNO(name)					\
 	.size name,.-name
 
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name)						\
+	.size name,.-name
+
 #undef END
 #define END(name)							\
 	.size name,.-name
@@ -123,6 +134,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_er
 /* Careful here!  This "ret" define can interfere; use jmpl if unsure.  */
 #define ret		retl; nop
 #define ret_NOERRNO	retl; nop
+#define ret_ERRVAL	retl; nop
 #define r0              %o0
 #define r1              %o1
 #define MOVE(x,y)       mov x, y
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list.jj	2003-02-05 18:29:26.000000000 -0500
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list	2003-08-16 07:08:03.000000000 -0400
@@ -13,7 +13,7 @@ truncate	-	truncate	2	truncate	truncate6
 mmap		-	mmap		6	__mmap		mmap __mmap64 mmap64
 readahead	-	readahead	3	__readahead	readahead
 sendfile	-	sendfile	i:iipi	sendfile	sendfile64
-posix_fadvise64	-	fadvise64	4	posix_fadvise64	posix_fadvise
+posix_fadvise64	-	fadvise64	Vi:iiii	posix_fadvise64	posix_fadvise
 
 # Override select.S in parent directory:
 select		-	select		C:5	__select	select
--- libc/sysdeps/unix/sysv/linux/x86_64/syscalls.list.jj	2003-08-16 06:22:36.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/x86_64/syscalls.list	2003-08-16 07:08:33.000000000 -0400
@@ -4,7 +4,7 @@ arch_prctl	EXTRA	arch_prctl	i:ii	__arch_
 mmap		-	mmap		b:aniiii __mmap		mmap __mmap64 mmap64
 modify_ldt	EXTRA	modify_ldt	i:ipi	__modify_ldt	modify_ldt
 llseek		EXTRA	lseek		Ci:iii	__libc_lseek64	__llseek llseek __lseek64 lseek64
-posix_fadvise64	-	fadvise64	i:iiii	posix_fadvise64	posix_fadvise
+posix_fadvise64	-	fadvise64	Vi:iiii	posix_fadvise64	posix_fadvise
 pread		-	pread		Ci:ibni	__libc_pread	__libc_pread64 __pread pread __pread64 pread64
 pwrite		-	pwrite		Ci:ibni	__libc_pwrite	__libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64
 fstatfs		-	fstatfs		i:ip	__fstatfs	fstatfs __fstatfs64 fstatfs64
--- libc/sysdeps/unix/sysv/linux/syscalls.list.jj	2003-08-16 03:52:40.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/syscalls.list	2003-08-16 07:46:09.000000000 -0400
@@ -44,8 +44,6 @@ pause		-	pause		Ci:	__libc_pause	pause
 personality	init-first personality	i:i	__personality	personality
 pipe		-	pipe		i:f	__pipe		pipe
 pivot_root	EXTRA	pivot_root	i:ss	pivot_root
-posix_fadvise64 -	fadvise64	Vi:iiiii	__posix_fadvise64_l32	posix_fadvise64@GLIBC_2.2
-posix_fadvise64_64 -	fadvise64_64	Vi:iiiiii __posix_fadvise64_l64	posix_fadvise64@GLIBC_2.3.3
 prctl		EXTRA	prctl		i:iiiii	__prctl		prctl
 putpmsg		-	putpmsg		i:ippii	putpmsg
 query_module	EXTRA	query_module	i:sipip	query_module
--- libc/sysdeps/unix/sysv/linux/posix_fadvise.c.jj	2003-08-16 03:52:40.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/posix_fadvise.c	2003-08-16 06:47:29.000000000 -0400
@@ -27,10 +27,14 @@ int
 posix_fadvise (int fd, off_t offset, off_t len, int advise)
 {
 #ifdef __NR_fadvise64
-  return INLINE_SYSCALL (fadvise64, 5, fd,
-			 __LONG_LONG_PAIR (offset >> 31, offset), len, advise);
+  INTERNAL_SYSCALL_DECL (err);
+  int ret = INTERNAL_SYSCALL (fadvise64, err, 5, fd,
+			      __LONG_LONG_PAIR (offset >> 31, offset), len,
+			      advise);
+  if (INTERNAL_SYSCALL_ERROR_P (ret, err))
+    return INTERNAL_SYSCALL_ERRNO (ret, err);
+  return 0;
 #else
-  __set_errno (ENOSYS);
-  return -1;
+  return ENOSYS;
 #endif
 }
--- libc/sysdeps/unix/sysv/linux/posix_fadvise64.c.jj	2003-08-16 06:37:08.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/posix_fadvise64.c	2003-08-16 07:45:02.000000000 -0400
@@ -0,0 +1,78 @@
+/* Copyright (C) 2003 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sysdep.h>
+#include <kernel-features.h>
+
+int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise);
+int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise);
+
+/* Advice the system about the expected behaviour of the application with
+   respect to the file associated with FD.  */
+
+int
+__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise)
+{
+#ifdef __NR_fadvise64_64
+  INTERNAL_SYSCALL_DECL (err);
+  int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd,
+			      __LONG_LONG_PAIR (offset >> 32, offset),
+			      __LONG_LONG_PAIR (len >> 32, len),
+			      advise);
+  if (!INTERNAL_SYSCALL_ERROR_P (ret, err))
+    return 0;
+# ifndef __ASSUME_FADVISE64_64_SYSCALL
+  if (INTERNAL_SYSCALL_ERRNO (ret, err) != ENOSYS)
+# endif
+   return INTERNAL_SYSCALL_ERRNO (ret, err);
+#endif
+#ifndef __ASSUME_FADVISE64_64_SYSCALL
+# ifdef __NR_fadvise64
+  if (len != (off_t) len)
+    return EOVERFLOW;
+
+  INTERNAL_SYSCALL_DECL (err2);
+  int ret2 = INTERNAL_SYSCALL (fadvise64, err2, 5, fd,
+			       __LONG_LONG_PAIR (offset >> 32, offset),
+			       (off_t) len, advise);
+  if (!INTERNAL_SYSCALL_ERROR_P (ret2, err2))
+    return 0;
+  return INTERNAL_SYSCALL_ERRNO (ret2, err2);
+# else
+  return ENOSYS;
+# endif
+#endif
+}
+
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3)
+
+int
+__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise)
+{
+  return __posix_fadvise64_l64 (fd, offset, len, advise);
+}
+
+versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3);
+compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2);
+#else
+strong_alias (__posix_fadvise64_l64, posix_fadvise64);
+#endif
--- libc/sysdeps/unix/sysdep.h.jj	2003-03-26 13:07:28.000000000 -0500
+++ libc/sysdeps/unix/sysdep.h	2003-08-16 06:12:21.000000000 -0400
@@ -50,6 +50,9 @@
 #ifndef PSEUDO_END_NOERRNO
 #define PSEUDO_END_NOERRNO(sym)	PSEUDO_END(sym)
 #endif
+#ifndef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(sym)	PSEUDO_END(sym)
+#endif
 
 /* Wrappers around system calls should normally inline the system call code.
    But sometimes it is not possible or implemented and we use this code.  */


	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]