[PATCH 6/6] i386: Remove syscall assembly codes with 6 arguments

H.J. Lu hjl.tools@gmail.com
Wed Oct 14 12:54:00 GMT 2015


On Mon, Oct 12, 2015 at 4:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> This patch removes i386 assembly implementation for epoll_wait, mmap,
> mmap64, semtimeop now that i386 have 6 argument syscall support from
> C code and GCC 5 can inline syscalls with 6 argument.  We also compile
> epoll_pwait.c, 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/epoll_pwait.S: Remove file.
>         * sysdeps/unix/sysv/linux/i386/mmap.S: Likewise.
>         * sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise.
>         * sysdeps/unix/sysv/linux/i386/semtimedop.S: Likewise.

3 of 6 patches have been checked in.  Here is the updated patch.
OK for master?

Thanks.


-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-i386-Remove-syscall-assembly-codes-with-6-arguments.patch
Type: text/x-patch
Size: 15893 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20151014/e2a94b8c/attachment.bin>


More information about the Libc-alpha mailing list