posix_fadvise change
Jakub Jelinek
jakub@redhat.com
Sat Aug 16 12:49:00 GMT 2003
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
More information about the Libc-hacker
mailing list