]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/i386/mmap64.S
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / i386 / mmap64.S
index 0785bce783c1796cff6d906952c59e657a188088..3a03335814ee980d7da2ab44d2a0938bda6cc922 100644 (file)
@@ -1,31 +1,42 @@
-/* Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1995,96,97,98,99,2000,2002 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.
+   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
-   Library General Public License for more details.
+   Lesser 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.  */
+   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
 
-       .text
+#define SVRSP  16              /* saved register space */
+#define PARMS  LINKAGE+SVRSP   /* space for 4 saved regs */
+#define ADDR   PARMS
+#define LEN    ADDR+PTR_SIZE
+#define PROT   LEN+4
+#define FLAGS  PROT+4
+#define FD     FLAGS+4
+#define OFFLO  FD+4
+#define OFFHI  OFFLO+4
 
-ENTRY (__mmap64)
+       .text
+ENTRY (BP_SYM (__mmap64))
 
 #ifdef __NR_mmap2
 
@@ -35,26 +46,26 @@ ENTRY (__mmap64)
        pushl %esi
        pushl %edi
 
-       movl 40(%esp), %edx
-       movl 44(%esp), %ecx
-       testl $0x3ff, %edx
+       movl OFFLO(%esp), %edx
+       movl OFFHI(%esp), %ecx
+       testl $0xfff, %edx
        jne L(einval)
        shrdl $12, %ecx, %edx           /* mmap2 takes the offset in pages.  */
        shrl $12, %ecx
        jne L(einval)
        movl %edx, %ebp
 
-       movl 20(%esp), %ebx
-       movl 24(%esp), %ecx
-       movl 28(%esp), %edx
-       movl 32(%esp), %esi
-       movl 36(%esp), %edi
+       movl ADDR(%esp), %ebx
+       movl LEN(%esp), %ecx
+       movl PROT(%esp), %edx
+       movl FLAGS(%esp), %esi
+       movl FD(%esp), %edi
 
        movl $SYS_ify(mmap2), %eax      /* System call number in %eax.  */
 
        /* Do the system call trap.  */
 L(do_syscall):
-       int $0x80
+       ENTER_KERNEL
 
        /* Restore registers.  */
        popl %edi
@@ -62,6 +73,12 @@ L(do_syscall):
        popl %ebx
        popl %ebp
 
+#ifndef __ASSUME_MMAP2_SYSCALL
+2:
+       cmp $-ENOSYS, %eax
+       je 3f
+#endif
+
        /* If 0 > %eax > -4096 there was an error.  */
        cmpl $-4096, %eax
        ja SYSCALL_ERROR_LABEL
@@ -70,12 +87,6 @@ L(do_syscall):
 L(pseudo_end):
        ret
 
-#ifndef __ASSUME_MMAP2_SYSCALL
-2:
-       cmp $-ENOSYS, %eax
-       je 3f
-#endif
-
        /* This means the offset value is too large.  */
 L(einval):
        popl %edi
@@ -87,25 +98,19 @@ L(einval):
 #endif
 
 #if !defined __ASSUME_MMAP2_SYSCALL || !defined __NR_mmap2
-
-# ifndef __NR_mmap2
+3:
        /* Save registers.  */
        movl %ebx, %edx
-# endif
-3:
-       cmpl $0, 44(%esp)
-       jne L(einval)
 
-       movl $SYS_ify(mmap), %eax       /* System call number in %eax.  */
+       cmpl $0, OFFHI-SVRSP(%esp)
+       jne L(einval2)
 
-       lea 4(%esp), %ebx               /* Address of args is 1st arg.  */
+       movl $SYS_ify(mmap), %eax       /* System call number in %eax.  */
 
-# ifdef __NR_mmap2
-       jmp L(do_syscall)
-# else
+       lea ADDR-SVRSP(%esp), %ebx      /* Address of args is 1st arg.  */
 
        /* Do the system call trap.  */
-       int $0x80
+       ENTER_KERNEL
 
        /* Restore registers.  */
        movl %edx, %ebx
@@ -115,15 +120,17 @@ L(einval):
        ja SYSCALL_ERROR_LABEL
 
        /* Successful; return the syscall's value.  */
+#ifndef __NR_mmap2
 L(pseudo_end):
+#endif
        ret
 
-L(einval):
+L(einval2):
+       movl %edx, %ebx
        movl $-EINVAL, %eax
        jmp SYSCALL_ERROR_LABEL
-# endif
 #endif
 
-PSEUDO_END (__mmap64)
+PSEUDO_END (BP_SYM (__mmap64))
 
-weak_alias (__mmap64, mmap64)
+weak_alias (BP_SYM (__mmap64), BP_SYM (mmap64))