diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-12-15 01:00:22 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-12-15 01:00:22 +0000 |
commit | 86b2dc4072725edb69ec4b872f9fcd17a4554b74 (patch) | |
tree | fcc7abb285572b9e539af7b4c324806a0364daf2 /nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | |
parent | 9d263d72848fb561e104a21da3ffccf791078f2a (diff) | |
download | glibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.tar glibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.tar.gz glibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.tar.bz2 glibc-86b2dc4072725edb69ec4b872f9fcd17a4554b74.zip |
Update.
* sysdeps/generic/sysdep-cancel.h: New file.
* sysdeps/unix/make-syscalls.sh: Handle C at start of args as
cancelable syscall.
* sysdeps/unix/inet/syscalls.list (accept, connect, recv, recvfrom,
recvmsg, send, sendmsg, sendto): Make cancelable.
* sysdeps/unix/mman/syscalls.list (msync): Likewise.
* sysdeps/unix/sysv/linux/alpha/syscalls.list (llseek, pread,
pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
sendto, osf_select): Likewise.
* sysdeps/unix/sysv/linux/hppa/syscalls.list (accept, connect, recv,
recvfrom, recvmsg, send, sendmsg, sendto): Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list (llseek, pread,
pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
sendto): Likewise.
* sysdeps/unix/sysv/linux/mips/syscalls.list (accept, connect, recv,
recvfrom, recvmsg, send, sendmsg, sendto): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (llseek, pread,
pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
sendto): Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list (llseek, pread,
pwrite, accept, connect, recv, recvfrom, recvmsg, send, sendmsg,
sendto, select): Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list (llseek, pread,
pwrite, accept, connect, recvfrom, recvmsg, sendmsg, sendto):
Likewise.
* sysdeps/unix/sysv/linux/syscalls.list (creat, nanosleep, pause,
select, fcntl): Likewise.
* sysdeps/unix/sysv/syscalls.list (pause, poll): Likewise.
* sysdeps/unix/syscalls.list (close, fcntl, fsync, lseek, open,
read, readv, select, sigsuspend, write, writev): Likewise.
2002-12-14 Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h new file mode 100644 index 0000000000..ed9f9420e7 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h @@ -0,0 +1,70 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <tls.h> + +#if !defined NOT_IN_libc || defined IS_IN_libpthread + +#undef PSEUDO +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + cmpl $0, %gs:MULTIPLE_THREADS_OFFSET; \ + jne L(pseudo_cancel); \ + DO_CALL (syscall_name, args); \ + cmpl $-4095, %eax; \ + jae SYSCALL_ERROR_LABEL; \ + ret; \ + L(pseudo_cancel): \ + call __libc_enable_asynccancel; \ + SAVE_OLDTYPE_##args \ + PUSHARGS_##args \ + DOCARGS_##args \ + movl $SYS_ify (syscall_name), %eax; \ + int $0x80 \ + POPARGS_##args; \ + POPCARGS_##args \ + cmpl $-4095, %eax; \ + jae SYSCALL_ERROR_LABEL; \ + L(pseudo_end): + +#define SAVE_OLDTYPE_0 movl %eax, %ecx; +#define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0 +#define SAVE_OLDTYPE_2 pushl %eax; +#define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2 +#define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2 +#define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2 + +#define DOCARGS_0 DOARGS_0 +#define DOCARGS_1 DOARGS_1 +#define DOCARGS_2 _DOARGS_2 (12) +#define DOCARGS_3 _DOARGS_3 (20) +#define DOCARGS_4 _DOARGS_4 (28) +#define DOCARGS_5 _DOARGS_5 (36) + +#define DISABLE call __libc_disable_asynccancel +#define POPCARGS_0 pushl %eax; movl %ecx, %eax; DISABLE; popl %eax; +#define POPCARGS_1 POPCARGS_0 +#define POPCARGS_2 xchgl (%esp), %eax; DISABLE; popl %eax; +#define POPCARGS_3 POPCARGS_2 +#define POPCARGS_4 POPCARGS_2 +#define POPCARGS_5 POPCARGS_2 + +#endif |