]> sourceware.org Git - glibc.git/commitdiff
i386: Remove syscall assembly codes with 6 arguments
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 15 Oct 2015 11:33:15 +0000 (04:33 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 15 Oct 2015 12:03:24 +0000 (05:03 -0700)
This patch removes i386 assembly implementation for mmap, mmap64,
semtimeop now that i386 have 6 argument syscall support from C code
and GCC 5 can inline syscalls with 6 arguments.  We also compile mmap.c,
mmap64.c and semtimedop.c with -fomit-frame-pointer since %ebp may be
used to pass the 6th argument to syscall.

Fo sysdeps/unix/sysv/linux/i386/mmap.c, with -O2 -march=i686
-mtune=generic, GCC 5.2 now generates:

<__mmap>:
   0: sub    $0x10,%esp
   3: mov    0x28(%esp),%eax
   7: mov    %ebx,(%esp)
   a: mov    0x18(%esp),%ecx
   e: mov    %esi,0x4(%esp)
  12: mov    0x14(%esp),%ebx
  16: mov    %edi,0x8(%esp)
  1a: mov    0x1c(%esp),%edx
  1e: test   $0xfff,%eax
  23: mov    0x20(%esp),%esi
  27: mov    %ebp,0xc(%esp)
  2b: mov    0x24(%esp),%edi
  2f: jne    60 <__mmap+0x60>
  31: shr    $0xc,%eax
  34: mov    %eax,%ebp
  36: mov    $0xc0,%eax
  3b: call   *%gs:0x10
  42: cmp    $0xfffff000,%eax
  47: ja     65 <__mmap+0x65>
  49: mov    (%esp),%ebx
  4c: mov    0x4(%esp),%esi
  50: mov    0x8(%esp),%edi
  54: mov    0xc(%esp),%ebp
  58: add    $0x10,%esp
  5b: ret
  5c: lea    0x0(%esi,%eiz,1),%esi
  60: mov    $0xffffffea,%eax
  65: mov    (%esp),%ebx
  68: mov    0x4(%esp),%esi
  6c: mov    0x8(%esp),%edi
  70: mov    0xc(%esp),%ebp
  74: add    $0x10,%esp
  77: jmp    78 <__mmap+0x78>

vs sysdeps/unix/sysv/linux/i386/mmap.S:

<__mmap>:
   0: push   %ebp
   1: push   %ebx
   2: push   %esi
   3: push   %edi
   4: mov    0x14(%esp),%ebx
   8: mov    0x18(%esp),%ecx
   c: mov    0x1c(%esp),%edx
  10: mov    0x20(%esp),%esi
  14: mov    0x24(%esp),%edi
  18: mov    0x28(%esp),%ebp
  1c: test   $0xfff,%ebp
  22: mov    $0xffffffea,%eax
  27: jne    38 <__mmap+0x38>
  29: shr    $0xc,%ebp
  2c: mov    $0xc0,%eax
  31: call   *%gs:0x10
  38: pop    %edi
  39: pop    %esi
  3a: pop    %ebx
  3b: pop    %ebp
  3c: cmp    $0xfffff000,%eax
  41: ja     44 <__mmap+0x44>
  43: ret
  44: call   45 <__mmap+0x45> 45: R_386_PC32 __x86.get_pc_thunk.cx
  49: add    $0x2,%ecx 4b: R_386_GOTPC _GLOBAL_OFFSET_TABLE_
  4f: mov    0x0(%ecx),%ecx 51: R_386_TLS_GOTIE __libc_errno
  55: neg    %eax
  57: mov    %eax,%gs:(%ecx)
  5a: or     $0xffffffff,%eax
  5d: ret

The C version has:

   3: mov    0x28(%esp),%eax
...
  1e: test   $0xfff,%eax
...
  31: sar    $0xc,%eax
  34: mov    %eax,%ebp

is due to missing $ebx register constraint for inline asm.  We have
to use "r" constraint with

register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6);

and compiler chose %eax for offset (arg6) in

  if (offset & (MMAP_PAGE_UNIT - 1))

* sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-epoll_pwait.c):
Add -fomit-frame-pointer.
(CFLAGS-mmap.c): Likewise.
(CFLAGS-mmap64.c): Likewise.
(CFLAGS-semtimedop.c): Likewise.
* sysdeps/unix/sysv/linux/i386/mmap.c: New file.
* sysdeps/unix/sysv/linux/i386/mmap.S: Remove file.
* sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise.
* sysdeps/unix/sysv/linux/i386/semtimedop.S: Likewise.

ChangeLog
sysdeps/unix/sysv/linux/i386/Makefile
sysdeps/unix/sysv/linux/i386/mmap.S [deleted file]
sysdeps/unix/sysv/linux/i386/mmap.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/mmap64.S [deleted file]
sysdeps/unix/sysv/linux/i386/semtimedop.S [deleted file]

index fa58b3042db1e5808a84230308df2150f5ba19e7..ab795fe0dd769886e8311a5cb99a1b7fb0109188 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2015-10-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-mmap.c): Add
+       -fomit-frame-pointer.
+       (CFLAGS-mmap64.c): Likewise.
+       (CFLAGS-semtimedop.c): Likewise.
+       * sysdeps/unix/sysv/linux/i386/mmap.c: New file.
+       * sysdeps/unix/sysv/linux/i386/mmap.S: Remove file.
+       * sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise.
+       * sysdeps/unix/sysv/linux/i386/semtimedop.S: Likewise.
+
 2015-10-15  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #18928]
index e10d133db43606984c7fb5e90a046db5d9ed34e5..49ccf3e2e9fd94e6d1a28ae3136e8db830b3694a 100644 (file)
@@ -3,6 +3,14 @@ default-abi := 32
 
 ifeq ($(subdir),misc)
 sysdep_routines += ioperm iopl vm86
+# %ebp may be used to pass the 6th argument to syscall.
+CFLAGS-mmap.c += -fomit-frame-pointer
+CFLAGS-mmap64.c += -fomit-frame-pointer
+endif
+
+ifeq ($(subdir),sysvipc)
+# %ebp may be used to pass the 6th argument to syscall.
+CFLAGS-semtimedop.c += -fomit-frame-pointer
 endif
 
 ifeq ($(subdir),elf)
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
deleted file mode 100644 (file)
index daf807a..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (C) 1995-2015 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, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-
-#define EINVAL 22
-
-       .text
-
-ENTRY (__mmap)
-
-       /* Save registers.  */
-       pushl %ebp
-       cfi_adjust_cfa_offset (4)
-       pushl %ebx
-       cfi_adjust_cfa_offset (4)
-       pushl %esi
-       cfi_adjust_cfa_offset (4)
-       pushl %edi
-       cfi_adjust_cfa_offset (4)
-
-       movl 20(%esp), %ebx
-       cfi_rel_offset (ebx, 8)
-       movl 24(%esp), %ecx
-       movl 28(%esp), %edx
-       movl 32(%esp), %esi
-       cfi_rel_offset (esi, 4)
-       movl 36(%esp), %edi
-       cfi_rel_offset (edi, 0)
-       movl 40(%esp), %ebp
-       cfi_rel_offset (ebp, 12)
-       testl $0xfff, %ebp
-       movl $-EINVAL, %eax
-       jne L(skip)
-       shrl $12, %ebp                  /* mmap2 takes the offset in pages.  */
-
-       movl $SYS_ify(mmap2), %eax      /* System call number in %eax.  */
-
-       /* Do the system call trap.  */
-       ENTER_KERNEL
-L(skip):
-       /* Restore registers.  */
-       popl %edi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
-       popl %esi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl %ebx
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
-       popl %ebp
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebp)
-
-       /* If 0 > %eax > -4096 there was an error.  */
-       cmpl $-4096, %eax
-       ja SYSCALL_ERROR_LABEL
-
-       /* Successful; return the syscall's value.  */
-       ret
-
-PSEUDO_END (__mmap)
-
-weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.c b/sysdeps/unix/sysv/linux/i386/mmap.c
new file mode 100644 (file)
index 0000000..6be8692
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (C) 2015 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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <sysdep.h>
+
+#ifndef MMAP_PAGE_UNIT
+# define MMAP_PAGE_UNIT 4096UL
+#endif
+
+__ptr_t
+__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
+{
+  if (offset & (MMAP_PAGE_UNIT - 1))
+    return (__ptr_t) INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
+  return (__ptr_t) INLINE_SYSCALL (mmap2, 6, addr, len, prot, flags, fd,
+                                   offset / MMAP_PAGE_UNIT);
+}
+
+weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S
deleted file mode 100644 (file)
index 3cf6eb9..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Copyright (C) 1995-2015 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, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-
-#define EINVAL 22
-#define ENOSYS 38
-
-#define SVRSP  16              /* saved register space */
-#define PARMS  4+SVRSP /* space for 4 saved regs */
-#define ADDR   PARMS
-#define LEN    ADDR+4
-#define PROT   LEN+4
-#define FLAGS  PROT+4
-#define FD     FLAGS+4
-#define OFFLO  FD+4
-#define OFFHI  OFFLO+4
-
-       .text
-ENTRY (__mmap64)
-
-       /* Save registers.  */
-       pushl %ebp
-       cfi_adjust_cfa_offset (4)
-       pushl %ebx
-       cfi_adjust_cfa_offset (4)
-       pushl %esi
-       cfi_adjust_cfa_offset (4)
-       pushl %edi
-       cfi_adjust_cfa_offset (4)
-
-       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
-       cfi_rel_offset (ebp, 12)
-
-       movl ADDR(%esp), %ebx
-       cfi_rel_offset (ebx, 8)
-       movl LEN(%esp), %ecx
-       movl PROT(%esp), %edx
-       movl FLAGS(%esp), %esi
-       cfi_rel_offset (esi, 4)
-       movl FD(%esp), %edi
-       cfi_rel_offset (edi, 0)
-
-       movl $SYS_ify(mmap2), %eax      /* System call number in %eax.  */
-
-       /* Do the system call trap.  */
-L(do_syscall):
-       ENTER_KERNEL
-
-       /* Restore registers.  */
-       popl %edi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
-       popl %esi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl %ebx
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
-       popl %ebp
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebp)
-
-       /* If 0 > %eax > -4096 there was an error.  */
-       cmpl $-4096, %eax
-       ja SYSCALL_ERROR_LABEL
-
-       /* Successful; return the syscall's value.  */
-       ret
-
-       cfi_adjust_cfa_offset (16)
-       cfi_rel_offset (ebp, 12)
-       cfi_rel_offset (ebx, 8)
-       cfi_rel_offset (esi, 4)
-       cfi_rel_offset (edi, 0)
-       /* This means the offset value is too large.  */
-L(einval):
-       popl %edi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
-       popl %esi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (esi)
-       popl %ebx
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
-       popl %ebp
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebp)
-       movl $-EINVAL, %eax
-       jmp SYSCALL_ERROR_LABEL
-
-PSEUDO_END (__mmap64)
-
-weak_alias (__mmap64, mmap64)
diff --git a/sysdeps/unix/sysv/linux/i386/semtimedop.S b/sysdeps/unix/sysv/linux/i386/semtimedop.S
deleted file mode 100644 (file)
index 80477b7..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Copyright (C) 2003-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
-
-   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, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-
-#define SYSOP_semtimedop 4
-
-#define SVRSP  12              /* saved register space */
-#define PARMS  4+SVRSP /* space for 3 saved regs */
-#define SEMID  PARMS
-#define SOPS   SEMID+4
-#define NSOPS  SOPS+4
-#define TIMEOUT        NSOPS+4
-
-       .text
-ENTRY (semtimedop)
-
-       pushl   %ebp
-       cfi_adjust_cfa_offset (4)
-       pushl   %ebx
-       cfi_adjust_cfa_offset (4)
-       pushl   %edi
-       cfi_adjust_cfa_offset (4)
-
-       movl    $SYSOP_semtimedop, %ebx
-       cfi_rel_offset (ebx, 4)
-       movl    SEMID(%esp), %ecx
-       movl    NSOPS(%esp), %edx
-       movl    SOPS(%esp), %edi
-       cfi_rel_offset (edi, 0)
-       movl    TIMEOUT(%esp), %ebp
-       cfi_rel_offset (ebp, 8)
-       movl    $__NR_ipc, %eax
-
-       ENTER_KERNEL
-
-       /* Restore registers.  */
-       popl    %edi
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (edi)
-       popl    %ebx
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebx)
-       popl    %ebp
-       cfi_adjust_cfa_offset (-4)
-       cfi_restore (ebp)
-
-       /* If 0 > %eax > -4096 there was an error.  */
-       cmpl $-4096, %eax
-       ja SYSCALL_ERROR_LABEL
-
-       /* Successful; return the syscall's value.  */
-       ret
-
-#ifdef PIC
-       .align  4
-#endif
-PSEUDO_END (semtimedop)
This page took 0.102019 seconds and 5 git commands to generate.