From bfef9264665ff93866882402a71c116cd0757de1 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 16 Aug 2003 06:21:46 +0000 Subject: Update. 2003-08-15 Ulrich Drepper * io/Versions [GLIBC_2.3.3]: Add posix_fadvise64. * io/fcntl.h (posix_fadvise64): Change type of third parameter to off_t. * sysdeps/unix/sysv/linux/posix_fadvise.c: Adjust definition. * sysdeps/unix/make-syscalls.sh: Recognize V prefix to the parameter description indicating the error value is returned, not -1. * sysdeps/unix/sysv/linux/Makefile [subdir=io] (subdir_routines): Add posix_fadvise64_64. * sysdeps/unix/sysv/linux/kernel-features.h: Add definition of __ASSUME_FADVISE64_64_SYSCALL. * sysdeps/unix/sysv/linux/syscalls.list: Don't define madvise and posix_madvise in one file. Have posix_madvise defined with error value returned. Define posix_fadvise64_64 entry. Add version info to posix_fadvise64 entry. * sysdeps/unix/sysv/linux/alpha/syscalls.list: Define posix_fadvise64_64 entry. Add version info to posix_fadvise64 entry. * sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/i386/posix_fadvise.S: New file. * sysdeps/unix/sysv/linux/i386/sysdep.h: Define PSEUDO_ERRVAL, PSEUDO_END_ERRVAL, and ret_ERRVAL. * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. * posix/Makefile (routines): Add posix_madvise. * sysdeps/generic/madvise.c: Don't define posix_madvise. * sysdeps/generic/posix_madvise.c: New file. * sysdeps/unix/sysv/aix/posix_madvise.c: New file. --- sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S | 118 ++++++++++++++++++++++ sysdeps/unix/sysv/linux/i386/sysdep.h | 14 +++ 2 files changed, 132 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S (limited to 'sysdeps/unix/sysv/linux/i386') diff --git a/sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S b/sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S new file mode 100644 index 0000000000..e132c3b9a2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/posix_fadvise64_64.S @@ -0,0 +1,118 @@ +/* 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 +#include +#include + +#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)) diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 95124797e9..79ad72abff 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -90,6 +90,20 @@ #define ret_NOERRNO ret +/* The function has to return the error code. */ +#undef PSEUDO_ERRVAL +#define PSEUDO_ERRVAL(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args); \ + negl %eax + +#undef PSEUDO_END_ERRVAL +#define PSEUDO_END_ERRVAL(name) \ + END (name) + +#define ret_ERRVAL ret + #ifndef PIC # define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ #else -- cgit v1.2.3