OSDN Git Service

- take LFS into account and add fallback via fadvise64
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Fri, 19 Sep 2008 10:31:02 +0000 (10:31 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Fri, 19 Sep 2008 10:31:02 +0000 (10:31 -0000)
libc/sysdeps/linux/i386/posix_fadvise64.S

index 27cf7dd..da3f363 100644 (file)
 .global posix_fadvise64
 .type   posix_fadvise64,%function
 posix_fadvise64:
-#ifdef __NR_posix_fadvise64_64
-
+#if defined __NR_fadvise64_64 && defined __UCLIBC_HAS_LFS__
        /* Save regs  */
        pushl   %ebp
        pushl   %ebx
        pushl   %esi
        pushl   %edi
 
-       movl $__NR_posix_fadvise64_64, %eax     /* Syscall number in %eax.  */
+       movl $__NR_fadvise64_64, %eax   /* Syscall number in %eax.  */
 
        movl    24(%esp), %ebx
        movl    28(%esp), %ecx
@@ -55,7 +54,38 @@ posix_fadvise64:
        /* If 0 > %eax > -4096 there was an error.  */
        cmpl $-4096, %eax
        ja __syscall_error
-#else
+#elif defined __NR_fadvise64
+       /* Save regs  */
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+       /* does len overflow long?  */
+       cmpl    $0, 40(%esp)
+       movl    $-EOVERFLOW, %eax
+       ja      overflow
+
+       movl $__NR_fadvise64, %eax      /* Syscall number in %eax.  */
+
+       movl    24(%esp), %ebx
+       movl    28(%esp), %ecx
+       movl    32(%esp), %edx
+       movl    36(%esp), %esi
+       movl    44(%esp), %edi
+
+       /* Do the system call trap.  */
+       int $0x80
+overflow:
+       /* Restore regs  */
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+
+       /* If 0 > %eax > -4096 there was an error.  */
+       cmpl $-4096, %eax
+       ja __syscall_error
+
+#elif defined __UCLIBC_HAS_STUBS__
        movl    $-ENOSYS, %eax
        jmp __syscall_error
 #endif