[BZ,#19137] i386/epoll_pwait.S doesn't support cancellation

Message ID 20151015121922.GA22544@gmail.com
State Committed
Headers

Commit Message

H.J. Lu Oct. 15, 2015, 12:19 p.m. UTC
  Only i386 implements epoll_pwait in assembly code withot cancellation
support.  All other architectures implement epoll_pwait in epoll_pwait.c
with

int epoll_pwait (int epfd, struct epoll_event *events,
		 int maxevents, int timeout,
		 const sigset_t *set)
{
  return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
			 timeout, set, _NSIG / 8);
}

Although there is no test for epoll_pwait in glibc, since SYSCALL_CANCEL
works on i386 and epoll_pwait.c works for other architectures, it is
safe to assume that epoll_pwait.c with SYSCALL_CANCEL also works on
i386.

Tested on i686.  OK for master?


H.J.
---
	[BZ #19137]
	* sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-epoll_pwait.c):
	Add -fomit-frame-pointer.
	* sysdeps/unix/sysv/linux/i386/epoll_pwait.S: Remove file.
---
 sysdeps/unix/sysv/linux/i386/Makefile      |  1 +
 sysdeps/unix/sysv/linux/i386/epoll_pwait.S | 78 ------------------------------
 2 files changed, 1 insertion(+), 78 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/i386/epoll_pwait.S
  

Comments

Florian Weimer Oct. 15, 2015, 1:04 p.m. UTC | #1
On 10/15/2015 02:19 PM, H.J. Lu wrote:
> Only i386 implements epoll_pwait in assembly code withot cancellation
> support.  All other architectures implement epoll_pwait in epoll_pwait.c
> with
> 
> int epoll_pwait (int epfd, struct epoll_event *events,
> 		 int maxevents, int timeout,
> 		 const sigset_t *set)
> {
>   return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
> 			 timeout, set, _NSIG / 8);
> }
> 
> Although there is no test for epoll_pwait in glibc, since SYSCALL_CANCEL
> works on i386 and epoll_pwait.c works for other architectures, it is
> safe to assume that epoll_pwait.c with SYSCALL_CANCEL also works on
> i386.
> 
> Tested on i686.  OK for master?

Okay.

Thanks,
Florian
  

Patch

diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
index 49ccf3e..b484217 100644
--- a/sysdeps/unix/sysv/linux/i386/Makefile
+++ b/sysdeps/unix/sysv/linux/i386/Makefile
@@ -4,6 +4,7 @@  default-abi := 32
 ifeq ($(subdir),misc)
 sysdep_routines += ioperm iopl vm86
 # %ebp may be used to pass the 6th argument to syscall.
+CFLAGS-epoll_pwait.c += -fomit-frame-pointer
 CFLAGS-mmap.c += -fomit-frame-pointer
 CFLAGS-mmap64.c += -fomit-frame-pointer
 endif
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)