[PATCH 3/6] i386: Remove syscall assembly codes with 6 arguments
H.J. Lu
hjl.tools@gmail.com
Fri Aug 21 14:55:00 GMT 2015
On Fri, Aug 21, 2015 at 4:57 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, Aug 14, 2015 at 10:34 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Fri, Aug 14, 2015 at 5:17 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> OK for master?
>>>
>>> H.J.
>>> ---
>>> 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: sar $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> 78: R_386_PC32 __syscall_error
>>>
>>> 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 & ((1 << MMAP_PAGE_SHIFT) - 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.
>>
>> Here is the patch for updated INLINE_SYSCALL_RETURN and
>> INLINE_SYSCALL_ERROR_RETURN. OK for master?
>
> I will check it in next Monday if there are no objections.
>
This is the patch I will check in next Monday.
--
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-i386-Remove-syscall-assembly-codes-with-6-arguments.patch
Type: text/x-patch
Size: 15914 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20150821/42c80ae6/attachment.bin>
More information about the Libc-alpha
mailing list