diff mbox

i386: Assembly Implementation cleanup

Message ID 5596AD3B.1060903@linaro.org
State New
Headers show

Commit Message

Adhemerval Zanella Netto July 3, 2015, 3:41 p.m. UTC
This patch removes i386 assembly implementation for epoll_wait, mmap,
mmap64, semtimeop now that i386 have 6 argument syscall support from
C code.

The mmap implementation used is the wordsize-32 generic linux one.

Tested in i386.

---

	* 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.

--

Comments

Adhemerval Zanella Netto July 9, 2015, 6:58 p.m. UTC | #1
Ping.

On 03-07-2015 12:41, Adhemerval Zanella wrote:
> This patch removes i386 assembly implementation for epoll_wait, mmap,
> mmap64, semtimeop now that i386 have 6 argument syscall support from
> C code.
> 
> The mmap implementation used is the wordsize-32 generic linux one.
> 
> Tested in i386.
> 
> ---
> 
> 	* 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.
> 
> --
> 
> diff --git a/sysdeps/unix/sysv/linux/i386/epoll_pwait.S b/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
> deleted file mode 100644
> index 65cfb98..0000000
> --- a/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
> +++ /dev/null
> @@ -1,78 +0,0 @@
> -/* Copyright (C) 2007-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 _ERRNO_H
> -#include <bits/errno.h>
> -#define _SIGNAL_H
> -#include <bits/signum.h>
> -
> -
> -	.text
> -ENTRY (epoll_pwait)
> -
> -#ifdef __NR_epoll_pwait
> -
> -	/* 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)
> -	cfi_rel_offset (edi, 0)
> -	cfi_rel_offset (esi, 4)
> -	cfi_rel_offset (ebx, 8)
> -	cfi_rel_offset (ebp, 12)
> -
> -	movl 20(%esp), %ebx
> -	movl 24(%esp), %ecx
> -	movl 28(%esp), %edx
> -	movl 32(%esp), %esi
> -	movl 36(%esp), %edi
> -	movl $_NSIG/8, %ebp
> -	movl $__NR_epoll_pwait, %eax
> -
> -	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.  */
> -#else
> -	movl $-ENOSYS, %eax
> -	jmp SYSCALL_ERROR_LABEL
> -#endif
> -	ret
> -PSEUDO_END (epoll_pwait)
> diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
> deleted file mode 100644
> index daf807a..0000000
> --- a/sysdeps/unix/sysv/linux/i386/mmap.S
> +++ /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
> index 0000000..2cb4907
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/i386/mmap.c
> @@ -0,0 +1,18 @@
> +/* 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 <sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c>
> diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S
> deleted file mode 100644
> index 3cf6eb9..0000000
> --- a/sysdeps/unix/sysv/linux/i386/mmap64.S
> +++ /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
> index 80477b7..0000000
> --- a/sysdeps/unix/sysv/linux/i386/semtimedop.S
> +++ /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)
>
Adhemerval Zanella Netto Aug. 11, 2015, 6:49 p.m. UTC | #2
Ping.

On 09-07-2015 15:58, Adhemerval Zanella wrote:
> Ping.
> 
> On 03-07-2015 12:41, Adhemerval Zanella wrote:
>> This patch removes i386 assembly implementation for epoll_wait, mmap,
>> mmap64, semtimeop now that i386 have 6 argument syscall support from
>> C code.
>>
>> The mmap implementation used is the wordsize-32 generic linux one.
>>
>> Tested in i386.
>>
>> ---
>>
>> 	* 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.
>>
>> --
>>
>> diff --git a/sysdeps/unix/sysv/linux/i386/epoll_pwait.S b/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
>> deleted file mode 100644
>> index 65cfb98..0000000
>> --- a/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
>> +++ /dev/null
>> @@ -1,78 +0,0 @@
>> -/* Copyright (C) 2007-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 _ERRNO_H
>> -#include <bits/errno.h>
>> -#define _SIGNAL_H
>> -#include <bits/signum.h>
>> -
>> -
>> -	.text
>> -ENTRY (epoll_pwait)
>> -
>> -#ifdef __NR_epoll_pwait
>> -
>> -	/* 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)
>> -	cfi_rel_offset (edi, 0)
>> -	cfi_rel_offset (esi, 4)
>> -	cfi_rel_offset (ebx, 8)
>> -	cfi_rel_offset (ebp, 12)
>> -
>> -	movl 20(%esp), %ebx
>> -	movl 24(%esp), %ecx
>> -	movl 28(%esp), %edx
>> -	movl 32(%esp), %esi
>> -	movl 36(%esp), %edi
>> -	movl $_NSIG/8, %ebp
>> -	movl $__NR_epoll_pwait, %eax
>> -
>> -	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.  */
>> -#else
>> -	movl $-ENOSYS, %eax
>> -	jmp SYSCALL_ERROR_LABEL
>> -#endif
>> -	ret
>> -PSEUDO_END (epoll_pwait)
>> diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
>> deleted file mode 100644
>> index daf807a..0000000
>> --- a/sysdeps/unix/sysv/linux/i386/mmap.S
>> +++ /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
>> index 0000000..2cb4907
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/i386/mmap.c
>> @@ -0,0 +1,18 @@
>> +/* 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 <sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c>
>> diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S
>> deleted file mode 100644
>> index 3cf6eb9..0000000
>> --- a/sysdeps/unix/sysv/linux/i386/mmap64.S
>> +++ /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
>> index 80477b7..0000000
>> --- a/sysdeps/unix/sysv/linux/i386/semtimedop.S
>> +++ /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)
>>
H.J. Lu Aug. 12, 2015, 12:22 a.m. UTC | #3
On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> This patch removes i386 assembly implementation for epoll_wait, mmap,
> mmap64, semtimeop now that i386 have 6 argument syscall support from
> C code.
>
> The mmap implementation used is the wordsize-32 generic linux one.
>
> Tested in i386.
>
> ---
>
>         * 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.
>

What is the motivation?  6 argument syscalls aren't really inlined.
They put arguments on stack and call __libc_do_syscall.  It is
slower than assembly code.
Adhemerval Zanella Netto Aug. 12, 2015, 12:38 p.m. UTC | #4
On 11-08-2015 21:22, H.J. Lu wrote:
> On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> This patch removes i386 assembly implementation for epoll_wait, mmap,
>> mmap64, semtimeop now that i386 have 6 argument syscall support from
>> C code.
>>
>> The mmap implementation used is the wordsize-32 generic linux one.
>>
>> Tested in i386.
>>
>> ---
>>
>>         * 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.
>>
> 
> What is the motivation?  6 argument syscalls aren't really inlined.
> They put arguments on stack and call __libc_do_syscall.  It is
> slower than assembly code.
> 

Same for ARM: code maintainability on functions that are not really
performance-critical.  This avoids issues like the x86 pthread_cond_*
assembly implementation (which are now aimed to be removed), that
required specific fixes just for x86.
H.J. Lu Aug. 12, 2015, 12:44 p.m. UTC | #5
On Wed, Aug 12, 2015 at 5:38 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
> On 11-08-2015 21:22, H.J. Lu wrote:
>> On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
>> <adhemerval.zanella@linaro.org> wrote:
>>> This patch removes i386 assembly implementation for epoll_wait, mmap,
>>> mmap64, semtimeop now that i386 have 6 argument syscall support from
>>> C code.
>>>
>>> The mmap implementation used is the wordsize-32 generic linux one.
>>>
>>> Tested in i386.
>>>
>>> ---
>>>
>>>         * 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.
>>>
>>
>> What is the motivation?  6 argument syscalls aren't really inlined.
>> They put arguments on stack and call __libc_do_syscall.  It is
>> slower than assembly code.
>>
>
> Same for ARM: code maintainability on functions that are not really
> performance-critical.  This avoids issues like the x86 pthread_cond_*
> assembly implementation (which are now aimed to be removed), that
> required specific fixes just for x86.

Is there a way to truly inline syscall with 6 arguments, not by calling
__libc_do_syscall?
Torvald Riegel Aug. 12, 2015, 1:07 p.m. UTC | #6
On Tue, 2015-08-11 at 17:22 -0700, H.J. Lu wrote:
> On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
> > This patch removes i386 assembly implementation for epoll_wait, mmap,
> > mmap64, semtimeop now that i386 have 6 argument syscall support from
> > C code.
> >
> > The mmap implementation used is the wordsize-32 generic linux one.
> >
> > Tested in i386.
> >
> > ---
> >
> >         * 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.
> >
> 
> What is the motivation?  6 argument syscalls aren't really inlined.
> They put arguments on stack and call __libc_do_syscall.  It is
> slower than assembly code.

Does this matter for any of those functions?  Are they typically called
on fast paths that would notice that?  If not, I think ease of
maintenance is more worthwile.
Adhemerval Zanella Netto Aug. 12, 2015, 1:58 p.m. UTC | #7
On 12-08-2015 09:44, H.J. Lu wrote:
> On Wed, Aug 12, 2015 at 5:38 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>> On 11-08-2015 21:22, H.J. Lu wrote:
>>> On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
>>> <adhemerval.zanella@linaro.org> wrote:
>>>> This patch removes i386 assembly implementation for epoll_wait, mmap,
>>>> mmap64, semtimeop now that i386 have 6 argument syscall support from
>>>> C code.
>>>>
>>>> The mmap implementation used is the wordsize-32 generic linux one.
>>>>
>>>> Tested in i386.
>>>>
>>>> ---
>>>>
>>>>         * 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.
>>>>
>>>
>>> What is the motivation?  6 argument syscalls aren't really inlined.
>>> They put arguments on stack and call __libc_do_syscall.  It is
>>> slower than assembly code.
>>>
>>
>> Same for ARM: code maintainability on functions that are not really
>> performance-critical.  This avoids issues like the x86 pthread_cond_*
>> assembly implementation (which are now aimed to be removed), that
>> required specific fixes just for x86.
> 
> Is there a way to truly inline syscall with 6 arguments, not by calling
> __libc_do_syscall?
> 

I checked around some other projects that implements i386 syscall and
neither seems to have a workaround for this.  I also recall that Joseph
has said GCC does not really support to not cobbler the required register,
so that's why he has implemented through a helper function.  Anyway, as
Tovarld has asked, I think these are not really heavy hitter (and kernel
implementation is much more complex than the time to save/restore the
register in stack).
Ondřej Bílka Aug. 12, 2015, 2:19 p.m. UTC | #8
On Wed, Aug 12, 2015 at 10:58:16AM -0300, Adhemerval Zanella wrote:
> 
> 
> On 12-08-2015 09:44, H.J. Lu wrote:
> > On Wed, Aug 12, 2015 at 5:38 AM, Adhemerval Zanella
> > <adhemerval.zanella@linaro.org> wrote:
> >>
> >>
> >> On 11-08-2015 21:22, H.J. Lu wrote:
> >>> On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
> >>> <adhemerval.zanella@linaro.org> wrote:
> >>>> This patch removes i386 assembly implementation for epoll_wait, mmap,
> >>>> mmap64, semtimeop now that i386 have 6 argument syscall support from
> >>>> C code.
> >>>>
> >>>> The mmap implementation used is the wordsize-32 generic linux one.
> >>>>
> >>>> Tested in i386.
> >>>>
> >>>> ---
> >>>>
> >>>>         * 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.
> >>>>
> >>>
> >>> What is the motivation?  6 argument syscalls aren't really inlined.
> >>> They put arguments on stack and call __libc_do_syscall.  It is
> >>> slower than assembly code.
> >>>
> >>
> >> Same for ARM: code maintainability on functions that are not really
> >> performance-critical.  This avoids issues like the x86 pthread_cond_*
> >> assembly implementation (which are now aimed to be removed), that
> >> required specific fixes just for x86.
> > 
> > Is there a way to truly inline syscall with 6 arguments, not by calling
> > __libc_do_syscall?
> > 
> 
> I checked around some other projects that implements i386 syscall and
> neither seems to have a workaround for this.  I also recall that Joseph
> has said GCC does not really support to not cobbler the required register,
> so that's why he has implemented through a helper function.  Anyway, as
> Tovarld has asked, I think these are not really heavy hitter (and kernel
> implementation is much more complex than the time to save/restore the
> register in stack).

Correct, only questionable is semtimedop that could be made fast by
using vdso to avoid syscall. 

For mmap* its 2000+ cycles if we map single page and usually
more so it doesnt't matter. Epoll_pwait will likely block so difference
of assembly is again very small.
H.J. Lu Aug. 12, 2015, 2:47 p.m. UTC | #9
On Wed, Aug 12, 2015 at 6:58 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
> On 12-08-2015 09:44, H.J. Lu wrote:
>> On Wed, Aug 12, 2015 at 5:38 AM, Adhemerval Zanella
>> <adhemerval.zanella@linaro.org> wrote:
>>>
>>>
>>> On 11-08-2015 21:22, H.J. Lu wrote:
>>>> On Fri, Jul 3, 2015 at 8:41 AM, Adhemerval Zanella
>>>> <adhemerval.zanella@linaro.org> wrote:
>>>>> This patch removes i386 assembly implementation for epoll_wait, mmap,
>>>>> mmap64, semtimeop now that i386 have 6 argument syscall support from
>>>>> C code.
>>>>>
>>>>> The mmap implementation used is the wordsize-32 generic linux one.
>>>>>
>>>>> Tested in i386.
>>>>>
>>>>> ---
>>>>>
>>>>>         * 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.
>>>>>
>>>>
>>>> What is the motivation?  6 argument syscalls aren't really inlined.
>>>> They put arguments on stack and call __libc_do_syscall.  It is
>>>> slower than assembly code.
>>>>
>>>
>>> Same for ARM: code maintainability on functions that are not really
>>> performance-critical.  This avoids issues like the x86 pthread_cond_*
>>> assembly implementation (which are now aimed to be removed), that
>>> required specific fixes just for x86.
>>
>> Is there a way to truly inline syscall with 6 arguments, not by calling
>> __libc_do_syscall?
>>
>
> I checked around some other projects that implements i386 syscall and
> neither seems to have a workaround for this.  I also recall that Joseph
> has said GCC does not really support to not cobbler the required register,
> so that's why he has implemented through a helper function.  Anyway, as
> Tovarld has asked, I think these are not really heavy hitter (and kernel
> implementation is much more complex than the time to save/restore the
> register in stack).

Let me take a look on this.
Florian Weimer Aug. 12, 2015, 3:01 p.m. UTC | #10
On 08/12/2015 02:44 PM, H.J. Lu wrote:

> Is there a way to truly inline syscall with 6 arguments, not by calling
> __libc_do_syscall?

Yes, newer GCC versions are able to spill %ebx just by writing
appropriate constraints.

Test case:

int
doit(int v)
{
  int r;
  __asm__ ("MAGIC"
           : "=r" (r)
           : "b" (v));
  return r;
}

Compile with “-m32 -fpic -O2”.

Older GCC (4.8.3 in this example):

reg.c: In function ‘doit’:
reg.c:5:3: error: inconsistent operand constraints in an ‘asm’
   __asm__ ("MAGIC"
   ^

Newer GCC:

doit:
.LFB0:
	.cfi_startproc
	pushl	%ebx
	.cfi_def_cfa_offset 8
	.cfi_offset 3, -8
	movl	8(%esp), %ebx
#APP
# 5 "/tmp/t.c" 1
	MAGIC
# 0 "" 2
#NO_APP
	popl	%ebx
	.cfi_restore 3
	.cfi_def_cfa_offset 4
	ret
	.cfi_endproc
H.J. Lu Aug. 12, 2015, 3:06 p.m. UTC | #11
On Wed, Aug 12, 2015 at 8:01 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 08/12/2015 02:44 PM, H.J. Lu wrote:
>
>> Is there a way to truly inline syscall with 6 arguments, not by calling
>> __libc_do_syscall?
>
> Yes, newer GCC versions are able to spill %ebx just by writing
> appropriate constraints.
>
> Test case:
>
> int
> doit(int v)
> {
>   int r;
>   __asm__ ("MAGIC"
>            : "=r" (r)
>            : "b" (v));
>   return r;
> }
>
> Compile with “-m32 -fpic -O2”.
>

I am working on it now.
Joseph Myers Aug. 12, 2015, 5:04 p.m. UTC | #12
On Wed, 12 Aug 2015, Florian Weimer wrote:

> On 08/12/2015 02:44 PM, H.J. Lu wrote:
> 
> > Is there a way to truly inline syscall with 6 arguments, not by calling
> > __libc_do_syscall?
> 
> Yes, newer GCC versions are able to spill %ebx just by writing
> appropriate constraints.

I don't think that test is really relevant.  What's relevant is an asm 
that *uses every register other than %esp as an input*, as part of a 
larger function that does more than just have the asm.  (Or uses every 
register either as an input or as a clobber with some arguments coming 
from the stack, but that could be less efficient and this discussion seems 
to be about optimal code sequences.)
diff mbox

Patch

diff --git a/sysdeps/unix/sysv/linux/i386/epoll_pwait.S b/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
deleted file mode 100644
index 65cfb98..0000000
--- a/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
+++ /dev/null
@@ -1,78 +0,0 @@ 
-/* Copyright (C) 2007-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 _ERRNO_H
-#include <bits/errno.h>
-#define _SIGNAL_H
-#include <bits/signum.h>
-
-
-	.text
-ENTRY (epoll_pwait)
-
-#ifdef __NR_epoll_pwait
-
-	/* 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)
-	cfi_rel_offset (edi, 0)
-	cfi_rel_offset (esi, 4)
-	cfi_rel_offset (ebx, 8)
-	cfi_rel_offset (ebp, 12)
-
-	movl 20(%esp), %ebx
-	movl 24(%esp), %ecx
-	movl 28(%esp), %edx
-	movl 32(%esp), %esi
-	movl 36(%esp), %edi
-	movl $_NSIG/8, %ebp
-	movl $__NR_epoll_pwait, %eax
-
-	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.  */
-#else
-	movl $-ENOSYS, %eax
-	jmp SYSCALL_ERROR_LABEL
-#endif
-	ret
-PSEUDO_END (epoll_pwait)
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
deleted file mode 100644
index daf807a..0000000
--- a/sysdeps/unix/sysv/linux/i386/mmap.S
+++ /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
index 0000000..2cb4907
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/mmap.c
@@ -0,0 +1,18 @@ 
+/* 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 <sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c>
diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S
deleted file mode 100644
index 3cf6eb9..0000000
--- a/sysdeps/unix/sysv/linux/i386/mmap64.S
+++ /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
index 80477b7..0000000
--- a/sysdeps/unix/sysv/linux/i386/semtimedop.S
+++ /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)