[14/14] Remove cancellation support for syscall generation
Commit Message
This patch removes the cancellation mark from the auto-generation syscall
script. Now all the cancellable syscalls are done throught C code using
the SYSCALL_CANCEL macro. It simplifies the assembly required to each
architecture port, since the SYSCALL_CANCEL uses the already defined
INLINE_SYSCALL macros, and allows a more straigh fix on cancellation
machanism (since no more specific assembly fixes will be required).
Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
aarch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.
* sysdeps/unix/make-syscalls.sh: Remove cancellable tagging for
syscall definitions.
* sysdeps/unix/syscall-template.S (SYSCALL_CANCELLABLE): Remove
definition.
* sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (__local_enable_asynccancel): Likewise.
[IS_IN (libpthread)] (__local_disable_asynccancel): Likewise.
[IS_IN (libc)] (__local_enable_asynccancel): Likewise.
[IS_IN (libc)] (__local_enable_asynccancel): Likewise.
[IS_IN (librt)] (__local_disable_asynccancel): Likewise.
[IS_IN (librt)] (__local_disable_asynccancel): Likewise.
(CENABLE): Likewise.
(CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Remove
defintion.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h (PSEUDO):
Remove definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
(SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Remove file.
* sysdeps/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: New file.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Remove file.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: New file.
* sysdeps/unix/sysv/linux/tile/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Remove
definition.
(PSEUDO_END): Likewise.
[IS_IN (libpthread)] (CENABLE): Likewise.
[IS_IN (libpthread)] (CDISABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (libc)] (CENABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[IS_IN (librt)] (CDISABLE): Likewise.
[__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
---
ChangeLog | 173 ++++++++++++++
sysdeps/unix/make-syscalls.sh | 4 -
sysdeps/unix/syscall-template.S | 7 +-
sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h | 87 +------
sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h | 131 +----------
sysdeps/unix/sysv/linux/arm/sysdep-cancel.h | 197 +---------------
sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h | 225 +------------------
sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 119 +---------
sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h | 194 +---------------
sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h | 108 +--------
sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h | 116 +---------
.../unix/sysv/linux/mips/mips64/sysdep-cancel.h | 249 ---------------------
sysdeps/unix/sysv/linux/mips/sysdep-cancel.h | 159 +------------
sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h | 110 +--------
.../sysv/linux/powerpc/powerpc32/sysdep-cancel.h | 118 ----------
.../sysv/linux/powerpc/powerpc64/sysdep-cancel.h | 147 ------------
sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h | 38 ++++
.../unix/sysv/linux/s390/s390-32/sysdep-cancel.h | 105 +--------
.../unix/sysv/linux/s390/s390-64/sysdep-cancel.h | 109 +--------
sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 136 +----------
.../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h | 111 ---------
.../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h | 109 ---------
sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 38 ++++
sysdeps/unix/sysv/linux/tile/sysdep-cancel.h | 123 +---------
sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h | 62 +----
25 files changed, 305 insertions(+), 2670 deletions(-)
delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
create mode 100644 sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
create mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
Comments
Now with both 78ca091cdd2 and b70b6026a05 pushed upstream no linux port
actually uess the sysdep-cancel.h assembly macro for syscall generation,
so it should be safe to remove all their definition and just define
cancellable syscalls using SYSCALL_CANCEL C macro.
I have tested this patch with build-many-glibc.py for the all affected
ports and it shows not build failures. I take this is an extensive patch,
but it a cleanup one that aims to code simplicity.
I plan to commit this shortly if no one opposes it.
On 03/08/2017 10:11, Adhemerval Zanella wrote:
> This patch removes the cancellation mark from the auto-generation syscall
> script. Now all the cancellable syscalls are done throught C code using
> the SYSCALL_CANCEL macro. It simplifies the assembly required to each
> architecture port, since the SYSCALL_CANCEL uses the already defined
> INLINE_SYSCALL macros, and allows a more straigh fix on cancellation
> machanism (since no more specific assembly fixes will be required).
>
> Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
> aarch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.
>
> * sysdeps/unix/make-syscalls.sh: Remove cancellable tagging for
> syscall definitions.
> * sysdeps/unix/syscall-template.S (SYSCALL_CANCELLABLE): Remove
> definition.
> * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (__local_enable_asynccancel): Likewise.
> [IS_IN (libpthread)] (__local_disable_asynccancel): Likewise.
> [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
> [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
> [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
> [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
> (CENABLE): Likewise.
> (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Remove
> defintion.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h (PSEUDO):
> Remove definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Remove file.
> * sysdeps/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: New file.
> * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Remove file.
> * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: New file.
> * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Remove
> definition.
> (PSEUDO_END): Likewise.
> [IS_IN (libpthread)] (CENABLE): Likewise.
> [IS_IN (libpthread)] (CDISABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (libc)] (CENABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [IS_IN (librt)] (CDISABLE): Likewise.
> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> ---
> ChangeLog | 173 ++++++++++++++
> sysdeps/unix/make-syscalls.sh | 4 -
> sysdeps/unix/syscall-template.S | 7 +-
> sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h | 87 +------
> sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h | 131 +----------
> sysdeps/unix/sysv/linux/arm/sysdep-cancel.h | 197 +---------------
> sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h | 225 +------------------
> sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 119 +---------
> sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h | 194 +---------------
> sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h | 108 +--------
> sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h | 116 +---------
> .../unix/sysv/linux/mips/mips64/sysdep-cancel.h | 249 ---------------------
> sysdeps/unix/sysv/linux/mips/sysdep-cancel.h | 159 +------------
> sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h | 110 +--------
> .../sysv/linux/powerpc/powerpc32/sysdep-cancel.h | 118 ----------
> .../sysv/linux/powerpc/powerpc64/sysdep-cancel.h | 147 ------------
> sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h | 38 ++++
> .../unix/sysv/linux/s390/s390-32/sysdep-cancel.h | 105 +--------
> .../unix/sysv/linux/s390/s390-64/sysdep-cancel.h | 109 +--------
> sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 136 +----------
> .../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h | 111 ---------
> .../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h | 109 ---------
> sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 38 ++++
> sysdeps/unix/sysv/linux/tile/sysdep-cancel.h | 123 +---------
> sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h | 62 +----
> 25 files changed, 305 insertions(+), 2670 deletions(-)
> delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
> create mode 100644 sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
> create mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
>
> diff --git a/ChangeLog b/ChangeLog
> index d0a78a1..a84bd55 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,178 @@
> 2017-08-02 Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> + * sysdeps/unix/make-syscalls.sh: Remove cancellable tagging for
> + syscall definitions.
> + * sysdeps/unix/syscall-template.S (SYSCALL_CANCELLABLE): Remove
> + definition.
> + * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (__local_enable_asynccancel): Likewise.
> + [IS_IN (libpthread)] (__local_disable_asynccancel): Likewise.
> + [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
> + [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
> + [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
> + [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
> + (CENABLE): Likewise.
> + (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Remove
> + defintion.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h (PSEUDO):
> + Remove definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Remove file.
> + * sysdeps/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
> + * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: New file.
> + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Remove file.
> + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
> + * sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: New file.
> + * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> + * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Remove
> + definition.
> + (PSEUDO_END): Likewise.
> + [IS_IN (libpthread)] (CENABLE): Likewise.
> + [IS_IN (libpthread)] (CDISABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (libc)] (CENABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [IS_IN (librt)] (CDISABLE): Likewise.
> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
> +
> * sysdeps/unix/sysv/linux/x86_64/syscalls.list (pread64): Remove.
> (preadv64): Likewise.
> (pwrite64(: Likewise.
> diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
> index 123553c..042cfac 100644
> --- a/sysdeps/unix/make-syscalls.sh
> +++ b/sysdeps/unix/make-syscalls.sh
> @@ -12,7 +12,6 @@
> #
> # Syscall Signature Prefixes:
> #
> -# C: cancellable (i.e., this syscall is a cancellation point)
> # E: errno and return value are not set by the call
> # V: errno is not set, but errno or zero (success) is returned from the call
> #
> @@ -171,11 +170,9 @@ while read file srcfile caller syscall args strong weak; do
> ;;
> esac
>
> - cancellable=0
> noerrno=0
> errval=0
> case $args in
> - C*) cancellable=1; args=`echo $args | sed 's/C:\?//'`;;
> E*) noerrno=1; args=`echo $args | sed 's/E:\?//'`;;
> V*) errval=1; args=`echo $args | sed 's/V:\?//'`;;
> esac
> @@ -258,7 +255,6 @@ while read file srcfile caller syscall args strong weak; do
> (echo '#define SYSCALL_NAME $syscall'; \\
> echo '#define SYSCALL_NARGS $nargs'; \\
> echo '#define SYSCALL_SYMBOL $strong'; \\
> - echo '#define SYSCALL_CANCELLABLE $cancellable'; \\
> echo '#define SYSCALL_NOERRNO $noerrno'; \\
> echo '#define SYSCALL_ERRVAL $errval'; \\
> echo '#include <syscall-template.S>'; \\"
> diff --git a/sysdeps/unix/syscall-template.S b/sysdeps/unix/syscall-template.S
> index 4993ff5..d4584a9 100644
> --- a/sysdeps/unix/syscall-template.S
> +++ b/sysdeps/unix/syscall-template.S
> @@ -27,7 +27,6 @@
> SYSCALL_NAME syscall name
> SYSCALL_NARGS number of arguments this call takes
> SYSCALL_SYMBOL primary symbol name
> - SYSCALL_CANCELLABLE 1 if the call is a cancelation point
> SYSCALL_NOERRNO 1 to define a no-errno version (see below)
> SYSCALL_ERRVAL 1 to define an error-value version (see below)
>
> @@ -41,11 +40,7 @@
> instructions long and the untrained eye might not distinguish them from
> some compiled code that inexplicably lacks source line information. */
>
> -#if SYSCALL_CANCELLABLE
> -# include <sysdep-cancel.h>
> -#else
> -# include <sysdep.h>
> -#endif
> +#include <sysdep.h>
>
> /* This indirection is needed so that SYMBOL gets macro-expanded. */
> #define syscall_hidden_def(SYMBOL) hidden_def (SYMBOL)
> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
> index 4be2259..d39b6a2 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
> @@ -24,102 +24,23 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .section ".text"; \
> -ENTRY (__##syscall_name##_nocancel); \
> -.Lpseudo_nocancel: \
> - DO_CALL (syscall_name, args); \
> -.Lpseudo_finish: \
> - cmn x0, 4095; \
> - b.cs .Lsyscall_error; \
> - .subsection 2; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> -ENTRY (name); \
> - SINGLE_THREAD_P(16); \
> - cbz w16, .Lpseudo_nocancel; \
> - /* Setup common stack frame no matter the number of args. \
> - Also save the first arg, since it's basically free. */ \
> - stp x30, x0, [sp, -64]!; \
> - cfi_adjust_cfa_offset (64); \
> - cfi_rel_offset (x30, 0); \
> - DOCARGS_##args; /* save syscall args around CENABLE. */ \
> - CENABLE; \
> - mov x16, x0; /* save mask around syscall. */ \
> - UNDOCARGS_##args; /* restore syscall args. */ \
> - DO_CALL (syscall_name, args); \
> - str x0, [sp, 8]; /* save result around CDISABLE. */ \
> - mov x0, x16; /* restore mask for CDISABLE. */ \
> - CDISABLE; \
> - /* Break down the stack frame, restoring result at once. */ \
> - ldp x30, x0, [sp], 64; \
> - cfi_adjust_cfa_offset (-64); \
> - cfi_restore (x30); \
> - b .Lpseudo_finish; \
> - cfi_endproc; \
> - .size name, .-name; \
> - .previous
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(name) \
> - SYSCALL_ERROR_HANDLER; \
> - cfi_endproc
> -
> -# define DOCARGS_0
> -# define DOCARGS_1
> -# define DOCARGS_2 str x1, [sp, 16]
> -# define DOCARGS_3 stp x1, x2, [sp, 16]
> -# define DOCARGS_4 DOCARGS_3; str x3, [sp, 32]
> -# define DOCARGS_5 DOCARGS_3; stp x3, x4, [sp, 32]
> -# define DOCARGS_6 DOCARGS_5; str x5, [sp, 48]
> -
> -# define UNDOCARGS_0
> -# define UNDOCARGS_1 ldr x0, [sp, 8]
> -# define UNDOCARGS_2 ldp x0, x1, [sp, 8]
> -# define UNDOCARGS_3 UNDOCARGS_1; ldp x1, x2, [sp, 16]
> -# define UNDOCARGS_4 UNDOCARGS_2; ldp x2, x3, [sp, 24]
> -# define UNDOCARGS_5 UNDOCARGS_3; ldp x3, x4, [sp, 32]
> -# define UNDOCARGS_6 UNDOCARGS_4; ldp x4, x5, [sp, 40]
> -
> # if IS_IN (libpthread)
> -# define CENABLE bl __pthread_enable_asynccancel
> -# define CDISABLE bl __pthread_disable_asynccancel
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> -# define CENABLE bl __libc_enable_asynccancel
> -# define CDISABLE bl __libc_disable_asynccancel
> # define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# define CENABLE bl __librt_enable_asynccancel
> -# define CDISABLE bl __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> # endif
>
> # if IS_IN (libpthread) || IS_IN (libc)
> -# ifndef __ASSEMBLER__
> extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(R) \
> - adrp x##R, __local_multiple_threads; \
> - ldr w##R, [x##R, :lo12:__local_multiple_threads]
> -# endif
> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> # else
> /* There is no __local_multiple_threads for librt, so use the TCB. */
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(R) \
> - mrs x##R, tpidr_el0; \
> - sub x##R, x##R, PTHREAD_SIZEOF; \
> - ldr w##R, [x##R, PTHREAD_MULTIPLE_THREADS_OFFSET]
> -# endif
> # endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> /* For rtld, et cetera. */
> # define SINGLE_THREAD_P 1
> @@ -127,8 +48,6 @@ extern int __local_multiple_threads attribute_hidden;
>
> #endif
>
> -#ifndef __ASSEMBLER__
> # define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h b/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
> index 66d6962..366cf31 100644
> --- a/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
> @@ -17,147 +17,24 @@
>
> #include <sysdep.h>
> #include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> +#include <nptl/pthreadP.h>
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -/* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END
> - besides "ret". */
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .globl __##syscall_name##_nocancel; \
> - .type __##syscall_name##_nocancel, @function; \
> - .usepv __##syscall_name##_nocancel, std; \
> - .align 4; \
> - cfi_startproc; \
> -__LABEL(__##syscall_name##_nocancel) \
> - ldgp gp, 0(pv); \
> - PSEUDO_PROF; \
> -__LABEL($pseudo_nocancel) \
> - PSEUDO_PREPARE_ARGS; \
> - lda v0, SYS_ify(syscall_name); \
> - call_pal PAL_callsys; \
> - bne a3, SYSCALL_ERROR_LABEL; \
> -__LABEL($pseudo_ret) \
> - .subsection 2; \
> - .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
> - .globl name; \
> - .type name, @function; \
> - .usepv name, std; \
> - .align 4; \
> - cfi_startproc; \
> -__LABEL(name) \
> - ldgp gp, 0(pv); \
> - PSEUDO_PROF; \
> - SINGLE_THREAD_P(t0); \
> - beq t0, $pseudo_nocancel; \
> - subq sp, 64, sp; \
> - cfi_def_cfa_offset(64); \
> - stq ra, 0(sp); \
> - cfi_offset(ra, -64); \
> - SAVE_ARGS_##args; \
> - CENABLE; \
> - LOAD_ARGS_##args; \
> - /* Save the CENABLE return value in RA. That register \
> - is preserved across syscall and the real return \
> - address is saved on the stack. */ \
> - mov v0, ra; \
> - lda v0, SYS_ify(syscall_name); \
> - call_pal PAL_callsys; \
> - stq v0, 8(sp); \
> - mov ra, a0; \
> - bne a3, $multi_error; \
> - CDISABLE; \
> - ldq ra, 0(sp); \
> - ldq v0, 8(sp); \
> - addq sp, 64, sp; \
> - cfi_remember_state; \
> - cfi_restore(ra); \
> - cfi_def_cfa_offset(0); \
> - ret; \
> - cfi_restore_state; \
> -__LABEL($multi_error) \
> - CDISABLE; \
> - ldq ra, 0(sp); \
> - ldq v0, 8(sp); \
> - addq sp, 64, sp; \
> - cfi_restore(ra); \
> - cfi_def_cfa_offset(0); \
> - SYSCALL_ERROR_FALLTHRU; \
> - SYSCALL_ERROR_HANDLER; \
> - cfi_endproc; \
> - .previous
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(sym) \
> - cfi_endproc; \
> - .subsection 2; \
> - .size sym, .-sym
> -
> -# define SAVE_ARGS_0 /* Nothing. */
> -# define SAVE_ARGS_1 SAVE_ARGS_0; stq a0, 8(sp)
> -# define SAVE_ARGS_2 SAVE_ARGS_1; stq a1, 16(sp)
> -# define SAVE_ARGS_3 SAVE_ARGS_2; stq a2, 24(sp)
> -# define SAVE_ARGS_4 SAVE_ARGS_3; stq a3, 32(sp)
> -# define SAVE_ARGS_5 SAVE_ARGS_4; stq a4, 40(sp)
> -# define SAVE_ARGS_6 SAVE_ARGS_5; stq a5, 48(sp)
> -
> -# define LOAD_ARGS_0 /* Nothing. */
> -# define LOAD_ARGS_1 LOAD_ARGS_0; ldq a0, 8(sp)
> -# define LOAD_ARGS_2 LOAD_ARGS_1; ldq a1, 16(sp)
> -# define LOAD_ARGS_3 LOAD_ARGS_2; ldq a2, 24(sp)
> -# define LOAD_ARGS_4 LOAD_ARGS_3; ldq a3, 32(sp)
> -# define LOAD_ARGS_5 LOAD_ARGS_4; ldq a4, 40(sp)
> -# define LOAD_ARGS_6 LOAD_ARGS_5; ldq a5, 48(sp)
> -
> # if IS_IN (libpthread)
> -# define __local_enable_asynccancel __pthread_enable_asynccancel
> -# define __local_disable_asynccancel __pthread_disable_asynccancel
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> -# define __local_enable_asynccancel __libc_enable_asynccancel
> -# define __local_disable_asynccancel __libc_disable_asynccancel
> # define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# define __local_enable_asynccancel __librt_enable_asynccancel
> -# define __local_disable_asynccancel __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -
> -# ifdef PIC
> -# define CENABLE bsr ra, __local_enable_asynccancel !samegp
> -# define CDISABLE bsr ra, __local_disable_asynccancel !samegp
> -# else
> -# define CENABLE jsr ra, __local_enable_asynccancel; ldgp ra, 0(gp)
> -# define CDISABLE jsr ra, __local_disable_asynccancel; ldgp ra, 0(gp)
> # endif
>
> # if IS_IN (libpthread) || IS_IN (libc)
> -# ifndef __ASSEMBLER__
> extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (__local_multiple_threads == 0, 1)
> -# elif defined(PIC)
> -# define SINGLE_THREAD_P(reg) ldl reg, __local_multiple_threads(gp) !gprel
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - ldah reg, __local_multiple_threads(gp) !gprelhigh; \
> - ldl reg, __local_multiple_threads(reg) !gprellow
> -# endif
> # else
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - call_pal PAL_rduniq; \
> - ldl reg, MULTIPLE_THREADS_OFFSET($0)
> -# endif
> # endif
>
> #else
> @@ -167,8 +44,6 @@ extern int __local_multiple_threads attribute_hidden;
>
> #endif
>
> -#ifndef __ASSEMBLER__
> # define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h b/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
> index de12acf..738e749 100644
> --- a/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
> @@ -23,210 +23,23 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -/* NOTE: We do mark syscalls with unwind annotations, for the benefit of
> - cancellation; but they're really only accurate at the point of the
> - syscall. The ARM unwind directives are not rich enough without adding
> - a custom personality function. */
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (__##syscall_name##_nocancel); \
> - CFI_SECTIONS; \
> - DO_CALL (syscall_name, args); \
> - cmn r0, $4096; \
> - PSEUDO_RET; \
> - END (__##syscall_name##_nocancel); \
> - ENTRY (name); \
> - SINGLE_THREAD_P; \
> - DOARGS_##args; \
> - bne .Lpseudo_cancel; \
> - cfi_remember_state; \
> - ldr r7, =SYS_ify (syscall_name); \
> - swi 0x0; \
> - UNDOARGS_##args; \
> - cmn r0, $4096; \
> - PSEUDO_RET; \
> - cfi_restore_state; \
> - .Lpseudo_cancel: \
> - .fnstart; /* matched by the .fnend in UNDOARGS below. */ \
> - DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \
> - CENABLE; \
> - mov ip, r0; /* put mask in safe place. */ \
> - UNDOCARGS_##args; /* restore syscall args. */ \
> - ldr r7, =SYS_ify (syscall_name); \
> - swi 0x0; /* do the call. */ \
> - mov r7, r0; /* save syscall return value. */ \
> - mov r0, ip; /* get mask back. */ \
> - CDISABLE; \
> - mov r0, r7; /* retrieve return value. */ \
> - RESTORE_LR_##args; \
> - UNDOARGS_##args; \
> - cmn r0, $4096
> -
> -/* DOARGS pushes eight bytes on the stack for five arguments, twelve bytes for
> - six arguments, and four bytes for fewer. In order to preserve doubleword
> - alignment, sometimes we must save an extra register. */
> -
> -# define RESTART_UNWIND \
> - .fnend; \
> - .fnstart; \
> - .save {r7}; \
> - .save {lr}
> -
> -# define DOCARGS_0 \
> - .save {r7}; \
> - push {lr}; \
> - cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (lr, 0); \
> - .save {lr}
> -# define UNDOCARGS_0
> -# define RESTORE_LR_0 \
> - pop {lr}; \
> - cfi_adjust_cfa_offset (-4); \
> - cfi_restore (lr)
> -
> -# define DOCARGS_1 \
> - .save {r7}; \
> - push {r0, r1, lr}; \
> - cfi_adjust_cfa_offset (12); \
> - cfi_rel_offset (lr, 8); \
> - .save {lr}; \
> - .pad #8
> -# define UNDOCARGS_1 \
> - ldr r0, [sp], #8; \
> - cfi_adjust_cfa_offset (-8); \
> - RESTART_UNWIND
> -# define RESTORE_LR_1 \
> - RESTORE_LR_0
> -
> -# define DOCARGS_2 \
> - .save {r7}; \
> - push {r0, r1, lr}; \
> - cfi_adjust_cfa_offset (12); \
> - cfi_rel_offset (lr, 8); \
> - .save {lr}; \
> - .pad #8
> -# define UNDOCARGS_2 \
> - pop {r0, r1}; \
> - cfi_adjust_cfa_offset (-8); \
> - RESTART_UNWIND
> -# define RESTORE_LR_2 \
> - RESTORE_LR_0
> -
> -# define DOCARGS_3 \
> - .save {r7}; \
> - push {r0, r1, r2, r3, lr}; \
> - cfi_adjust_cfa_offset (20); \
> - cfi_rel_offset (lr, 16); \
> - .save {lr}; \
> - .pad #16
> -# define UNDOCARGS_3 \
> - pop {r0, r1, r2, r3}; \
> - cfi_adjust_cfa_offset (-16); \
> - RESTART_UNWIND
> -# define RESTORE_LR_3 \
> - RESTORE_LR_0
> -
> -# define DOCARGS_4 \
> - .save {r7}; \
> - push {r0, r1, r2, r3, lr}; \
> - cfi_adjust_cfa_offset (20); \
> - cfi_rel_offset (lr, 16); \
> - .save {lr}; \
> - .pad #16
> -# define UNDOCARGS_4 \
> - pop {r0, r1, r2, r3}; \
> - cfi_adjust_cfa_offset (-16); \
> - RESTART_UNWIND
> -# define RESTORE_LR_4 \
> - RESTORE_LR_0
> -
> -/* r4 is only stmfd'ed for correct stack alignment. */
> -# define DOCARGS_5 \
> - .save {r4, r7}; \
> - push {r0, r1, r2, r3, r4, lr}; \
> - cfi_adjust_cfa_offset (24); \
> - cfi_rel_offset (lr, 20); \
> - .save {lr}; \
> - .pad #20
> -# define UNDOCARGS_5 \
> - pop {r0, r1, r2, r3}; \
> - cfi_adjust_cfa_offset (-16); \
> - .fnend; \
> - .fnstart; \
> - .save {r4, r7}; \
> - .save {lr}; \
> - .pad #4
> -# define RESTORE_LR_5 \
> - pop {r4, lr}; \
> - cfi_adjust_cfa_offset (-8); \
> - /* r4 will be marked as restored later. */ \
> - cfi_restore (lr)
> -
> -# define DOCARGS_6 \
> - .save {r4, r5, r7}; \
> - push {r0, r1, r2, r3, lr}; \
> - cfi_adjust_cfa_offset (20); \
> - cfi_rel_offset (lr, 16); \
> - .save {lr}; \
> - .pad #16
> -# define UNDOCARGS_6 \
> - pop {r0, r1, r2, r3}; \
> - cfi_adjust_cfa_offset (-16); \
> - .fnend; \
> - .fnstart; \
> - .save {r4, r5, r7}; \
> - .save {lr};
> -# define RESTORE_LR_6 \
> - RESTORE_LR_0
> -
> # if IS_IN (libpthread)
> -# define CENABLE bl PLTJMP(__pthread_enable_asynccancel)
> -# define CDISABLE bl PLTJMP(__pthread_disable_asynccancel)
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> -# define CENABLE bl PLTJMP(__libc_enable_asynccancel)
> -# define CDISABLE bl PLTJMP(__libc_disable_asynccancel)
> # define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# define CENABLE bl PLTJMP(__librt_enable_asynccancel)
> -# define CDISABLE bl PLTJMP(__librt_disable_asynccancel)
> -# else
> -# error Unsupported library
> # endif
>
> # if IS_IN (libpthread) || IS_IN (libc)
> -# ifndef __ASSEMBLER__
> extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - LDST_PCREL(ldr, ip, ip, __local_multiple_threads); \
> - teq ip, #0
> -# endif
> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> # else
> /* There is no __local_multiple_threads for librt, so use the TCB. */
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - push {r0, lr}; \
> - cfi_adjust_cfa_offset (8); \
> - cfi_rel_offset (lr, 4); \
> - GET_TLS (lr); \
> - NEGOFF_ADJ_BASE (r0, MULTIPLE_THREADS_OFFSET); \
> - ldr ip, NEGOFF_OFF1 (r0, MULTIPLE_THREADS_OFFSET); \
> - pop {r0, lr}; \
> - cfi_adjust_cfa_offset (-8); \
> - cfi_restore (lr); \
> - teq ip, #0
> -# endif
> # endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> /* For rtld, et cetera. */
> # define SINGLE_THREAD_P 1
> @@ -234,8 +47,6 @@ extern int __local_multiple_threads attribute_hidden;
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h b/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
> index 8b7f2b2..a6189a7 100644
> --- a/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
> @@ -23,215 +23,6 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# ifndef NO_ERROR
> -# define NO_ERROR -0x1000
> -# endif
> -
> -/* The syscall cancellation mechanism requires userspace
> - assistance, the following code does roughly this:
> -
> - do arguments (read arg5 and arg6 to registers)
> - setup frame
> -
> - check if there are threads, yes jump to pseudo_cancel
> -
> - unthreaded:
> - syscall
> - check syscall return (jump to pre_end)
> - set errno
> - set return to -1
> - (jump to pre_end)
> -
> - pseudo_cancel:
> - cenable
> - syscall
> - cdisable
> - check syscall return (jump to pre_end)
> - set errno
> - set return to -1
> -
> - pre_end
> - restore stack
> -
> - It is expected that 'ret' and 'END' macros will
> - append an 'undo arguments' and 'return' to the
> - this PSEUDO macro. */
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - ENTRY (__##syscall_name##_nocancel) \
> - DOARGS_##args ASM_LINE_SEP \
> - stwm TREG, 64(%sp) ASM_LINE_SEP \
> - .cfi_def_cfa_offset -64 ASM_LINE_SEP \
> - .cfi_offset TREG, 0 ASM_LINE_SEP \
> - stw %sp, -4(%sp) ASM_LINE_SEP \
> - stw %r19, -32(%sp) ASM_LINE_SEP \
> - .cfi_offset 19, 32 ASM_LINE_SEP \
> - /* Save r19 */ ASM_LINE_SEP \
> - SAVE_PIC(TREG) ASM_LINE_SEP \
> - /* Do syscall, delay loads # */ ASM_LINE_SEP \
> - ble 0x100(%sr2,%r0) ASM_LINE_SEP \
> - ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
> - ldi NO_ERROR,%r1 ASM_LINE_SEP \
> - cmpb,>>=,n %r1,%ret0,L(pre_nc_end) ASM_LINE_SEP \
> - /* Restore r19 from TREG */ ASM_LINE_SEP \
> - LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \
> - SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
> - /* Use TREG for temp storage */ ASM_LINE_SEP \
> - copy %ret0, TREG /* delay */ ASM_LINE_SEP \
> - /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \
> - /* do a -1*syscall_ret0 */ ASM_LINE_SEP \
> - sub %r0, TREG, TREG ASM_LINE_SEP \
> - /* Store into errno location */ ASM_LINE_SEP \
> - stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
> - /* return -1 as error */ ASM_LINE_SEP \
> - ldi -1, %ret0 ASM_LINE_SEP \
> -L(pre_nc_end): ASM_LINE_SEP \
> - /* No need to LOAD_PIC */ ASM_LINE_SEP \
> - /* Undo frame */ ASM_LINE_SEP \
> - ldwm -64(%sp),TREG ASM_LINE_SEP \
> - /* Restore rp before exit */ ASM_LINE_SEP \
> - ldw -20(%sp), %rp ASM_LINE_SEP \
> - ret ASM_LINE_SEP \
> - END(__##syscall_name##_nocancel) ASM_LINE_SEP \
> - /**********************************************/ASM_LINE_SEP \
> - ENTRY (name) \
> - DOARGS_##args ASM_LINE_SEP \
> - stwm TREG, 64(%sp) ASM_LINE_SEP \
> - .cfi_def_cfa_offset -64 ASM_LINE_SEP \
> - .cfi_offset TREG, 0 ASM_LINE_SEP \
> - stw %sp, -4(%sp) ASM_LINE_SEP \
> - stw %r19, -32(%sp) ASM_LINE_SEP \
> - .cfi_offset 19, 32 ASM_LINE_SEP \
> - /* Done setting up frame, continue... */ ASM_LINE_SEP \
> - SINGLE_THREAD_P ASM_LINE_SEP \
> - cmpib,<>,n 0,%ret0,L(pseudo_cancel) ASM_LINE_SEP \
> -L(unthreaded): ASM_LINE_SEP \
> - /* Save r19 */ ASM_LINE_SEP \
> - SAVE_PIC(TREG) ASM_LINE_SEP \
> - /* Do syscall, delay loads # */ ASM_LINE_SEP \
> - ble 0x100(%sr2,%r0) ASM_LINE_SEP \
> - ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
> - ldi NO_ERROR,%r1 ASM_LINE_SEP \
> - cmpb,>>=,n %r1,%ret0,L(pre_end) ASM_LINE_SEP \
> - /* Restore r19 from TREG */ ASM_LINE_SEP \
> - LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \
> - SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
> - /* Use TREG for temp storage */ ASM_LINE_SEP \
> - copy %ret0, TREG /* delay */ ASM_LINE_SEP \
> - /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \
> - /* do a -1*syscall_ret0 */ ASM_LINE_SEP \
> - sub %r0, TREG, TREG ASM_LINE_SEP \
> - /* Store into errno location */ ASM_LINE_SEP \
> - stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
> - b L(pre_end) ASM_LINE_SEP \
> - /* return -1 as error */ ASM_LINE_SEP \
> - ldi -1, %ret0 /* delay */ ASM_LINE_SEP \
> -L(pseudo_cancel): ASM_LINE_SEP \
> - PUSHARGS_##args /* Save args */ ASM_LINE_SEP \
> - /* Save r19 into TREG */ ASM_LINE_SEP \
> - CENABLE /* FUNC CALL */ ASM_LINE_SEP \
> - SAVE_PIC(TREG) /* delay */ ASM_LINE_SEP \
> - /* restore syscall args */ ASM_LINE_SEP \
> - POPARGS_##args ASM_LINE_SEP \
> - /* save mask from cenable (use stub rp slot) */ ASM_LINE_SEP \
> - stw %ret0, -24(%sp) ASM_LINE_SEP \
> - /* ... SYSCALL ... */ ASM_LINE_SEP \
> - ble 0x100(%sr2,%r0) ASM_LINE_SEP \
> - ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
> - /* ............... */ ASM_LINE_SEP \
> - LOAD_PIC(TREG) ASM_LINE_SEP \
> - /* pass mask as arg0 to cdisable */ ASM_LINE_SEP \
> - ldw -24(%sp), %r26 ASM_LINE_SEP \
> - CDISABLE ASM_LINE_SEP \
> - stw %ret0, -24(%sp) /* delay */ ASM_LINE_SEP \
> - /* Restore syscall return */ ASM_LINE_SEP \
> - ldw -24(%sp), %ret0 ASM_LINE_SEP \
> - /* compare error */ ASM_LINE_SEP \
> - ldi NO_ERROR,%r1 ASM_LINE_SEP \
> - /* branch if no error */ ASM_LINE_SEP \
> - cmpb,>>=,n %r1,%ret0,L(pre_end) ASM_LINE_SEP \
> - LOAD_PIC(TREG) /* cond. nullify */ ASM_LINE_SEP \
> - copy %ret0, TREG /* save syscall return */ ASM_LINE_SEP \
> - SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
> - /* make syscall res value positive */ ASM_LINE_SEP \
> - sub %r0, TREG, TREG /* delay */ ASM_LINE_SEP \
> - /* No need to LOAD_PIC */ ASM_LINE_SEP \
> - /* store into errno location */ ASM_LINE_SEP \
> - stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
> - /* return -1 */ ASM_LINE_SEP \
> - ldi -1, %ret0 ASM_LINE_SEP \
> -L(pre_end): ASM_LINE_SEP \
> - /* No need to LOAD_PIC */ ASM_LINE_SEP \
> - /* Undo frame */ ASM_LINE_SEP \
> - ldwm -64(%sp),TREG ASM_LINE_SEP \
> - /* Restore rp before exit */ ASM_LINE_SEP \
> - ldw -20(%sp), %rp ASM_LINE_SEP
> -
> -/* Save arguments into our frame */
> -# define PUSHARGS_0 /* nothing to do */
> -# define PUSHARGS_1 PUSHARGS_0 stw %r26, -36(%sr0,%sp) ASM_LINE_SEP \
> - .cfi_offset 26, 28 ASM_LINE_SEP
> -# define PUSHARGS_2 PUSHARGS_1 stw %r25, -40(%sr0,%sp) ASM_LINE_SEP \
> - .cfi_offset 25, 24 ASM_LINE_SEP
> -# define PUSHARGS_3 PUSHARGS_2 stw %r24, -44(%sr0,%sp) ASM_LINE_SEP \
> - .cfi_offset 24, 20 ASM_LINE_SEP
> -# define PUSHARGS_4 PUSHARGS_3 stw %r23, -48(%sr0,%sp) ASM_LINE_SEP \
> - .cfi_offset 23, 16 ASM_LINE_SEP
> -# define PUSHARGS_5 PUSHARGS_4 stw %r22, -52(%sr0,%sp) ASM_LINE_SEP \
> - .cfi_offset 22, 12 ASM_LINE_SEP
> -# define PUSHARGS_6 PUSHARGS_5 stw %r21, -56(%sr0,%sp) ASM_LINE_SEP \
> - .cfi_offset 21, 8 ASM_LINE_SEP
> -
> -/* Bring them back from the stack */
> -# define POPARGS_0 /* nothing to do */
> -# define POPARGS_1 POPARGS_0 ldw -36(%sr0,%sp), %r26 ASM_LINE_SEP
> -# define POPARGS_2 POPARGS_1 ldw -40(%sr0,%sp), %r25 ASM_LINE_SEP
> -# define POPARGS_3 POPARGS_2 ldw -44(%sr0,%sp), %r24 ASM_LINE_SEP
> -# define POPARGS_4 POPARGS_3 ldw -48(%sr0,%sp), %r23 ASM_LINE_SEP
> -# define POPARGS_5 POPARGS_4 ldw -52(%sr0,%sp), %r22 ASM_LINE_SEP
> -# define POPARGS_6 POPARGS_5 ldw -56(%sr0,%sp), %r21 ASM_LINE_SEP
> -
> -# if IS_IN (libpthread)
> -# ifdef PIC
> -# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
> - bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
> -# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
> - bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
> -# else
> -# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
> - bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
> -# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
> - bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
> -# endif
> -# elif IS_IN (libc)
> -# ifdef PIC
> -# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
> - bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
> -# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
> - bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
> -# else
> -# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
> - bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
> -# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
> - bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
> -# endif
> -# elif IS_IN (librt)
> -# ifdef PIC
> -# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
> - bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
> -# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
> - bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
> -# else
> -# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
> - bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
> -# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
> - bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
> -# endif
> -# else
> -# error Unsupported library
> -# endif
> -
> # if IS_IN (libpthread)
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> @@ -242,17 +33,11 @@ L(pre_end): ASM_LINE_SEP \
> # error Unsupported library
> # endif
>
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -/* Read the value of header.multiple_threads from the thread pointer */
> -# define SINGLE_THREAD_P \
> - mfctl %cr27, %ret0 ASM_LINE_SEP \
> - ldw MULTIPLE_THREADS_THREAD_OFFSET(%sr0,%ret0),%ret0 ASM_LINE_SEP
> -# endif
> -#elif !defined __ASSEMBLER__
> +
> +#else
>
> /* This code should never be used but we define it anyhow. */
> # define SINGLE_THREAD_P (1)
> @@ -261,8 +46,6 @@ L(pre_end): ASM_LINE_SEP \
> #endif
> /* IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) */
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
> index ebf6019..34e2b6f 100644
> --- a/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
> @@ -24,130 +24,17 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name) \
> - cmpl $0, %gs:MULTIPLE_THREADS_OFFSET; \
> - jne L(pseudo_cancel); \
> - .type __##syscall_name##_nocancel,@function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - DO_CALL (syscall_name, args); \
> - cmpl $-4095, %eax; \
> - jae SYSCALL_ERROR_LABEL; \
> - ret; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - L(pseudo_cancel): \
> - CENABLE \
> - SAVE_OLDTYPE_##args \
> - PUSHCARGS_##args \
> - DOCARGS_##args \
> - movl $SYS_ify (syscall_name), %eax; \
> - ENTER_KERNEL; \
> - POPCARGS_##args; \
> - POPSTATE_##args \
> - cmpl $-4095, %eax; \
> - jae SYSCALL_ERROR_LABEL
> -
> -# define SAVE_OLDTYPE_0 movl %eax, %ecx;
> -# define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0
> -# define SAVE_OLDTYPE_2 pushl %eax; cfi_adjust_cfa_offset (4);
> -# define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2
> -# define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2
> -# define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2
> -# define SAVE_OLDTYPE_6 SAVE_OLDTYPE_2
> -
> -# define PUSHCARGS_0 /* No arguments to push. */
> -# define DOCARGS_0 /* No arguments to frob. */
> -# define POPCARGS_0 /* No arguments to pop. */
> -# define _PUSHCARGS_0 /* No arguments to push. */
> -# define _POPCARGS_0 /* No arguments to pop. */
> -
> -# define PUSHCARGS_1 movl %ebx, %edx; cfi_register (ebx, edx); PUSHCARGS_0
> -# define DOCARGS_1 _DOARGS_1 (4)
> -# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; cfi_restore (ebx);
> -# define _PUSHCARGS_1 pushl %ebx; cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (ebx, 0); _PUSHCARGS_0
> -# define _POPCARGS_1 _POPCARGS_0; popl %ebx; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (ebx);
> -
> -# define PUSHCARGS_2 PUSHCARGS_1
> -# define DOCARGS_2 _DOARGS_2 (12)
> -# define POPCARGS_2 POPCARGS_1
> -# define _PUSHCARGS_2 _PUSHCARGS_1
> -# define _POPCARGS_2 _POPCARGS_1
> -
> -# define PUSHCARGS_3 _PUSHCARGS_2
> -# define DOCARGS_3 _DOARGS_3 (20)
> -# define POPCARGS_3 _POPCARGS_3
> -# define _PUSHCARGS_3 _PUSHCARGS_2
> -# define _POPCARGS_3 _POPCARGS_2
> -
> -# define PUSHCARGS_4 _PUSHCARGS_4
> -# define DOCARGS_4 _DOARGS_4 (28)
> -# define POPCARGS_4 _POPCARGS_4
> -# define _PUSHCARGS_4 pushl %esi; cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (esi, 0); _PUSHCARGS_3
> -# define _POPCARGS_4 _POPCARGS_3; popl %esi; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (esi);
> -
> -# define PUSHCARGS_5 _PUSHCARGS_5
> -# define DOCARGS_5 _DOARGS_5 (36)
> -# define POPCARGS_5 _POPCARGS_5
> -# define _PUSHCARGS_5 pushl %edi; cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (edi, 0); _PUSHCARGS_4
> -# define _POPCARGS_5 _POPCARGS_4; popl %edi; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (edi);
> -
> -# define PUSHCARGS_6 _PUSHCARGS_6
> -# define DOCARGS_6 _DOARGS_6 (44)
> -# define POPCARGS_6 _POPCARGS_6
> -# define _PUSHCARGS_6 pushl %ebp; cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (ebp, 0); _PUSHCARGS_5
> -# define _POPCARGS_6 _POPCARGS_5; popl %ebp; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (ebp);
> -
> -# if IS_IN (libpthread)
> -# define CENABLE call __pthread_enable_asynccancel;
> -# define CDISABLE call __pthread_disable_asynccancel
> -# elif IS_IN (libc)
> -# define CENABLE call __libc_enable_asynccancel;
> -# define CDISABLE call __libc_disable_asynccancel
> -# elif IS_IN (librt)
> -# define CENABLE call __librt_enable_asynccancel;
> -# define CDISABLE call __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -# define POPSTATE_0 \
> - pushl %eax; cfi_adjust_cfa_offset (4); movl %ecx, %eax; \
> - CDISABLE; popl %eax; cfi_adjust_cfa_offset (-4);
> -# define POPSTATE_1 POPSTATE_0
> -# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; \
> - cfi_adjust_cfa_offset (-4);
> -# define POPSTATE_3 POPSTATE_2
> -# define POPSTATE_4 POPSTATE_3
> -# define POPSTATE_5 POPSTATE_4
> -# define POPSTATE_6 POPSTATE_5
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
> -# endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
> index 7c7f619..96d04de 100644
> --- a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
> @@ -23,201 +23,13 @@
> #endif
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# undef PSEUDO
> -
> -# if IS_IN (libc)
> -# define SYSDEP_CANCEL_ERRNO __libc_errno
> -# else
> -# define SYSDEP_CANCEL_ERRNO errno
> -# endif
> -# define SYSDEP_CANCEL_ERROR(args) \
> -.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
> - .align 32; \
> - .proc __syscall_error_##args; \
> - .global __syscall_error_##args; \
> - .hidden __syscall_error_##args; \
> - .size __syscall_error_##args, 64; \
> -__syscall_error_##args: \
> - .prologue; \
> - .regstk args, 5, args, 0; \
> - .save ar.pfs, loc0; \
> - .save rp, loc1; \
> - .body; \
> - addl loc4 = @ltoff(@tprel(SYSDEP_CANCEL_ERRNO)), gp;; \
> - ld8 loc4 = [loc4]; \
> - mov rp = loc1;; \
> - mov r8 = -1; \
> - add loc4 = loc4, r13;; \
> - st4 [loc4] = loc3; \
> - mov ar.pfs = loc0
> -
> -# ifndef USE_DL_SYSINFO
> -
> -# define PSEUDO(name, syscall_name, args) \
> -.text; \
> -ENTRY (name) \
> - adds r14 = MULTIPLE_THREADS_OFFSET, r13;; \
> - ld4 r14 = [r14]; \
> - mov r15 = SYS_ify(syscall_name);; \
> - cmp4.ne p6, p7 = 0, r14; \
> -(p6) br.cond.spnt .Lpseudo_cancel;; \
> - break __BREAK_SYSCALL;; \
> - cmp.eq p6,p0=-1,r10; \
> -(p6) br.cond.spnt.few __syscall_error; \
> - ret;; \
> - .endp name; \
> - .proc __GC_##name; \
> - .globl __GC_##name; \
> - .hidden __GC_##name; \
> -__GC_##name: \
> -.Lpseudo_cancel: \
> - .prologue; \
> - .regstk args, 5, args, 0; \
> - .save ar.pfs, loc0; \
> - alloc loc0 = ar.pfs, args, 5, args, 0; \
> - .save rp, loc1; \
> - mov loc1 = rp;; \
> - .body; \
> - CENABLE;; \
> - mov loc2 = r8; \
> - COPY_ARGS_##args \
> - mov r15 = SYS_ify(syscall_name); \
> - break __BREAK_SYSCALL;; \
> - mov loc3 = r8; \
> - mov loc4 = r10; \
> - mov out0 = loc2; \
> - CDISABLE;; \
> - cmp.eq p6,p0=-1,loc4; \
> -(p6) br.cond.spnt.few __syscall_error_##args; \
> - mov r8 = loc3; \
> - mov rp = loc1; \
> - mov ar.pfs = loc0; \
> -.Lpseudo_end: \
> - ret; \
> - .endp __GC_##name; \
> - SYSDEP_CANCEL_ERROR(args)
> -
> -# else /* USE_DL_SYSINFO */
> -
> -# define PSEUDO(name, syscall_name, args) \
> -.text; \
> -ENTRY (name) \
> - .prologue; \
> - adds r2 = SYSINFO_OFFSET, r13; \
> - adds r14 = MULTIPLE_THREADS_OFFSET, r13; \
> - .save ar.pfs, r11; \
> - mov r11 = ar.pfs;; \
> - .body; \
> - ld4 r14 = [r14]; \
> - ld8 r2 = [r2]; \
> - mov r15 = SYS_ify(syscall_name);; \
> - cmp4.ne p6, p7 = 0, r14; \
> - mov b7 = r2; \
> -(p6) br.cond.spnt .Lpseudo_cancel; \
> - br.call.sptk.many b6 = b7;; \
> - mov ar.pfs = r11; \
> - cmp.eq p6,p0 = -1, r10; \
> -(p6) br.cond.spnt.few __syscall_error; \
> - ret;; \
> - .endp name; \
> - \
> - .proc __##syscall_name##_nocancel; \
> - .globl __##syscall_name##_nocancel; \
> -__##syscall_name##_nocancel: \
> - .prologue; \
> - adds r2 = SYSINFO_OFFSET, r13; \
> - .save ar.pfs, r11; \
> - mov r11 = ar.pfs;; \
> - .body; \
> - ld8 r2 = [r2]; \
> - mov r15 = SYS_ify(syscall_name);; \
> - mov b7 = r2; \
> - br.call.sptk.many b6 = b7;; \
> - mov ar.pfs = r11; \
> - cmp.eq p6,p0 = -1, r10; \
> -(p6) br.cond.spnt.few __syscall_error; \
> - ret;; \
> - .endp __##syscall_name##_nocancel; \
> - \
> - .proc __GC_##name; \
> - .globl __GC_##name; \
> - .hidden __GC_##name; \
> -__GC_##name: \
> -.Lpseudo_cancel: \
> - .prologue; \
> - .regstk args, 5, args, 0; \
> - .save ar.pfs, loc0; \
> - alloc loc0 = ar.pfs, args, 5, args, 0; \
> - adds loc4 = SYSINFO_OFFSET, r13; \
> - .save rp, loc1; \
> - mov loc1 = rp;; \
> - .body; \
> - ld8 loc4 = [loc4]; \
> - CENABLE;; \
> - mov loc2 = r8; \
> - mov b7 = loc4; \
> - COPY_ARGS_##args \
> - mov r15 = SYS_ify(syscall_name); \
> - br.call.sptk.many b6 = b7;; \
> - mov loc3 = r8; \
> - mov loc4 = r10; \
> - mov out0 = loc2; \
> - CDISABLE;; \
> - cmp.eq p6,p0=-1,loc4; \
> -(p6) br.cond.spnt.few __syscall_error_##args; \
> - mov r8 = loc3; \
> - mov rp = loc1; \
> - mov ar.pfs = loc0; \
> -.Lpseudo_end: \
> - ret; \
> - .endp __GC_##name; \
> - SYSDEP_CANCEL_ERROR(args)
> -
> -# endif /* USE_DL_SYSINFO */
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(name) .endp
> -
> -# if IS_IN (libpthread)
> -# define CENABLE br.call.sptk.many b0 = __pthread_enable_asynccancel
> -# define CDISABLE br.call.sptk.many b0 = __pthread_disable_asynccancel
> -# elif IS_IN (libc)
> -# define CENABLE br.call.sptk.many b0 = __libc_enable_asynccancel
> -# define CDISABLE br.call.sptk.many b0 = __libc_disable_asynccancel
> -# elif IS_IN (librt)
> -# define CENABLE br.call.sptk.many b0 = __librt_enable_asynccancel
> -# define CDISABLE br.call.sptk.many b0 = __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -
> -# define COPY_ARGS_0 /* Nothing */
> -# define COPY_ARGS_1 COPY_ARGS_0 mov out0 = in0;
> -# define COPY_ARGS_2 COPY_ARGS_1 mov out1 = in1;
> -# define COPY_ARGS_3 COPY_ARGS_2 mov out2 = in2;
> -# define COPY_ARGS_4 COPY_ARGS_3 mov out3 = in3;
> -# define COPY_ARGS_5 COPY_ARGS_4 mov out4 = in4;
> -# define COPY_ARGS_6 COPY_ARGS_5 mov out5 = in5;
> -# define COPY_ARGS_7 COPY_ARGS_6 mov out6 = in6;
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14
> -# endif
> -
> -#elif !defined __ASSEMBLER__
> -
> +#else
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION 1
> -
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h b/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
> index 9bc9e13..1603c5f 100644
> --- a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
> @@ -18,121 +18,21 @@
>
> #include <sysdep.h>
> #include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> +#include <nptl/pthreadP.h>
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name) \
> - SINGLE_THREAD_P; \
> - jne .Lpseudo_cancel; \
> - .type __##syscall_name##_nocancel,@function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - DO_CALL (syscall_name, args); \
> - cmp.l &-4095, %d0; \
> - jcc SYSCALL_ERROR_LABEL; \
> - rts; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - .Lpseudo_cancel: \
> - CENABLE; \
> - DOCARGS_##args \
> - move.l %d0, -(%sp); /* Save result of CENABLE. */ \
> - cfi_adjust_cfa_offset (4); \
> - move.l &SYS_ify (syscall_name), %d0; \
> - trap &0; \
> - move.l %d0, %d2; \
> - CDISABLE; \
> - addq.l &4, %sp; /* Remove result of CENABLE from the stack. */ \
> - cfi_adjust_cfa_offset (-4); \
> - move.l %d2, %d0; \
> - UNDOCARGS_##args \
> - cmp.l &-4095, %d0; \
> - jcc SYSCALL_ERROR_LABEL
> -
> -/* Note: we use D2 to save syscall's return value as D0 will be clobbered in
> - CDISABLE. */
> -# define DOCARGS_0 move.l %d2, -(%sp); \
> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d2, 0);
> -# define UNDOCARGS_0 move.l (%sp)+, %d2; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (%d2);
> -
> -# define DOCARGS_1 _DOCARGS_1 (4); DOCARGS_0
> -# define _DOCARGS_1(n) move.l n(%sp), %d1;
> -# define UNDOCARGS_1 UNDOCARGS_0
> -
> -# define DOCARGS_2 _DOCARGS_2 (8)
> -# define _DOCARGS_2(n) DOCARGS_0 move.l n+4(%sp), %d2; _DOCARGS_1 (n)
> -# define UNDOCARGS_2 UNDOCARGS_0
> -
> -# define DOCARGS_3 _DOCARGS_3 (12)
> -# define _DOCARGS_3(n) move.l %d3, -(%sp); \
> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d3, 0); \
> - move.l n+4(%sp), %d3; _DOCARGS_2 (n)
> -# define UNDOCARGS_3 UNDOCARGS_2 move.l (%sp)+, %d3; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (%d3);
> -
> -# define DOCARGS_4 _DOCARGS_4 (16)
> -# define _DOCARGS_4(n) move.l %d4, -(%sp); \
> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d4, 0); \
> - move.l n+4(%sp), %d4; _DOCARGS_3 (n)
> -# define UNDOCARGS_4 UNDOCARGS_3 move.l (%sp)+, %d4; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (%d4);
> -
> -# define DOCARGS_5 _DOCARGS_5 (20)
> -# define _DOCARGS_5(n) move.l %d5, -(%sp); \
> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d5, 0); \
> - move.l n+4(%sp), %d5; _DOCARGS_4 (n)
> -# define UNDOCARGS_5 UNDOCARGS_4 move.l (%sp)+, %d5; \
> - cfi_adjust_cfa_offset (-4); cfi_restore (%d5);
> -
> -# define DOCARGS_6 _DOCARGS_6 (24)
> -# define _DOCARGS_6(n) move.l n(%sp), %a0; _DOCARGS_5 (n-4)
> -# define UNDOCARGS_6 UNDOCARGS_5
> -
> -# ifdef PIC
> -# define PSEUDO_JMP(sym) jbsr sym ## @PLTPC
> -# else
> -# define PSEUDO_JMP(sym) jbsr sym
> -# endif
> -
> -# if IS_IN (libpthread)
> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
> -# elif IS_IN (libc)
> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
> -# elif IS_IN (librt)
> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
> -# else
> -# error Unsupported library
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - PSEUDO_JMP (__m68k_read_tp); \
> - tst.l MULTIPLE_THREADS_OFFSET(%a0)
> -# endif
> -
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION (1)
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, \
> 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h b/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
> index dbcc2b2..7fe030b 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
> @@ -23,136 +23,28 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# if !IS_IN (librt) || !defined(PIC)
> -# define AC_STACK_SIZE 16 /* space for r15, async_cancel arg and 2 temp words */
> -# define AC_SET_GOT /* empty */
> -# define AC_RESTORE_GOT /* empty */
> -# else
> -# define AC_STACK_SIZE 20 /* extra 4 bytes for r20 */
> -# define AC_SET_GOT \
> - swi r20, r1, AC_STACK_SIZE-4; \
> - mfs r20, rpc; \
> - addik r20, r20, _GLOBAL_OFFSET_TABLE_+8;
> -# define AC_RESTORE_GOT \
> - lwi r20, r1, AC_STACK_SIZE-4;
> -# endif
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name) \
> - SINGLE_THREAD_P(r12); \
> - bnei r12, L(pseudo_cancel); \
> - .globl __##syscall_name##_nocancel; \
> - .type __##syscall_name##_nocancel,@function; \
> -__##syscall_name##_nocancel: \
> - DO_CALL (syscall_name, args); \
> - addik r4, r0, -4095; \
> - cmpu r4, r4, r3; \
> - bgei r4, SYSCALL_ERROR_LABEL; \
> - rtsd r15, 8; \
> - nop; \
> - .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
> -L(pseudo_cancel): \
> - addik r1, r1, -AC_STACK_SIZE; \
> - swi r15, r1, 0; \
> - AC_SET_GOT \
> - DOCARGS_##args \
> - CENABLE; \
> - swi r3, r1, 8; \
> - UNDOCARGS_##args \
> - DO_CALL (syscall_name, args); \
> - swi r3, r1, 12; \
> - lwi r5, r1, 8; \
> - CDISABLE; \
> - lwi r3, r1, 12; \
> - lwi r15, r1, 0; \
> - AC_RESTORE_GOT \
> - addik r1, r1, AC_STACK_SIZE; \
> - addik r4, r0, -4095; \
> - cmpu r4, r4, r3; \
> - bgei r4, SYSCALL_ERROR_LABEL; \
> - rtsd r15, 8; \
> - nop;
> -
> -/*
> - * Macros to save/restore syscall arguments across CENABLE
> - * The arguments are saved into the caller's stack (original r1 + 4)
> - */
> -
> -# define DOCARGS_0
> -# define DOCARGS_1 swi r5, r1, AC_STACK_SIZE + 4;
> -# define DOCARGS_2 swi r6, r1, AC_STACK_SIZE + 8; DOCARGS_1
> -# define DOCARGS_3 swi r7, r1, AC_STACK_SIZE + 12; DOCARGS_2
> -# define DOCARGS_4 swi r8, r1, AC_STACK_SIZE + 16; DOCARGS_3
> -# define DOCARGS_5 swi r9, r1, AC_STACK_SIZE + 20; DOCARGS_4
> -# define DOCARGS_6 swi r10, r1, AC_STACK_SIZE + 24; DOCARGS_5
> -
> -# define UNDOCARGS_0
> -# define UNDOCARGS_1 lwi r5, r1, AC_STACK_SIZE + 4;
> -# define UNDOCARGS_2 UNDOCARGS_1 lwi r6, r1, AC_STACK_SIZE + 8;
> -# define UNDOCARGS_3 UNDOCARGS_2 lwi r7, r1, AC_STACK_SIZE + 12;
> -# define UNDOCARGS_4 UNDOCARGS_3 lwi r8, r1, AC_STACK_SIZE + 16;
> -# define UNDOCARGS_5 UNDOCARGS_4 lwi r9, r1, AC_STACK_SIZE + 20;
> -# define UNDOCARGS_6 UNDOCARGS_5 lwi r10, r1, AC_STACK_SIZE + 24;
> -
> -# ifdef PIC
> -# define PSEUDO_JMP(sym) brlid r15, sym##@PLTPC; addk r0, r0, r0
> -# else
> -# define PSEUDO_JMP(sym) brlid r15, sym; addk r0, r0, r0
> -# endif
> -
> # if IS_IN (libpthread)
> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
> # define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
> -# else
> -# error Unsupported library
> # endif
>
> -
> # if IS_IN (libpthread) || IS_IN (libc)
> -# ifndef __ASSEMBLER__
> extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# if !defined PIC
> -# define SINGLE_THREAD_P(reg) lwi reg, r0, __local_multiple_threads;
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - mfs reg, rpc; \
> - addik reg, reg, _GLOBAL_OFFSET_TABLE_+8; \
> - lwi reg, reg, __local_multiple_threads@GOT; \
> - lwi reg, reg, 0;
> -# endif
> -# endif
> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> # else
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - lwi reg, r0, MULTIPLE_THREADS_OFFSET(reg)
> -# endif
> # endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION (1)
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
> deleted file mode 100644
> index 0ed3e3d..0000000
> --- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,249 +0,0 @@
> -/* Copyright (C) 2003-2017 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>
> -#include <sysdeps/generic/sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -#include <sys/asm.h>
> -
> -/* Gas will put the initial save of $gp into the CIE, because it appears to
> - happen before any instructions. So we use cfi_same_value instead of
> - cfi_restore. */
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -#ifdef __PIC__
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .align 2; \
> - L(pseudo_start): \
> - cfi_startproc; \
> - cfi_adjust_cfa_offset (STKSPACE); \
> - cfi_rel_offset (gp, STKOFF_GP); \
> - 99: PTR_LA t9,__syscall_error; \
> - /* manual cpreturn */ \
> - REG_L gp, STKOFF_GP(sp); \
> - cfi_same_value (gp); \
> - RESTORESTK; \
> - jr t9; \
> - .type __##syscall_name##_nocancel, @function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - SAVESTK; \
> - .cpsetup t9, STKOFF_GP, __##syscall_name##_nocancel; \
> - cfi_rel_offset (gp, STKOFF_GP); \
> - li v0, SYS_ify(syscall_name); \
> - syscall; \
> - bne a3, zero, SYSCALL_ERROR_LABEL; \
> - /* manual cpreturn */ \
> - REG_L gp, STKOFF_GP(sp); \
> - cfi_same_value (gp); \
> - RESTORESTK; \
> - ret; \
> - cfi_endproc; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - ENTRY (name) \
> - SAVESTK; \
> - .cpsetup t9, STKOFF_GP, name; \
> - cfi_rel_offset (gp, STKOFF_GP); \
> - SINGLE_THREAD_P(v1); \
> - bne zero, v1, L(pseudo_cancel); \
> - .set noreorder; \
> - li v0, SYS_ify(syscall_name); \
> - syscall; \
> - .set reorder; \
> - bne a3, zero, SYSCALL_ERROR_LABEL; \
> - /* manual cpreturn */ \
> - REG_L gp, STKOFF_GP(sp); \
> - cfi_same_value (gp); \
> - RESTORESTK; \
> - ret; \
> - L(pseudo_cancel): \
> - cfi_adjust_cfa_offset (STKSPACE); \
> - cfi_rel_offset (gp, STKOFF_GP); \
> - REG_S ra, STKOFF_RA(sp); \
> - cfi_rel_offset (ra, STKOFF_RA); \
> - PUSHARGS_##args; /* save syscall args */ \
> - CENABLE; \
> - REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
> - POPARGS_##args; /* restore syscall args */ \
> - .set noreorder; \
> - li v0, SYS_ify (syscall_name); \
> - syscall; \
> - .set reorder; \
> - REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
> - REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
> - REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
> - CDISABLE; \
> - REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
> - REG_L ra, STKOFF_RA(sp); /* restore return address */ \
> - REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
> - bne a3, zero, SYSCALL_ERROR_LABEL; \
> - /* manual cpreturn */ \
> - REG_L gp, STKOFF_GP(sp); \
> - cfi_same_value (gp); \
> - RESTORESTK; \
> - L(pseudo_end):
> -#else
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .align 2; \
> - L(pseudo_start): \
> - cfi_startproc; \
> - cfi_adjust_cfa_offset (STKSPACE); \
> - 99: RESTORESTK; \
> - j __syscall_error; \
> - .type __##syscall_name##_nocancel, @function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - SAVESTK; \
> - li v0, SYS_ify(syscall_name); \
> - syscall; \
> - bne a3, zero, SYSCALL_ERROR_LABEL; \
> - RESTORESTK; \
> - ret; \
> - cfi_endproc; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - ENTRY (name) \
> - SAVESTK; \
> - SINGLE_THREAD_P(v1); \
> - bne zero, v1, L(pseudo_cancel); \
> - .set noreorder; \
> - li v0, SYS_ify(syscall_name); \
> - syscall; \
> - .set reorder; \
> - bne a3, zero, SYSCALL_ERROR_LABEL; \
> - RESTORESTK; \
> - ret; \
> - L(pseudo_cancel): \
> - cfi_adjust_cfa_offset (STKSPACE); \
> - REG_S ra, STKOFF_RA(sp); \
> - cfi_rel_offset (ra, STKOFF_RA); \
> - PUSHARGS_##args; /* save syscall args */ \
> - CENABLE; \
> - REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
> - POPARGS_##args; /* restore syscall args */ \
> - .set noreorder; \
> - li v0, SYS_ify (syscall_name); \
> - syscall; \
> - .set reorder; \
> - REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
> - REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
> - REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
> - CDISABLE; \
> - REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
> - REG_L ra, STKOFF_RA(sp); /* restore return address */ \
> - REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
> - bne a3, zero, SYSCALL_ERROR_LABEL; \
> - RESTORESTK; \
> - L(pseudo_end):
> -#endif
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
> -
> -# define PUSHARGS_0 /* nothing to do */
> -# define PUSHARGS_1 PUSHARGS_0 REG_S a0, STKOFF_A0(sp); cfi_rel_offset (a0, STKOFF_A0);
> -# define PUSHARGS_2 PUSHARGS_1 REG_S a1, STKOFF_A1(sp); cfi_rel_offset (a1, STKOFF_A1);
> -# define PUSHARGS_3 PUSHARGS_2 REG_S a2, STKOFF_A2(sp); cfi_rel_offset (a2, STKOFF_A2);
> -# define PUSHARGS_4 PUSHARGS_3 REG_S a3, STKOFF_A3(sp); cfi_rel_offset (a3, STKOFF_A3);
> -# define PUSHARGS_5 PUSHARGS_4 REG_S a4, STKOFF_A4(sp); cfi_rel_offset (a3, STKOFF_A4);
> -# define PUSHARGS_6 PUSHARGS_5 REG_S a5, STKOFF_A5(sp); cfi_rel_offset (a3, STKOFF_A5);
> -
> -# define POPARGS_0 /* nothing to do */
> -# define POPARGS_1 POPARGS_0 REG_L a0, STKOFF_A0(sp);
> -# define POPARGS_2 POPARGS_1 REG_L a1, STKOFF_A1(sp);
> -# define POPARGS_3 POPARGS_2 REG_L a2, STKOFF_A2(sp);
> -# define POPARGS_4 POPARGS_3 REG_L a3, STKOFF_A3(sp);
> -# define POPARGS_5 POPARGS_4 REG_L a4, STKOFF_A4(sp);
> -# define POPARGS_6 POPARGS_5 REG_L a5, STKOFF_A5(sp);
> -
> -/* Save an even number of slots. Should be 0 if an even number of slots
> - are used below, or SZREG if an odd number are used. */
> -# ifdef __PIC__
> -# define STK_PAD SZREG
> -# else
> -# define STK_PAD 0
> -# endif
> -
> -/* Place values that we are more likely to use later in this sequence, i.e.
> - closer to the SP at function entry. If you do that, the are more
> - likely to already be in your d-cache. */
> -# define STKOFF_A5 (STK_PAD)
> -# define STKOFF_A4 (STKOFF_A5 + SZREG)
> -# define STKOFF_A3 (STKOFF_A4 + SZREG)
> -# define STKOFF_A2 (STKOFF_A3 + SZREG) /* MT and more args. */
> -# define STKOFF_A1 (STKOFF_A2 + SZREG) /* MT and 2 args. */
> -# define STKOFF_A0 (STKOFF_A1 + SZREG) /* MT and 1 arg. */
> -# define STKOFF_RA (STKOFF_A0 + SZREG) /* Used if MT. */
> -# define STKOFF_SC_V0 (STKOFF_RA + SZREG) /* Used if MT. */
> -# define STKOFF_SC_ERR (STKOFF_SC_V0 + SZREG) /* Used if MT. */
> -# define STKOFF_SVMSK (STKOFF_SC_ERR + SZREG) /* Used if MT. */
> -
> -# ifdef __PIC__
> -# define STKOFF_GP (STKOFF_SVMSK + SZREG) /* Always used. */
> -# define STKSPACE (STKOFF_GP + SZREG)
> -# else
> -# define STKSPACE (STKOFF_SVMSK + SZREG)
> -# endif
> -
> -# define SAVESTK PTR_SUBU sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE)
> -# define RESTORESTK PTR_ADDU sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE)
> -
> -# ifdef __PIC__
> -# define PSEUDO_JMP(sym) PTR_LA t9, sym; jalr t9
> -# else
> -# define PSEUDO_JMP(sym) jal sym
> -# endif
> -
> -# if IS_IN (libpthread)
> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
> -# elif IS_IN (librt)
> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
> -# else
> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) \
> - == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - READ_THREAD_POINTER(reg); \
> - lw reg, MULTIPLE_THREADS_OFFSET(reg)
> -#endif
> -
> -#elif !defined __ASSEMBLER__
> -
> -# define SINGLE_THREAD_P 1
> -# define NO_CANCELLATION 1
> -
> -#endif
> -
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h b/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
> index 0e45f00..fe9a3fc 100644
> --- a/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
> @@ -18,173 +18,22 @@
> #include <sysdep.h>
> #include <sysdeps/generic/sysdep.h>
> #include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> +#include <nptl/pthreadP.h>
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# ifdef __PIC__
> -# define PSEUDO_CPLOAD .cpload t9;
> -# define PSEUDO_ERRJMP la t9, __syscall_error; jr t9;
> -# define PSEUDO_SAVEGP sw gp, 32(sp); cfi_rel_offset (gp, 32);
> -# define PSEUDO_LOADGP lw gp, 32(sp);
> -# else
> -# define PSEUDO_CPLOAD
> -# define PSEUDO_ERRJMP j __syscall_error;
> -# define PSEUDO_SAVEGP
> -# define PSEUDO_LOADGP
> -# endif
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .align 2; \
> - .set nomips16; \
> - L(pseudo_start): \
> - cfi_startproc; \
> - 99: PSEUDO_ERRJMP \
> - .type __##syscall_name##_nocancel, @function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - .set noreorder; \
> - PSEUDO_CPLOAD \
> - li v0, SYS_ify(syscall_name); \
> - syscall; \
> - .set reorder; \
> - bne a3, zero, 99b; \
> - ret; \
> - cfi_endproc; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - ENTRY (name) \
> - .set noreorder; \
> - PSEUDO_CPLOAD \
> - .set reorder; \
> - SINGLE_THREAD_P(v1); \
> - bne zero, v1, L(pseudo_cancel); \
> - .set noreorder; \
> - li v0, SYS_ify(syscall_name); \
> - syscall; \
> - .set reorder; \
> - bne a3, zero, 99b; \
> - ret; \
> - L(pseudo_cancel): \
> - SAVESTK_##args; \
> - sw ra, 28(sp); \
> - cfi_rel_offset (ra, 28); \
> - PSEUDO_SAVEGP \
> - PUSHARGS_##args; /* save syscall args */ \
> - CENABLE; \
> - PSEUDO_LOADGP \
> - sw v0, 44(sp); /* save mask */ \
> - POPARGS_##args; /* restore syscall args */ \
> - .set noreorder; \
> - li v0, SYS_ify (syscall_name); \
> - syscall; \
> - .set reorder; \
> - sw v0, 36(sp); /* save syscall result */ \
> - sw a3, 40(sp); /* save syscall error flag */ \
> - lw a0, 44(sp); /* pass mask as arg1 */ \
> - CDISABLE; \
> - PSEUDO_LOADGP \
> - lw v0, 36(sp); /* restore syscall result */ \
> - lw a3, 40(sp); /* restore syscall error flag */ \
> - lw ra, 28(sp); /* restore return address */ \
> - .set noreorder; \
> - bne a3, zero, 99b; \
> - RESTORESTK; \
> - L(pseudo_end): \
> - .set reorder;
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
> -
> -# define PUSHARGS_0 /* nothing to do */
> -# define PUSHARGS_1 PUSHARGS_0 sw a0, 0(sp); cfi_rel_offset (a0, 0);
> -# define PUSHARGS_2 PUSHARGS_1 sw a1, 4(sp); cfi_rel_offset (a1, 4);
> -# define PUSHARGS_3 PUSHARGS_2 sw a2, 8(sp); cfi_rel_offset (a2, 8);
> -# define PUSHARGS_4 PUSHARGS_3 sw a3, 12(sp); cfi_rel_offset (a3, 12);
> -# define PUSHARGS_5 PUSHARGS_4 /* handled by SAVESTK_## */
> -# define PUSHARGS_6 PUSHARGS_5
> -# define PUSHARGS_7 PUSHARGS_6
> -
> -# define POPARGS_0 /* nothing to do */
> -# define POPARGS_1 POPARGS_0 lw a0, 0(sp);
> -# define POPARGS_2 POPARGS_1 lw a1, 4(sp);
> -# define POPARGS_3 POPARGS_2 lw a2, 8(sp);
> -# define POPARGS_4 POPARGS_3 lw a3, 12(sp);
> -# define POPARGS_5 POPARGS_4 /* args already in new stackframe */
> -# define POPARGS_6 POPARGS_5
> -# define POPARGS_7 POPARGS_6
> -
> -
> -# define STKSPACE 48
> -# define SAVESTK_0 subu sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE)
> -# define SAVESTK_1 SAVESTK_0
> -# define SAVESTK_2 SAVESTK_1
> -# define SAVESTK_3 SAVESTK_2
> -# define SAVESTK_4 SAVESTK_3
> -# define SAVESTK_5 lw t0, 16(sp); \
> - SAVESTK_0; \
> - sw t0, 16(sp)
> -
> -# define SAVESTK_6 lw t0, 16(sp); \
> - lw t1, 20(sp); \
> - SAVESTK_0; \
> - sw t0, 16(sp); \
> - sw t1, 20(sp)
> -
> -# define SAVESTK_7 lw t0, 16(sp); \
> - lw t1, 20(sp); \
> - lw t2, 24(sp); \
> - SAVESTK_0; \
> - sw t0, 16(sp); \
> - sw t1, 20(sp); \
> - sw t2, 24(sp)
> -
> -# define RESTORESTK addu sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE)
> -
> -
> -# ifdef __PIC__
> -/* We use jalr rather than jal. This means that the assembler will not
> - automatically restore $gp (in case libc has multiple GOTs) so we must
> - do it manually - which we have to do anyway since we don't use .cprestore.
> - It also shuts up the assembler warning about not using .cprestore. */
> -# define PSEUDO_JMP(sym) la t9, sym; jalr t9;
> -# else
> -# define PSEUDO_JMP(sym) jal sym;
> -# endif
> -
> -# if IS_IN (libpthread)
> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
> -# elif IS_IN (librt)
> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
> -# else
> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) \
> == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - READ_THREAD_POINTER(reg); \
> - lw reg, MULTIPLE_THREADS_OFFSET(reg)
> -#endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P 1
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h b/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
> index 47b92d9..7647363 100644
> --- a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
> @@ -18,124 +18,22 @@
>
> #include <sysdep.h>
> #include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> +#include <nptl/pthreadP.h>
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .type __##syscall_name##_nocancel, @function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - cfi_startproc; \
> - DO_CALL (syscall_name, args); \
> - bne r7, zero, SYSCALL_ERROR_LABEL; \
> - ret; \
> - cfi_endproc; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - ENTRY (name) \
> - SINGLE_THREAD_P(r2); \
> - bne r2, zero, pseudo_cancel; \
> - DO_CALL (syscall_name, args); \
> - bne r7, zero, SYSCALL_ERROR_LABEL; \
> - ret; \
> - pseudo_cancel: \
> - SAVESTK_##args; /* save syscall args and adjust stack */ \
> - SAVEREG(ra, 0); /* save return address */ \
> - SAVEREG(r22, 4); /* save GOT pointer */ \
> - nextpc r22; \
> -1: movhi r2, %hiadj(_gp_got - 1b); \
> - addi r2, r2, %lo(_gp_got - 1b); \
> - add r22, r22, r2; \
> - CENABLE; \
> - callr r3; \
> - stw r2, 8(sp); /* save mask */ \
> - LOADARGS_##args; \
> - movi r2, SYS_ify(syscall_name); \
> - trap; \
> - stw r2, 12(sp); /* save syscall result */ \
> - stw r7, 16(sp); /* save syscall error flag */ \
> - ldw r4, 8(sp); /* pass mask as argument 1 */ \
> - CDISABLE; \
> - callr r3; \
> - ldw r7, 16(sp); /* restore syscall error flag */ \
> - ldw r2, 12(sp); /* restore syscall result */ \
> - ldw ra, 0(sp); /* restore return address */ \
> - ldw r22, 4(sp); /* restore GOT pointer */ \
> - RESTORESTK_##args; \
> - bne r7, zero, SYSCALL_ERROR_LABEL;
> -
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(sym) \
> - SYSCALL_ERROR_HANDLER \
> - END (sym)
> -
> -#define SAVEREG(REG, LOC) stw REG, LOC(sp); cfi_rel_offset (REG, LOC)
> -#define SAVESTK(X) subi sp, sp, X; cfi_adjust_cfa_offset(X)
> -#define SAVESTK_0 SAVESTK(20)
> -#define SAVEARG_1 SAVEREG(r4, 20)
> -#define SAVESTK_1 SAVESTK(24); SAVEARG_1
> -#define SAVEARG_2 SAVEREG(r5, 24); SAVEARG_1
> -#define SAVESTK_2 SAVESTK(28); SAVEARG_2
> -#define SAVEARG_3 SAVEREG(r6, 28); SAVEARG_2
> -#define SAVESTK_3 SAVESTK(32); SAVEARG_3
> -#define SAVEARG_4 SAVEREG(r7, 32); SAVEARG_3
> -#define SAVESTK_4 SAVESTK(36); SAVEARG_4
> -#define SAVESTK_5 SAVESTK_4
> -#define SAVESTK_6 SAVESTK_5
> -
> -#define LOADARGS_0
> -#define LOADARGS_1 ldw r4, 20(sp)
> -#define LOADARGS_2 LOADARGS_1; ldw r5, 24(sp)
> -#define LOADARGS_3 LOADARGS_2; ldw r6, 28(sp)
> -#define LOADARGS_4 LOADARGS_3; ldw r7, 32(sp)
> -#define LOADARGS_5 LOADARGS_4; ldw r8, 36(sp)
> -#define LOADARGS_6 LOADARGS_5; ldw r9, 40(sp)
> -
> -#define RESTORESTK(X) addi sp, sp, X; cfi_adjust_cfa_offset(-X)
> -#define RESTORESTK_0 RESTORESTK(20)
> -#define RESTORESTK_1 RESTORESTK(24)
> -#define RESTORESTK_2 RESTORESTK(28)
> -#define RESTORESTK_3 RESTORESTK(32)
> -#define RESTORESTK_4 RESTORESTK(36)
> -#define RESTORESTK_5 RESTORESTK(36)
> -#define RESTORESTK_6 RESTORESTK(36)
> -
> -# if IS_IN (libpthread)
> -# define CENABLE ldw r3, %call(__pthread_enable_asynccancel)(r22)
> -# define CDISABLE ldw r3, %call(__pthread_disable_asynccancel)(r22)
> -# elif IS_IN (librt)
> -# define CENABLE ldw r3, %call(__librt_enable_asynccancel)(r22)
> -# define CDISABLE ldw r3, %call(__librt_disable_asynccancel)(r22)
> -# elif IS_IN (libc)
> -# define CENABLE ldw r3, %call(__libc_enable_asynccancel)(r22)
> -# define CDISABLE ldw r3, %call(__libc_disable_asynccancel)(r22)
> -# else
> -# error Unsupported library
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) \
> == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - ldw reg, MULTIPLE_THREADS_OFFSET(r23)
> -#endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P 1
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
> deleted file mode 100644
> index 35d3f05..0000000
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
> +++ /dev/null
> @@ -1,118 +0,0 @@
> -/* Cancellable system call stubs. Linux/PowerPC version.
> - Copyright (C) 2003-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .section ".text"; \
> - ENTRY (name) \
> - SINGLE_THREAD_P; \
> - bne- .Lpseudo_cancel; \
> - .type __##syscall_name##_nocancel,@function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - DO_CALL (SYS_ify (syscall_name)); \
> - PSEUDO_RET; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - .Lpseudo_cancel: \
> - stwu 1,-48(1); \
> - cfi_adjust_cfa_offset (48); \
> - mflr 9; \
> - stw 9,52(1); \
> - cfi_offset (lr, 4); \
> - DOCARGS_##args; /* save syscall args around CENABLE. */ \
> - CENABLE; \
> - stw 3,16(1); /* store CENABLE return value (MASK). */ \
> - UNDOCARGS_##args; /* restore syscall args. */ \
> - DO_CALL (SYS_ify (syscall_name)); \
> - mfcr 0; /* save CR/R3 around CDISABLE. */ \
> - stw 3,8(1); \
> - stw 0,12(1); \
> - lwz 3,16(1); /* pass MASK to CDISABLE. */ \
> - CDISABLE; \
> - lwz 4,52(1); \
> - lwz 0,12(1); /* restore CR/R3. */ \
> - lwz 3,8(1); \
> - mtlr 4; \
> - mtcr 0; \
> - addi 1,1,48;
> -
> -# define DOCARGS_0
> -# define UNDOCARGS_0
> -
> -# define DOCARGS_1 stw 3,20(1); DOCARGS_0
> -# define UNDOCARGS_1 lwz 3,20(1); UNDOCARGS_0
> -
> -# define DOCARGS_2 stw 4,24(1); DOCARGS_1
> -# define UNDOCARGS_2 lwz 4,24(1); UNDOCARGS_1
> -
> -# define DOCARGS_3 stw 5,28(1); DOCARGS_2
> -# define UNDOCARGS_3 lwz 5,28(1); UNDOCARGS_2
> -
> -# define DOCARGS_4 stw 6,32(1); DOCARGS_3
> -# define UNDOCARGS_4 lwz 6,32(1); UNDOCARGS_3
> -
> -# define DOCARGS_5 stw 7,36(1); DOCARGS_4
> -# define UNDOCARGS_5 lwz 7,36(1); UNDOCARGS_4
> -
> -# define DOCARGS_6 stw 8,40(1); DOCARGS_5
> -# define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5
> -
> -# if IS_IN (libpthread)
> -# define CENABLE bl __pthread_enable_asynccancel@local
> -# define CDISABLE bl __pthread_disable_asynccancel@local
> -# elif IS_IN (libc)
> -# define CENABLE bl __libc_enable_asynccancel@local
> -# define CDISABLE bl __libc_disable_asynccancel@local
> -# elif IS_IN (librt)
> -# define CENABLE bl __librt_enable_asynccancel@local
> -# define CDISABLE bl __librt_disable_asynccancel@local
> -# else
> -# error Unsupported library
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - lwz 10,MULTIPLE_THREADS_OFFSET(2); \
> - cmpwi 10,0
> -# endif
> -
> -#elif !defined __ASSEMBLER__
> -
> -# define SINGLE_THREAD_P (1)
> -# define NO_CANCELLATION 1
> -
> -#endif
> -
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
> deleted file mode 100644
> index cad13da..0000000
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,147 +0,0 @@
> -/* Cancellable system call stubs. Linux/PowerPC64 version.
> - Copyright (C) 2003-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define DASHDASHPFX(str) __##str
> -
> -#if _CALL_ELF == 2
> -#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16+48)
> -#define CANCEL_PARM_SAVE (FRAME_MIN_SIZE+16)
> -#else
> -#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16)
> -#define CANCEL_PARM_SAVE (CANCEL_FRAMESIZE+FRAME_PARM_SAVE)
> -#endif
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .section ".text"; \
> - ENTRY (name) \
> - SINGLE_THREAD_P; \
> - bne- .Lpseudo_cancel; \
> - .type DASHDASHPFX(syscall_name##_nocancel),@function; \
> - .globl DASHDASHPFX(syscall_name##_nocancel); \
> - DASHDASHPFX(syscall_name##_nocancel): \
> - DO_CALL (SYS_ify (syscall_name)); \
> - PSEUDO_RET; \
> - .size DASHDASHPFX(syscall_name##_nocancel),.-DASHDASHPFX(syscall_name##_nocancel); \
> - .Lpseudo_cancel: \
> - stdu 1,-CANCEL_FRAMESIZE(1); \
> - cfi_adjust_cfa_offset (CANCEL_FRAMESIZE); \
> - mflr 9; \
> - std 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \
> - cfi_offset (lr, FRAME_LR_SAVE); \
> - DOCARGS_##args; /* save syscall args around CENABLE. */ \
> - CENABLE; \
> - std 3,FRAME_MIN_SIZE(1); /* store CENABLE return value (MASK). */ \
> - UNDOCARGS_##args; /* restore syscall args. */ \
> - DO_CALL (SYS_ify (syscall_name)); \
> - mfcr 0; /* save CR/R3 around CDISABLE. */ \
> - std 3,FRAME_MIN_SIZE+8(1); \
> - std 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); \
> - cfi_offset (cr, FRAME_CR_SAVE); \
> - ld 3,FRAME_MIN_SIZE(1); /* pass MASK to CDISABLE. */ \
> - CDISABLE; \
> - ld 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \
> - ld 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); /* restore CR/R3. */ \
> - ld 3,FRAME_MIN_SIZE+8(1); \
> - mtlr 9; \
> - mtcr 0; \
> - addi 1,1,CANCEL_FRAMESIZE; \
> - cfi_adjust_cfa_offset (-CANCEL_FRAMESIZE); \
> - cfi_restore (lr); \
> - cfi_restore (cr)
> -
> -# define DOCARGS_0
> -# define UNDOCARGS_0
> -
> -# define DOCARGS_1 std 3,CANCEL_PARM_SAVE(1); DOCARGS_0
> -# define UNDOCARGS_1 ld 3,CANCEL_PARM_SAVE(1); UNDOCARGS_0
> -
> -# define DOCARGS_2 std 4,CANCEL_PARM_SAVE+8(1); DOCARGS_1
> -# define UNDOCARGS_2 ld 4,CANCEL_PARM_SAVE+8(1); UNDOCARGS_1
> -
> -# define DOCARGS_3 std 5,CANCEL_PARM_SAVE+16(1); DOCARGS_2
> -# define UNDOCARGS_3 ld 5,CANCEL_PARM_SAVE+16(1); UNDOCARGS_2
> -
> -# define DOCARGS_4 std 6,CANCEL_PARM_SAVE+24(1); DOCARGS_3
> -# define UNDOCARGS_4 ld 6,CANCEL_PARM_SAVE+24(1); UNDOCARGS_3
> -
> -# define DOCARGS_5 std 7,CANCEL_PARM_SAVE+32(1); DOCARGS_4
> -# define UNDOCARGS_5 ld 7,CANCEL_PARM_SAVE+32(1); UNDOCARGS_4
> -
> -# define DOCARGS_6 std 8,CANCEL_PARM_SAVE+40(1); DOCARGS_5
> -# define UNDOCARGS_6 ld 8,CANCEL_PARM_SAVE+40(1); UNDOCARGS_5
> -
> -# if IS_IN (libpthread)
> -# ifdef SHARED
> -# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel)
> -# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel)
> -# else
> -# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel); nop
> -# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel); nop
> -# endif
> -# elif IS_IN (libc)
> -# ifdef SHARED
> -# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel)
> -# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel)
> -# else
> -# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel); nop
> -# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel); nop
> -# endif
> -# elif IS_IN (librt)
> -# ifdef SHARED
> -# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel)
> -# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel)
> -# else
> -# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel); nop
> -# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel); nop
> -# endif
> -# else
> -# error Unsupported library
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - lwz 10,MULTIPLE_THREADS_OFFSET(13); \
> - cmpwi 10,0
> -# endif
> -
> -#elif !defined __ASSEMBLER__
> -
> -# define SINGLE_THREAD_P (1)
> -# define NO_CANCELLATION 1
> -
> -#endif
> -
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
> new file mode 100644
> index 0000000..85af880
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
> @@ -0,0 +1,38 @@
> +/* Cancellable system call stubs. Linux/PowerPC version.
> + 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 <sysdep.h>
> +#include <tls.h>
> +#include <nptl/pthreadP.h>
> +
> +#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> +
> +# define SINGLE_THREAD_P \
> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0, 1)
> +
> +#else
> +
> +# define SINGLE_THREAD_P (1)
> +# define NO_CANCELLATION 1
> +
> +#endif
> +
> +#define RTLD_SINGLE_THREAD_P \
> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
> index b1e80bc..82763b7 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
> @@ -24,116 +24,17 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> -L(pseudo_cancel): \
> - cfi_startproc; \
> - STM_##args \
> - stm %r12,%r15,48(%r15); \
> - cfi_offset (%r15, -36); \
> - cfi_offset (%r14, -40); \
> - cfi_offset (%r13, -44); \
> - cfi_offset (%r12, -48); \
> - lr %r14,%r15; \
> - ahi %r15,-96; \
> - cfi_adjust_cfa_offset (96); \
> - st %r14,0(%r15); \
> - basr %r13,0; \
> -0: l %r1,1f-0b(%r13); \
> - bas %r14,0(%r1,%r13); \
> - lr %r0,%r2; \
> - LM_##args \
> - .if SYS_ify (syscall_name) < 256; \
> - svc SYS_ify (syscall_name); \
> - .else; \
> - lhi %r1,SYS_ify (syscall_name); \
> - svc 0; \
> - .endif; \
> - LR7_##args \
> - l %r1,2f-0b(%r13); \
> - lr %r12,%r2; \
> - lr %r2,%r0; \
> - bas %r14,0(%r1,%r13); \
> - lr %r2,%r12; \
> - lm %r12,%r15,48+96(%r15); \
> - cfi_endproc; \
> - j L(pseudo_check); \
> -1: .long CENABLE-0b; \
> -2: .long CDISABLE-0b; \
> -ENTRY(name) \
> - SINGLE_THREAD_P(%r1) \
> - jne L(pseudo_cancel); \
> -.type __##syscall_name##_nocancel,@function; \
> -.globl __##syscall_name##_nocancel; \
> -__##syscall_name##_nocancel: \
> - DO_CALL(syscall_name, args); \
> -L(pseudo_check): \
> - lhi %r4,-4095; \
> - clr %r2,%r4; \
> - jnl SYSCALL_ERROR_LABEL; \
> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> -L(pseudo_end):
> -
> -# if IS_IN (libpthread)
> -# define CENABLE __pthread_enable_asynccancel
> -# define CDISABLE __pthread_disable_asynccancel
> -# elif IS_IN (libc)
> -# define CENABLE __libc_enable_asynccancel
> -# define CDISABLE __libc_disable_asynccancel
> -# elif IS_IN (librt)
> -# define CENABLE __librt_enable_asynccancel
> -# define CDISABLE __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -
> -#define STM_0 /* Nothing */
> -#define STM_1 st %r2,8(%r15);
> -#define STM_2 stm %r2,%r3,8(%r15);
> -#define STM_3 stm %r2,%r4,8(%r15);
> -#define STM_4 stm %r2,%r5,8(%r15);
> -#define STM_5 stm %r2,%r5,8(%r15);
> -#define STM_6 stm %r2,%r7,8(%r15);
> -
> -#define LM_0 /* Nothing */
> -#define LM_1 l %r2,8+96(%r15);
> -#define LM_2 lm %r2,%r3,8+96(%r15);
> -#define LM_3 lm %r2,%r4,8+96(%r15);
> -#define LM_4 lm %r2,%r5,8+96(%r15);
> -#define LM_5 lm %r2,%r5,8+96(%r15);
> -#define LM_6 lm %r2,%r5,8+96(%r15); \
> - cfi_offset (%r7, -68); \
> - l %r7,96+96(%r15);
> -
> -#define LR7_0 /* Nothing */
> -#define LR7_1 /* Nothing */
> -#define LR7_2 /* Nothing */
> -#define LR7_3 /* Nothing */
> -#define LR7_4 /* Nothing */
> -#define LR7_5 /* Nothing */
> -#define LR7_6 l %r7,28+96(%r15); \
> - cfi_restore (%r7);
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - ear reg,%a0; \
> - icm reg,15,MULTIPLE_THREADS_OFFSET(reg);
> -# endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
> index 9b2c546..952d2af 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
> @@ -18,135 +18,36 @@
>
> #include <sysdep.h>
> #include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> +#include <nptl/pthreadP.h>
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> -L(pseudo_cancel): \
> - cfi_startproc; \
> - STM_##args \
> - stmg %r13,%r15,104(%r15); \
> - cfi_offset (%r15,-40); \
> - cfi_offset (%r14,-48); \
> - cfi_offset (%r13,-56); \
> - lgr %r14,%r15; \
> - aghi %r15,-160; \
> - cfi_adjust_cfa_offset (160); \
> - stg %r14,0(%r15); \
> - brasl %r14,CENABLE; \
> - lgr %r0,%r2; \
> - LM_##args \
> - .if SYS_ify (syscall_name) < 256; \
> - svc SYS_ify (syscall_name); \
> - .else; \
> - lghi %r1,SYS_ify (syscall_name); \
> - svc 0; \
> - .endif; \
> - LR7_##args \
> - lgr %r13,%r2; \
> - lgr %r2,%r0; \
> - brasl %r14,CDISABLE; \
> - lgr %r2,%r13; \
> - lmg %r13,%r15,104+160(%r15); \
> - cfi_endproc; \
> - j L(pseudo_check); \
> -ENTRY(name) \
> - SINGLE_THREAD_P \
> - jne L(pseudo_cancel); \
> -.type __##syscall_name##_nocancel,@function; \
> -.globl __##syscall_name##_nocancel; \
> -__##syscall_name##_nocancel: \
> - DO_CALL(syscall_name, args); \
> -L(pseudo_check): \
> - lghi %r4,-4095; \
> - clgr %r2,%r4; \
> - jgnl SYSCALL_ERROR_LABEL; \
> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> -L(pseudo_end):
> -
> # if IS_IN (libpthread)
> -# define CENABLE __pthread_enable_asynccancel
> -# define CDISABLE __pthread_disable_asynccancel
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> -# define CENABLE __libc_enable_asynccancel
> -# define CDISABLE __libc_disable_asynccancel
> # define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# define CENABLE __librt_enable_asynccancel
> -# define CDISABLE __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> # endif
>
> -#define STM_0 /* Nothing */
> -#define STM_1 stg %r2,16(%r15);
> -#define STM_2 stmg %r2,%r3,16(%r15);
> -#define STM_3 stmg %r2,%r4,16(%r15);
> -#define STM_4 stmg %r2,%r5,16(%r15);
> -#define STM_5 stmg %r2,%r5,16(%r15);
> -#define STM_6 stmg %r2,%r7,16(%r15);
> -
> -#define LM_0 /* Nothing */
> -#define LM_1 lg %r2,16+160(%r15);
> -#define LM_2 lmg %r2,%r3,16+160(%r15);
> -#define LM_3 lmg %r2,%r4,16+160(%r15);
> -#define LM_4 lmg %r2,%r5,16+160(%r15);
> -#define LM_5 lmg %r2,%r5,16+160(%r15);
> -#define LM_6 lmg %r2,%r5,16+160(%r15); \
> - cfi_offset (%r7, -104); \
> - lg %r7,160+160(%r15);
> -
> -#define LR7_0 /* Nothing */
> -#define LR7_1 /* Nothing */
> -#define LR7_2 /* Nothing */
> -#define LR7_3 /* Nothing */
> -#define LR7_4 /* Nothing */
> -#define LR7_5 /* Nothing */
> -#define LR7_6 lg %r7,56+160(%r15); \
> - cfi_restore (%r7);
> -
> # if IS_IN (libpthread) || IS_IN (libc)
> -# ifndef __ASSEMBLER__
> extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - larl %r1,__local_multiple_threads; \
> - icm %r0,15,0(%r1);
> -# endif
>
> # else
>
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - ear %r1,%a0; \
> - sllg %r1,%r1,32; \
> - ear %r1,%a1; \
> - icm %r1,15,MULTIPLE_THREADS_OFFSET(%r1);
> -# endif
>
> # endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
> index 5645cad..1ea501b 100644
> --- a/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
> @@ -23,147 +23,17 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -# define _IMM12 #-12
> -# define _IMM16 #-16
> -# define _IMP16 #16
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name); \
> - .Lpseudo_start: \
> - SINGLE_THREAD_P; \
> - bf .Lpseudo_cancel; \
> - .type __##syscall_name##_nocancel,@function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - DO_CALL (syscall_name, args); \
> - mov r0,r1; \
> - mov _IMM12,r2; \
> - shad r2,r1; \
> - not r1,r1; \
> - tst r1,r1; \
> - bt .Lsyscall_error; \
> - bra .Lpseudo_end; \
> - nop; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - .Lpseudo_cancel: \
> - sts.l pr,@-r15; \
> - cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (pr, 0); \
> - add _IMM16,r15; \
> - cfi_adjust_cfa_offset (16); \
> - SAVE_ARGS_##args; \
> - CENABLE; \
> - LOAD_ARGS_##args; \
> - add _IMP16,r15; \
> - cfi_adjust_cfa_offset (-16); \
> - lds.l @r15+,pr; \
> - cfi_adjust_cfa_offset (-4); \
> - cfi_restore (pr); \
> - DO_CALL(syscall_name, args); \
> - SYSCALL_INST_PAD; \
> - sts.l pr,@-r15; \
> - cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (pr, 0); \
> - mov.l r0,@-r15; \
> - cfi_adjust_cfa_offset (4); \
> - cfi_rel_offset (r0, 0); \
> - CDISABLE; \
> - mov.l @r15+,r0; \
> - cfi_adjust_cfa_offset (-4); \
> - cfi_restore (r0); \
> - lds.l @r15+,pr; \
> - cfi_adjust_cfa_offset (-4); \
> - cfi_restore (pr); \
> - mov r0,r1; \
> - mov _IMM12,r2; \
> - shad r2,r1; \
> - not r1,r1; \
> - tst r1,r1; \
> - bf .Lpseudo_end; \
> - .Lsyscall_error: \
> - SYSCALL_ERROR_HANDLER; \
> - .Lpseudo_end:
> -
> -# undef PSEUDO_END
> -# define PSEUDO_END(sym) \
> - END (sym)
> -
> -# define SAVE_ARGS_0 /* Nothing. */
> -# define SAVE_ARGS_1 SAVE_ARGS_0; mov.l r4,@(0,r15); cfi_offset (r4,-4)
> -# define SAVE_ARGS_2 SAVE_ARGS_1; mov.l r5,@(4,r15); cfi_offset (r5,-8)
> -# define SAVE_ARGS_3 SAVE_ARGS_2; mov.l r6,@(8,r15); cfi_offset (r6,-12)
> -# define SAVE_ARGS_4 SAVE_ARGS_3; mov.l r7,@(12,r15); cfi_offset (r7,-16)
> -# define SAVE_ARGS_5 SAVE_ARGS_4
> -# define SAVE_ARGS_6 SAVE_ARGS_5
> -
> -# define LOAD_ARGS_0 /* Nothing. */
> -# define LOAD_ARGS_1 LOAD_ARGS_0; mov.l @(0,r15),r4; cfi_restore (r4)
> -# define LOAD_ARGS_2 LOAD_ARGS_1; mov.l @(4,r15),r5; cfi_restore (r5)
> -# define LOAD_ARGS_3 LOAD_ARGS_2; mov.l @(8,r15),r6; cfi_restore (r6)
> -# define LOAD_ARGS_4 LOAD_ARGS_3; mov.l @(12,r15),r7; cfi_restore (r7)
> -# define LOAD_ARGS_5 LOAD_ARGS_4
> -# define LOAD_ARGS_6 LOAD_ARGS_5
> -
> -# if IS_IN (libpthread)
> -# define __local_enable_asynccancel __pthread_enable_asynccancel
> -# define __local_disable_asynccancel __pthread_disable_asynccancel
> -# elif IS_IN (libc)
> -# define __local_enable_asynccancel __libc_enable_asynccancel
> -# define __local_disable_asynccancel __libc_disable_asynccancel
> -# elif IS_IN (librt)
> -# define __local_enable_asynccancel __librt_enable_asynccancel
> -# define __local_disable_asynccancel __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -
> -# define CENABLE \
> - mov.l 1f,r0; \
> - bsrf r0; \
> - nop; \
> - 0: bra 2f; \
> - mov r0,r2; \
> - .align 2; \
> - 1: .long __local_enable_asynccancel - 0b; \
> - 2:
> -
> -# define CDISABLE \
> - mov.l 1f,r0; \
> - bsrf r0; \
> - mov r2,r4; \
> - 0: bra 2f; \
> - nop; \
> - .align 2; \
> - 1: .long __local_disable_asynccancel - 0b; \
> - 2:
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - stc gbr,r0; \
> - mov.w 0f,r1; \
> - sub r1,r0; \
> - mov.l @(MULTIPLE_THREADS_OFFSET,r0),r0; \
> - bra 1f; \
> - tst r0,r0; \
> - 0: .word TLS_PRE_TCB_SIZE; \
> - 1:
> -
> -# endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
> deleted file mode 100644
> index c513212..0000000
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
> +++ /dev/null
> @@ -1,111 +0,0 @@
> -/* Copyright (C) 2002-2017 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, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - .globl __syscall_error; \
> -ENTRY(name) \
> - ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
> - cmp %g1, 0; \
> - bne 1f; \
> -.type __##syscall_name##_nocancel,@function; \
> -.globl __##syscall_name##_nocancel; \
> -__##syscall_name##_nocancel: \
> - mov SYS_ify(syscall_name), %g1; \
> - ta 0x10; \
> - bcc 8f; \
> - mov %o7, %g1; \
> - call __syscall_error; \
> - mov %g1, %o7; \
> -8: jmpl %o7 + 8, %g0; \
> - nop; \
> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
> -1: save %sp, -96, %sp; \
> - cfi_def_cfa_register(%fp); \
> - cfi_window_save; \
> - cfi_register(%o7, %i7); \
> - CENABLE; \
> - nop; \
> - mov %o0, %l0; \
> - COPY_ARGS_##args \
> - mov SYS_ify(syscall_name), %g1; \
> - ta 0x10; \
> - bcc 1f; \
> - mov %o0, %l1; \
> - CDISABLE; \
> - mov %l0, %o0; \
> - call __syscall_error; \
> - mov %l1, %o0; \
> - b 2f; \
> - mov -1, %l1; \
> -1: CDISABLE; \
> - mov %l0, %o0; \
> -2: jmpl %i7 + 8, %g0; \
> - restore %g0, %l1, %o0;
> -
> -
> -# if IS_IN (libpthread)
> -# define CENABLE call __pthread_enable_asynccancel
> -# define CDISABLE call __pthread_disable_asynccancel
> -# elif IS_IN (libc)
> -# define CENABLE call __libc_enable_asynccancel
> -# define CDISABLE call __libc_disable_asynccancel
> -# elif IS_IN (librt)
> -# define CENABLE call __librt_enable_asynccancel
> -# define CDISABLE call __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -
> -#define COPY_ARGS_0 /* Nothing */
> -#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
> -#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
> -#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
> -#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
> -#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
> -#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
> -# endif
> -
> -#elif !defined __ASSEMBLER__
> -
> -# define SINGLE_THREAD_P (1)
> -# define NO_CANCELLATION 1
> -
> -#endif
> -
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
> deleted file mode 100644
> index 45fbd73..0000000
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -/* Copyright (C) 2002-2017 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, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - .globl __syscall_error; \
> -ENTRY(name) \
> - ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
> - brnz,pn %g1, 1f; \
> -.type __##syscall_name##_nocancel,@function; \
> -.globl __##syscall_name##_nocancel; \
> -__##syscall_name##_nocancel: \
> - mov SYS_ify(syscall_name), %g1; \
> - ta 0x6d; \
> - bcc,pt %xcc, 8f; \
> - mov %o7, %g1; \
> - call __syscall_error; \
> - mov %g1, %o7; \
> -8: jmpl %o7 + 8, %g0; \
> - nop; \
> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
> -1: save %sp, -192, %sp; \
> - cfi_def_cfa_register(%fp); \
> - cfi_window_save; \
> - cfi_register(%o7, %i7); \
> - CENABLE; \
> - nop; \
> - mov %o0, %l0; \
> - COPY_ARGS_##args \
> - mov SYS_ify(syscall_name), %g1; \
> - ta 0x6d; \
> - bcc,pt %xcc, 1f; \
> - mov %o0, %l1; \
> - CDISABLE; \
> - mov %l0, %o0; \
> - call __syscall_error; \
> - mov %l1, %o0; \
> - ba,pt %xcc, 2f; \
> - mov -1, %l1; \
> -1: CDISABLE; \
> - mov %l0, %o0; \
> -2: jmpl %i7 + 8, %g0; \
> - restore %g0, %l1, %o0;
> -
> -# if IS_IN (libpthread)
> -# define CENABLE call __pthread_enable_asynccancel
> -# define CDISABLE call __pthread_disable_asynccancel
> -# elif IS_IN (libc)
> -# define CENABLE call __libc_enable_asynccancel
> -# define CDISABLE call __libc_disable_asynccancel
> -# elif IS_IN (librt)
> -# define CENABLE call __librt_enable_asynccancel
> -# define CDISABLE call __librt_disable_asynccancel
> -# else
> -# error Unsupported library
> -# endif
> -
> -#define COPY_ARGS_0 /* Nothing */
> -#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
> -#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
> -#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
> -#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
> -#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
> -#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
> -# endif
> -
> -#elif !defined __ASSEMBLER__
> -
> -# define SINGLE_THREAD_P (1)
> -# define NO_CANCELLATION 1
> -
> -#endif
> -
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
> new file mode 100644
> index 0000000..61bfa33
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
> @@ -0,0 +1,38 @@
> +/* Copyright (C) 2002-2015 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, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <sysdep.h>
> +#include <tls.h>
> +#include <nptl/pthreadP.h>
> +
> +#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> +
> +# define SINGLE_THREAD_P \
> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0, 1)
> +
> +#else
> +
> +# define SINGLE_THREAD_P (1)
> +# define NO_CANCELLATION 1
> +
> +#endif
> +
> +#define RTLD_SINGLE_THREAD_P \
> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h b/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
> index 092a90c..c8994db 100644
> --- a/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
> @@ -18,137 +18,22 @@
>
> #include <sysdep.h>
> #include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> +#include <nptl/pthreadP.h>
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -/* Allow hacking in some extra code if desired. */
> -#ifndef PSEUDO_EXTRA
> -#define PSEUDO_EXTRA
> -#endif
> -
> -#undef PSEUDO
> -#define PSEUDO(name, syscall_name, args) \
> - ENTRY(__##syscall_name##_nocancel); \
> - PSEUDO_EXTRA \
> - moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
> - swint1; \
> - BNEZ r1, 0f; \
> - jrp lr; \
> - END(__##syscall_name##_nocancel); \
> - ENTRY (name) \
> - SINGLE_THREAD_P(r11); \
> - BEQZ r11, L(pseudo_cancel); \
> - PSEUDO_EXTRA \
> - moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
> - swint1; \
> - BNEZ r1, 0f; \
> - jrp lr; \
> - L(pseudo_cancel): \
> - { \
> - move r11, sp; \
> - ST sp, lr; \
> - ADDI_PTR sp, sp, -STKSPACE; \
> - }; \
> - cfi_offset (lr, 0); \
> - cfi_def_cfa_offset (STKSPACE); \
> - { \
> - ADDI_PTR r12, sp, REGSIZE; \
> - ADDI_PTR r13, sp, 2 * REGSIZE; /* set up for PUSHARGS_0 */ \
> - }; \
> - ST r12, r11; \
> - PUSHARGS_##args /* save syscall args */ \
> - CENABLE; \
> - ADDI_PTR r12, sp, 10 * REGSIZE; \
> - { \
> - ST r12, r0; /* save mask */ \
> - ADDI_PTR r13, sp, 2 * REGSIZE; /* set up for POPARGS_0 */ \
> - }; \
> - POPARGS_##args /* restore syscall args */ \
> - PSEUDO_EXTRA \
> - moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
> - swint1; \
> - ADDI_PTR r12, sp, 12 * REGSIZE; \
> - { \
> - ST r12, r1; /* save syscall result */ \
> - ADDI_PTR r12, sp, 11 * REGSIZE; \
> - }; \
> - { \
> - ST r12, r0; \
> - ADDI_PTR r13, sp, 10 * REGSIZE; \
> - }; \
> - LD r0, r13; /* pass mask as arg1 */ \
> - CDISABLE; \
> - { \
> - ADDI_PTR lr, sp, STKSPACE; \
> - ADDI_PTR r0, sp, 11 * REGSIZE; \
> - }; \
> - { \
> - LD r0, r0; \
> - ADDI_PTR r1, sp, 12 * REGSIZE; \
> - }; \
> - LD r1, r1; \
> - { \
> - LD lr, lr; \
> - ADDI_PTR sp, sp, STKSPACE; \
> - }; \
> - cfi_def_cfa_offset (0); \
> - BNEZ r1, 0f
> -
> -# define PUSHARGS_0 /* nothing to do */
> -# define PUSHARGS_1 PUSHARGS_0 { ADDI_PTR r14, sp, 3 * REGSIZE; ST r13, r0 };
> -# define PUSHARGS_2 PUSHARGS_1 { ADDI_PTR r13, sp, 4 * REGSIZE; ST r14, r1 };
> -# define PUSHARGS_3 PUSHARGS_2 { ADDI_PTR r14, sp, 5 * REGSIZE; ST r13, r2 };
> -# define PUSHARGS_4 PUSHARGS_3 { ADDI_PTR r13, sp, 6 * REGSIZE; ST r14, r3 };
> -# define PUSHARGS_5 PUSHARGS_4 { ADDI_PTR r14, sp, 7 * REGSIZE; ST r13, r4 };
> -# define PUSHARGS_6 PUSHARGS_5 { ADDI_PTR r13, sp, 8 * REGSIZE; ST r14, r5 };
> -# define PUSHARGS_7 PUSHARGS_6 { ADDI_PTR r14, sp, 9 * REGSIZE; ST r13, r6 };
> -
> -# define POPARGS_0 /* nothing to do */
> -# define POPARGS_1 POPARGS_0 { ADDI_PTR r14, sp, 3 * REGSIZE; LD r0, r13 };
> -# define POPARGS_2 POPARGS_1 { ADDI_PTR r13, sp, 4 * REGSIZE; LD r1, r14 };
> -# define POPARGS_3 POPARGS_2 { ADDI_PTR r14, sp, 5 * REGSIZE; LD r2, r13 };
> -# define POPARGS_4 POPARGS_3 { ADDI_PTR r13, sp, 6 * REGSIZE; LD r3, r14 };
> -# define POPARGS_5 POPARGS_4 { ADDI_PTR r14, sp, 7 * REGSIZE; LD r4, r13 };
> -# define POPARGS_6 POPARGS_5 { ADDI_PTR r13, sp, 8 * REGSIZE; LD r5, r14 };
> -# define POPARGS_7 POPARGS_6 { ADDI_PTR r14, sp, 9 * REGSIZE; LD r6, r13 };
> -
> -# define STKSPACE (13 * REGSIZE)
> -
> -# if IS_IN (libpthread)
> -# define CENABLE jal __pthread_enable_asynccancel
> -# define CDISABLE jal __pthread_disable_asynccancel
> -# elif IS_IN (librt)
> -# define CENABLE jal __librt_enable_asynccancel
> -# define CDISABLE jal __librt_disable_asynccancel
> -# else
> -# define CENABLE jal __libc_enable_asynccancel
> -# define CDISABLE jal __libc_disable_asynccancel
> -# endif
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) \
> == 0, 1)
> -# else
> -# define SINGLE_THREAD_P(reg) \
> - ADDLI_PTR reg, tp, MULTIPLE_THREADS_OFFSET; \
> - LD reg, reg; \
> - CMPEQI reg, reg, 0
> -#endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P 1
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
> index 6598010..0979bde 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
> @@ -24,86 +24,32 @@
>
> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>
> -/* The code to disable cancellation depends on the fact that the called
> - functions are special. They don't modify registers other than %rax
> - and %r11 if they return. Therefore we don't have to preserve other
> - registers around these calls. */
> -# undef PSEUDO
> -# define PSEUDO(name, syscall_name, args) \
> - .text; \
> - ENTRY (name) \
> - SINGLE_THREAD_P; \
> - jne L(pseudo_cancel); \
> - .type __##syscall_name##_nocancel,@function; \
> - .globl __##syscall_name##_nocancel; \
> - __##syscall_name##_nocancel: \
> - DO_CALL (syscall_name, args); \
> - cmpq $-4095, %rax; \
> - jae SYSCALL_ERROR_LABEL; \
> - ret; \
> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> - L(pseudo_cancel): \
> - /* We always have to align the stack before calling a function. */ \
> - subq $8, %rsp; cfi_adjust_cfa_offset (8); \
> - CENABLE \
> - /* The return value from CENABLE is argument for CDISABLE. */ \
> - movq %rax, (%rsp); \
> - DO_CALL (syscall_name, args); \
> - movq (%rsp), %rdi; \
> - /* Save %rax since it's the error code from the syscall. */ \
> - movq %rax, %rdx; \
> - CDISABLE \
> - movq %rdx, %rax; \
> - addq $8,%rsp; cfi_adjust_cfa_offset (-8); \
> - cmpq $-4095, %rax; \
> - jae SYSCALL_ERROR_LABEL
> -
> -
> # if IS_IN (libpthread)
> -# define CENABLE call __pthread_enable_asynccancel;
> -# define CDISABLE call __pthread_disable_asynccancel;
> # define __local_multiple_threads __pthread_multiple_threads
> # elif IS_IN (libc)
> -# define CENABLE call __libc_enable_asynccancel;
> -# define CDISABLE call __libc_disable_asynccancel;
> # define __local_multiple_threads __libc_multiple_threads
> # elif IS_IN (librt)
> -# define CENABLE call __librt_enable_asynccancel;
> -# define CDISABLE call __librt_disable_asynccancel;
> # else
> # error Unsupported library
> # endif
>
> # if IS_IN (libpthread) || IS_IN (libc)
> -# ifndef __ASSEMBLER__
> extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P cmpl $0, __local_multiple_threads(%rip)
> -# endif
> -
> # else
> -
> -# ifndef __ASSEMBLER__
> -# define SINGLE_THREAD_P \
> +# define SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -# else
> -# define SINGLE_THREAD_P cmpl $0, %fs:MULTIPLE_THREADS_OFFSET
> -# endif
> -
> # endif
>
> -#elif !defined __ASSEMBLER__
> +#else
>
> # define SINGLE_THREAD_P (1)
> # define NO_CANCELLATION 1
>
> #endif
>
> -#ifndef __ASSEMBLER__
> -# define RTLD_SINGLE_THREAD_P \
> +#define RTLD_SINGLE_THREAD_P \
> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> header.multiple_threads) == 0, 1)
> -#endif
>
I pushed the below just some minor cleanups:
* __builtin_expect replaced by __glibc_likely;
* Adjusted comment in syscall-template.S about cancellable syscall;
* Fixed new files description and dates.
I also updated the syscall wiki [1] to reflect current code convention
and examples.
[1] https://sourceware.org/glibc/wiki/SyscallWrappers
On 23/08/2017 14:23, Adhemerval Zanella wrote:
> Now with both 78ca091cdd2 and b70b6026a05 pushed upstream no linux port
> actually uess the sysdep-cancel.h assembly macro for syscall generation,
> so it should be safe to remove all their definition and just define
> cancellable syscalls using SYSCALL_CANCEL C macro.
>
> I have tested this patch with build-many-glibc.py for the all affected
> ports and it shows not build failures. I take this is an extensive patch,
> but it a cleanup one that aims to code simplicity.
>
> I plan to commit this shortly if no one opposes it.
>
> On 03/08/2017 10:11, Adhemerval Zanella wrote:
>> This patch removes the cancellation mark from the auto-generation syscall
>> script. Now all the cancellable syscalls are done throught C code using
>> the SYSCALL_CANCEL macro. It simplifies the assembly required to each
>> architecture port, since the SYSCALL_CANCEL uses the already defined
>> INLINE_SYSCALL macros, and allows a more straigh fix on cancellation
>> machanism (since no more specific assembly fixes will be required).
>>
>> Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
>> aarch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.
>>
>> * sysdeps/unix/make-syscalls.sh: Remove cancellable tagging for
>> syscall definitions.
>> * sysdeps/unix/syscall-template.S (SYSCALL_CANCELLABLE): Remove
>> definition.
>> * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (__local_enable_asynccancel): Likewise.
>> [IS_IN (libpthread)] (__local_disable_asynccancel): Likewise.
>> [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
>> [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
>> [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
>> [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
>> (CENABLE): Likewise.
>> (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Remove
>> defintion.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h (PSEUDO):
>> Remove definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Remove file.
>> * sysdeps/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
>> * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: New file.
>> * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Remove file.
>> * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
>> * sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: New file.
>> * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Remove
>> definition.
>> (PSEUDO_END): Likewise.
>> [IS_IN (libpthread)] (CENABLE): Likewise.
>> [IS_IN (libpthread)] (CDISABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (libc)] (CENABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [IS_IN (librt)] (CDISABLE): Likewise.
>> [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> ---
>> ChangeLog | 173 ++++++++++++++
>> sysdeps/unix/make-syscalls.sh | 4 -
>> sysdeps/unix/syscall-template.S | 7 +-
>> sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h | 87 +------
>> sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h | 131 +----------
>> sysdeps/unix/sysv/linux/arm/sysdep-cancel.h | 197 +---------------
>> sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h | 225 +------------------
>> sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 119 +---------
>> sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h | 194 +---------------
>> sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h | 108 +--------
>> sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h | 116 +---------
>> .../unix/sysv/linux/mips/mips64/sysdep-cancel.h | 249 ---------------------
>> sysdeps/unix/sysv/linux/mips/sysdep-cancel.h | 159 +------------
>> sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h | 110 +--------
>> .../sysv/linux/powerpc/powerpc32/sysdep-cancel.h | 118 ----------
>> .../sysv/linux/powerpc/powerpc64/sysdep-cancel.h | 147 ------------
>> sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h | 38 ++++
>> .../unix/sysv/linux/s390/s390-32/sysdep-cancel.h | 105 +--------
>> .../unix/sysv/linux/s390/s390-64/sysdep-cancel.h | 109 +--------
>> sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 136 +----------
>> .../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h | 111 ---------
>> .../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h | 109 ---------
>> sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 38 ++++
>> sysdeps/unix/sysv/linux/tile/sysdep-cancel.h | 123 +---------
>> sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h | 62 +----
>> 25 files changed, 305 insertions(+), 2670 deletions(-)
>> delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
>> delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
>> delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
>> create mode 100644 sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
>> delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
>> delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
>> create mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
>>
>> diff --git a/ChangeLog b/ChangeLog
>> index d0a78a1..a84bd55 100644
>> --- a/ChangeLog
>> +++ b/ChangeLog
>> @@ -1,5 +1,178 @@
>> 2017-08-02 Adhemerval Zanella <adhemerval.zanella@linaro.org>
>>
>> + * sysdeps/unix/make-syscalls.sh: Remove cancellable tagging for
>> + syscall definitions.
>> + * sysdeps/unix/syscall-template.S (SYSCALL_CANCELLABLE): Remove
>> + definition.
>> + * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (__local_enable_asynccancel): Likewise.
>> + [IS_IN (libpthread)] (__local_disable_asynccancel): Likewise.
>> + [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
>> + [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
>> + [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
>> + [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
>> + (CENABLE): Likewise.
>> + (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Remove
>> + defintion.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h (PSEUDO):
>> + Remove definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Remove file.
>> + * sysdeps/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
>> + * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: New file.
>> + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Remove file.
>> + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
>> + * sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: New file.
>> + * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> + * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Remove
>> + definition.
>> + (PSEUDO_END): Likewise.
>> + [IS_IN (libpthread)] (CENABLE): Likewise.
>> + [IS_IN (libpthread)] (CDISABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (libc)] (CENABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [IS_IN (librt)] (CDISABLE): Likewise.
>> + [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
>> +
>> * sysdeps/unix/sysv/linux/x86_64/syscalls.list (pread64): Remove.
>> (preadv64): Likewise.
>> (pwrite64(: Likewise.
>> diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
>> index 123553c..042cfac 100644
>> --- a/sysdeps/unix/make-syscalls.sh
>> +++ b/sysdeps/unix/make-syscalls.sh
>> @@ -12,7 +12,6 @@
>> #
>> # Syscall Signature Prefixes:
>> #
>> -# C: cancellable (i.e., this syscall is a cancellation point)
>> # E: errno and return value are not set by the call
>> # V: errno is not set, but errno or zero (success) is returned from the call
>> #
>> @@ -171,11 +170,9 @@ while read file srcfile caller syscall args strong weak; do
>> ;;
>> esac
>>
>> - cancellable=0
>> noerrno=0
>> errval=0
>> case $args in
>> - C*) cancellable=1; args=`echo $args | sed 's/C:\?//'`;;
>> E*) noerrno=1; args=`echo $args | sed 's/E:\?//'`;;
>> V*) errval=1; args=`echo $args | sed 's/V:\?//'`;;
>> esac
>> @@ -258,7 +255,6 @@ while read file srcfile caller syscall args strong weak; do
>> (echo '#define SYSCALL_NAME $syscall'; \\
>> echo '#define SYSCALL_NARGS $nargs'; \\
>> echo '#define SYSCALL_SYMBOL $strong'; \\
>> - echo '#define SYSCALL_CANCELLABLE $cancellable'; \\
>> echo '#define SYSCALL_NOERRNO $noerrno'; \\
>> echo '#define SYSCALL_ERRVAL $errval'; \\
>> echo '#include <syscall-template.S>'; \\"
>> diff --git a/sysdeps/unix/syscall-template.S b/sysdeps/unix/syscall-template.S
>> index 4993ff5..d4584a9 100644
>> --- a/sysdeps/unix/syscall-template.S
>> +++ b/sysdeps/unix/syscall-template.S
>> @@ -27,7 +27,6 @@
>> SYSCALL_NAME syscall name
>> SYSCALL_NARGS number of arguments this call takes
>> SYSCALL_SYMBOL primary symbol name
>> - SYSCALL_CANCELLABLE 1 if the call is a cancelation point
>> SYSCALL_NOERRNO 1 to define a no-errno version (see below)
>> SYSCALL_ERRVAL 1 to define an error-value version (see below)
>>
>> @@ -41,11 +40,7 @@
>> instructions long and the untrained eye might not distinguish them from
>> some compiled code that inexplicably lacks source line information. */
>>
>> -#if SYSCALL_CANCELLABLE
>> -# include <sysdep-cancel.h>
>> -#else
>> -# include <sysdep.h>
>> -#endif
>> +#include <sysdep.h>
>>
>> /* This indirection is needed so that SYMBOL gets macro-expanded. */
>> #define syscall_hidden_def(SYMBOL) hidden_def (SYMBOL)
>> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
>> index 4be2259..d39b6a2 100644
>> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
>> @@ -24,102 +24,23 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .section ".text"; \
>> -ENTRY (__##syscall_name##_nocancel); \
>> -.Lpseudo_nocancel: \
>> - DO_CALL (syscall_name, args); \
>> -.Lpseudo_finish: \
>> - cmn x0, 4095; \
>> - b.cs .Lsyscall_error; \
>> - .subsection 2; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> -ENTRY (name); \
>> - SINGLE_THREAD_P(16); \
>> - cbz w16, .Lpseudo_nocancel; \
>> - /* Setup common stack frame no matter the number of args. \
>> - Also save the first arg, since it's basically free. */ \
>> - stp x30, x0, [sp, -64]!; \
>> - cfi_adjust_cfa_offset (64); \
>> - cfi_rel_offset (x30, 0); \
>> - DOCARGS_##args; /* save syscall args around CENABLE. */ \
>> - CENABLE; \
>> - mov x16, x0; /* save mask around syscall. */ \
>> - UNDOCARGS_##args; /* restore syscall args. */ \
>> - DO_CALL (syscall_name, args); \
>> - str x0, [sp, 8]; /* save result around CDISABLE. */ \
>> - mov x0, x16; /* restore mask for CDISABLE. */ \
>> - CDISABLE; \
>> - /* Break down the stack frame, restoring result at once. */ \
>> - ldp x30, x0, [sp], 64; \
>> - cfi_adjust_cfa_offset (-64); \
>> - cfi_restore (x30); \
>> - b .Lpseudo_finish; \
>> - cfi_endproc; \
>> - .size name, .-name; \
>> - .previous
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(name) \
>> - SYSCALL_ERROR_HANDLER; \
>> - cfi_endproc
>> -
>> -# define DOCARGS_0
>> -# define DOCARGS_1
>> -# define DOCARGS_2 str x1, [sp, 16]
>> -# define DOCARGS_3 stp x1, x2, [sp, 16]
>> -# define DOCARGS_4 DOCARGS_3; str x3, [sp, 32]
>> -# define DOCARGS_5 DOCARGS_3; stp x3, x4, [sp, 32]
>> -# define DOCARGS_6 DOCARGS_5; str x5, [sp, 48]
>> -
>> -# define UNDOCARGS_0
>> -# define UNDOCARGS_1 ldr x0, [sp, 8]
>> -# define UNDOCARGS_2 ldp x0, x1, [sp, 8]
>> -# define UNDOCARGS_3 UNDOCARGS_1; ldp x1, x2, [sp, 16]
>> -# define UNDOCARGS_4 UNDOCARGS_2; ldp x2, x3, [sp, 24]
>> -# define UNDOCARGS_5 UNDOCARGS_3; ldp x3, x4, [sp, 32]
>> -# define UNDOCARGS_6 UNDOCARGS_4; ldp x4, x5, [sp, 40]
>> -
>> # if IS_IN (libpthread)
>> -# define CENABLE bl __pthread_enable_asynccancel
>> -# define CDISABLE bl __pthread_disable_asynccancel
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> -# define CENABLE bl __libc_enable_asynccancel
>> -# define CDISABLE bl __libc_disable_asynccancel
>> # define __local_multiple_threads __libc_multiple_threads
>> -# elif IS_IN (librt)
>> -# define CENABLE bl __librt_enable_asynccancel
>> -# define CDISABLE bl __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> # endif
>>
>> # if IS_IN (libpthread) || IS_IN (libc)
>> -# ifndef __ASSEMBLER__
>> extern int __local_multiple_threads attribute_hidden;
>> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(R) \
>> - adrp x##R, __local_multiple_threads; \
>> - ldr w##R, [x##R, :lo12:__local_multiple_threads]
>> -# endif
>> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
>> # else
>> /* There is no __local_multiple_threads for librt, so use the TCB. */
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(R) \
>> - mrs x##R, tpidr_el0; \
>> - sub x##R, x##R, PTHREAD_SIZEOF; \
>> - ldr w##R, [x##R, PTHREAD_MULTIPLE_THREADS_OFFSET]
>> -# endif
>> # endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> /* For rtld, et cetera. */
>> # define SINGLE_THREAD_P 1
>> @@ -127,8 +48,6 @@ extern int __local_multiple_threads attribute_hidden;
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> # define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h b/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
>> index 66d6962..366cf31 100644
>> --- a/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
>> @@ -17,147 +17,24 @@
>>
>> #include <sysdep.h>
>> #include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> +#include <nptl/pthreadP.h>
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -/* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END
>> - besides "ret". */
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .globl __##syscall_name##_nocancel; \
>> - .type __##syscall_name##_nocancel, @function; \
>> - .usepv __##syscall_name##_nocancel, std; \
>> - .align 4; \
>> - cfi_startproc; \
>> -__LABEL(__##syscall_name##_nocancel) \
>> - ldgp gp, 0(pv); \
>> - PSEUDO_PROF; \
>> -__LABEL($pseudo_nocancel) \
>> - PSEUDO_PREPARE_ARGS; \
>> - lda v0, SYS_ify(syscall_name); \
>> - call_pal PAL_callsys; \
>> - bne a3, SYSCALL_ERROR_LABEL; \
>> -__LABEL($pseudo_ret) \
>> - .subsection 2; \
>> - .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
>> - .globl name; \
>> - .type name, @function; \
>> - .usepv name, std; \
>> - .align 4; \
>> - cfi_startproc; \
>> -__LABEL(name) \
>> - ldgp gp, 0(pv); \
>> - PSEUDO_PROF; \
>> - SINGLE_THREAD_P(t0); \
>> - beq t0, $pseudo_nocancel; \
>> - subq sp, 64, sp; \
>> - cfi_def_cfa_offset(64); \
>> - stq ra, 0(sp); \
>> - cfi_offset(ra, -64); \
>> - SAVE_ARGS_##args; \
>> - CENABLE; \
>> - LOAD_ARGS_##args; \
>> - /* Save the CENABLE return value in RA. That register \
>> - is preserved across syscall and the real return \
>> - address is saved on the stack. */ \
>> - mov v0, ra; \
>> - lda v0, SYS_ify(syscall_name); \
>> - call_pal PAL_callsys; \
>> - stq v0, 8(sp); \
>> - mov ra, a0; \
>> - bne a3, $multi_error; \
>> - CDISABLE; \
>> - ldq ra, 0(sp); \
>> - ldq v0, 8(sp); \
>> - addq sp, 64, sp; \
>> - cfi_remember_state; \
>> - cfi_restore(ra); \
>> - cfi_def_cfa_offset(0); \
>> - ret; \
>> - cfi_restore_state; \
>> -__LABEL($multi_error) \
>> - CDISABLE; \
>> - ldq ra, 0(sp); \
>> - ldq v0, 8(sp); \
>> - addq sp, 64, sp; \
>> - cfi_restore(ra); \
>> - cfi_def_cfa_offset(0); \
>> - SYSCALL_ERROR_FALLTHRU; \
>> - SYSCALL_ERROR_HANDLER; \
>> - cfi_endproc; \
>> - .previous
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(sym) \
>> - cfi_endproc; \
>> - .subsection 2; \
>> - .size sym, .-sym
>> -
>> -# define SAVE_ARGS_0 /* Nothing. */
>> -# define SAVE_ARGS_1 SAVE_ARGS_0; stq a0, 8(sp)
>> -# define SAVE_ARGS_2 SAVE_ARGS_1; stq a1, 16(sp)
>> -# define SAVE_ARGS_3 SAVE_ARGS_2; stq a2, 24(sp)
>> -# define SAVE_ARGS_4 SAVE_ARGS_3; stq a3, 32(sp)
>> -# define SAVE_ARGS_5 SAVE_ARGS_4; stq a4, 40(sp)
>> -# define SAVE_ARGS_6 SAVE_ARGS_5; stq a5, 48(sp)
>> -
>> -# define LOAD_ARGS_0 /* Nothing. */
>> -# define LOAD_ARGS_1 LOAD_ARGS_0; ldq a0, 8(sp)
>> -# define LOAD_ARGS_2 LOAD_ARGS_1; ldq a1, 16(sp)
>> -# define LOAD_ARGS_3 LOAD_ARGS_2; ldq a2, 24(sp)
>> -# define LOAD_ARGS_4 LOAD_ARGS_3; ldq a3, 32(sp)
>> -# define LOAD_ARGS_5 LOAD_ARGS_4; ldq a4, 40(sp)
>> -# define LOAD_ARGS_6 LOAD_ARGS_5; ldq a5, 48(sp)
>> -
>> # if IS_IN (libpthread)
>> -# define __local_enable_asynccancel __pthread_enable_asynccancel
>> -# define __local_disable_asynccancel __pthread_disable_asynccancel
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> -# define __local_enable_asynccancel __libc_enable_asynccancel
>> -# define __local_disable_asynccancel __libc_disable_asynccancel
>> # define __local_multiple_threads __libc_multiple_threads
>> -# elif IS_IN (librt)
>> -# define __local_enable_asynccancel __librt_enable_asynccancel
>> -# define __local_disable_asynccancel __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# ifdef PIC
>> -# define CENABLE bsr ra, __local_enable_asynccancel !samegp
>> -# define CDISABLE bsr ra, __local_disable_asynccancel !samegp
>> -# else
>> -# define CENABLE jsr ra, __local_enable_asynccancel; ldgp ra, 0(gp)
>> -# define CDISABLE jsr ra, __local_disable_asynccancel; ldgp ra, 0(gp)
>> # endif
>>
>> # if IS_IN (libpthread) || IS_IN (libc)
>> -# ifndef __ASSEMBLER__
>> extern int __local_multiple_threads attribute_hidden;
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (__local_multiple_threads == 0, 1)
>> -# elif defined(PIC)
>> -# define SINGLE_THREAD_P(reg) ldl reg, __local_multiple_threads(gp) !gprel
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - ldah reg, __local_multiple_threads(gp) !gprelhigh; \
>> - ldl reg, __local_multiple_threads(reg) !gprellow
>> -# endif
>> # else
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - call_pal PAL_rduniq; \
>> - ldl reg, MULTIPLE_THREADS_OFFSET($0)
>> -# endif
>> # endif
>>
>> #else
>> @@ -167,8 +44,6 @@ extern int __local_multiple_threads attribute_hidden;
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> # define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h b/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
>> index de12acf..738e749 100644
>> --- a/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
>> @@ -23,210 +23,23 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -/* NOTE: We do mark syscalls with unwind annotations, for the benefit of
>> - cancellation; but they're really only accurate at the point of the
>> - syscall. The ARM unwind directives are not rich enough without adding
>> - a custom personality function. */
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - ENTRY (__##syscall_name##_nocancel); \
>> - CFI_SECTIONS; \
>> - DO_CALL (syscall_name, args); \
>> - cmn r0, $4096; \
>> - PSEUDO_RET; \
>> - END (__##syscall_name##_nocancel); \
>> - ENTRY (name); \
>> - SINGLE_THREAD_P; \
>> - DOARGS_##args; \
>> - bne .Lpseudo_cancel; \
>> - cfi_remember_state; \
>> - ldr r7, =SYS_ify (syscall_name); \
>> - swi 0x0; \
>> - UNDOARGS_##args; \
>> - cmn r0, $4096; \
>> - PSEUDO_RET; \
>> - cfi_restore_state; \
>> - .Lpseudo_cancel: \
>> - .fnstart; /* matched by the .fnend in UNDOARGS below. */ \
>> - DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \
>> - CENABLE; \
>> - mov ip, r0; /* put mask in safe place. */ \
>> - UNDOCARGS_##args; /* restore syscall args. */ \
>> - ldr r7, =SYS_ify (syscall_name); \
>> - swi 0x0; /* do the call. */ \
>> - mov r7, r0; /* save syscall return value. */ \
>> - mov r0, ip; /* get mask back. */ \
>> - CDISABLE; \
>> - mov r0, r7; /* retrieve return value. */ \
>> - RESTORE_LR_##args; \
>> - UNDOARGS_##args; \
>> - cmn r0, $4096
>> -
>> -/* DOARGS pushes eight bytes on the stack for five arguments, twelve bytes for
>> - six arguments, and four bytes for fewer. In order to preserve doubleword
>> - alignment, sometimes we must save an extra register. */
>> -
>> -# define RESTART_UNWIND \
>> - .fnend; \
>> - .fnstart; \
>> - .save {r7}; \
>> - .save {lr}
>> -
>> -# define DOCARGS_0 \
>> - .save {r7}; \
>> - push {lr}; \
>> - cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (lr, 0); \
>> - .save {lr}
>> -# define UNDOCARGS_0
>> -# define RESTORE_LR_0 \
>> - pop {lr}; \
>> - cfi_adjust_cfa_offset (-4); \
>> - cfi_restore (lr)
>> -
>> -# define DOCARGS_1 \
>> - .save {r7}; \
>> - push {r0, r1, lr}; \
>> - cfi_adjust_cfa_offset (12); \
>> - cfi_rel_offset (lr, 8); \
>> - .save {lr}; \
>> - .pad #8
>> -# define UNDOCARGS_1 \
>> - ldr r0, [sp], #8; \
>> - cfi_adjust_cfa_offset (-8); \
>> - RESTART_UNWIND
>> -# define RESTORE_LR_1 \
>> - RESTORE_LR_0
>> -
>> -# define DOCARGS_2 \
>> - .save {r7}; \
>> - push {r0, r1, lr}; \
>> - cfi_adjust_cfa_offset (12); \
>> - cfi_rel_offset (lr, 8); \
>> - .save {lr}; \
>> - .pad #8
>> -# define UNDOCARGS_2 \
>> - pop {r0, r1}; \
>> - cfi_adjust_cfa_offset (-8); \
>> - RESTART_UNWIND
>> -# define RESTORE_LR_2 \
>> - RESTORE_LR_0
>> -
>> -# define DOCARGS_3 \
>> - .save {r7}; \
>> - push {r0, r1, r2, r3, lr}; \
>> - cfi_adjust_cfa_offset (20); \
>> - cfi_rel_offset (lr, 16); \
>> - .save {lr}; \
>> - .pad #16
>> -# define UNDOCARGS_3 \
>> - pop {r0, r1, r2, r3}; \
>> - cfi_adjust_cfa_offset (-16); \
>> - RESTART_UNWIND
>> -# define RESTORE_LR_3 \
>> - RESTORE_LR_0
>> -
>> -# define DOCARGS_4 \
>> - .save {r7}; \
>> - push {r0, r1, r2, r3, lr}; \
>> - cfi_adjust_cfa_offset (20); \
>> - cfi_rel_offset (lr, 16); \
>> - .save {lr}; \
>> - .pad #16
>> -# define UNDOCARGS_4 \
>> - pop {r0, r1, r2, r3}; \
>> - cfi_adjust_cfa_offset (-16); \
>> - RESTART_UNWIND
>> -# define RESTORE_LR_4 \
>> - RESTORE_LR_0
>> -
>> -/* r4 is only stmfd'ed for correct stack alignment. */
>> -# define DOCARGS_5 \
>> - .save {r4, r7}; \
>> - push {r0, r1, r2, r3, r4, lr}; \
>> - cfi_adjust_cfa_offset (24); \
>> - cfi_rel_offset (lr, 20); \
>> - .save {lr}; \
>> - .pad #20
>> -# define UNDOCARGS_5 \
>> - pop {r0, r1, r2, r3}; \
>> - cfi_adjust_cfa_offset (-16); \
>> - .fnend; \
>> - .fnstart; \
>> - .save {r4, r7}; \
>> - .save {lr}; \
>> - .pad #4
>> -# define RESTORE_LR_5 \
>> - pop {r4, lr}; \
>> - cfi_adjust_cfa_offset (-8); \
>> - /* r4 will be marked as restored later. */ \
>> - cfi_restore (lr)
>> -
>> -# define DOCARGS_6 \
>> - .save {r4, r5, r7}; \
>> - push {r0, r1, r2, r3, lr}; \
>> - cfi_adjust_cfa_offset (20); \
>> - cfi_rel_offset (lr, 16); \
>> - .save {lr}; \
>> - .pad #16
>> -# define UNDOCARGS_6 \
>> - pop {r0, r1, r2, r3}; \
>> - cfi_adjust_cfa_offset (-16); \
>> - .fnend; \
>> - .fnstart; \
>> - .save {r4, r5, r7}; \
>> - .save {lr};
>> -# define RESTORE_LR_6 \
>> - RESTORE_LR_0
>> -
>> # if IS_IN (libpthread)
>> -# define CENABLE bl PLTJMP(__pthread_enable_asynccancel)
>> -# define CDISABLE bl PLTJMP(__pthread_disable_asynccancel)
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> -# define CENABLE bl PLTJMP(__libc_enable_asynccancel)
>> -# define CDISABLE bl PLTJMP(__libc_disable_asynccancel)
>> # define __local_multiple_threads __libc_multiple_threads
>> -# elif IS_IN (librt)
>> -# define CENABLE bl PLTJMP(__librt_enable_asynccancel)
>> -# define CDISABLE bl PLTJMP(__librt_disable_asynccancel)
>> -# else
>> -# error Unsupported library
>> # endif
>>
>> # if IS_IN (libpthread) || IS_IN (libc)
>> -# ifndef __ASSEMBLER__
>> extern int __local_multiple_threads attribute_hidden;
>> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - LDST_PCREL(ldr, ip, ip, __local_multiple_threads); \
>> - teq ip, #0
>> -# endif
>> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
>> # else
>> /* There is no __local_multiple_threads for librt, so use the TCB. */
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - push {r0, lr}; \
>> - cfi_adjust_cfa_offset (8); \
>> - cfi_rel_offset (lr, 4); \
>> - GET_TLS (lr); \
>> - NEGOFF_ADJ_BASE (r0, MULTIPLE_THREADS_OFFSET); \
>> - ldr ip, NEGOFF_OFF1 (r0, MULTIPLE_THREADS_OFFSET); \
>> - pop {r0, lr}; \
>> - cfi_adjust_cfa_offset (-8); \
>> - cfi_restore (lr); \
>> - teq ip, #0
>> -# endif
>> # endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> /* For rtld, et cetera. */
>> # define SINGLE_THREAD_P 1
>> @@ -234,8 +47,6 @@ extern int __local_multiple_threads attribute_hidden;
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h b/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
>> index 8b7f2b2..a6189a7 100644
>> --- a/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
>> @@ -23,215 +23,6 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# ifndef NO_ERROR
>> -# define NO_ERROR -0x1000
>> -# endif
>> -
>> -/* The syscall cancellation mechanism requires userspace
>> - assistance, the following code does roughly this:
>> -
>> - do arguments (read arg5 and arg6 to registers)
>> - setup frame
>> -
>> - check if there are threads, yes jump to pseudo_cancel
>> -
>> - unthreaded:
>> - syscall
>> - check syscall return (jump to pre_end)
>> - set errno
>> - set return to -1
>> - (jump to pre_end)
>> -
>> - pseudo_cancel:
>> - cenable
>> - syscall
>> - cdisable
>> - check syscall return (jump to pre_end)
>> - set errno
>> - set return to -1
>> -
>> - pre_end
>> - restore stack
>> -
>> - It is expected that 'ret' and 'END' macros will
>> - append an 'undo arguments' and 'return' to the
>> - this PSEUDO macro. */
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - ENTRY (__##syscall_name##_nocancel) \
>> - DOARGS_##args ASM_LINE_SEP \
>> - stwm TREG, 64(%sp) ASM_LINE_SEP \
>> - .cfi_def_cfa_offset -64 ASM_LINE_SEP \
>> - .cfi_offset TREG, 0 ASM_LINE_SEP \
>> - stw %sp, -4(%sp) ASM_LINE_SEP \
>> - stw %r19, -32(%sp) ASM_LINE_SEP \
>> - .cfi_offset 19, 32 ASM_LINE_SEP \
>> - /* Save r19 */ ASM_LINE_SEP \
>> - SAVE_PIC(TREG) ASM_LINE_SEP \
>> - /* Do syscall, delay loads # */ ASM_LINE_SEP \
>> - ble 0x100(%sr2,%r0) ASM_LINE_SEP \
>> - ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
>> - ldi NO_ERROR,%r1 ASM_LINE_SEP \
>> - cmpb,>>=,n %r1,%ret0,L(pre_nc_end) ASM_LINE_SEP \
>> - /* Restore r19 from TREG */ ASM_LINE_SEP \
>> - LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \
>> - SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
>> - /* Use TREG for temp storage */ ASM_LINE_SEP \
>> - copy %ret0, TREG /* delay */ ASM_LINE_SEP \
>> - /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \
>> - /* do a -1*syscall_ret0 */ ASM_LINE_SEP \
>> - sub %r0, TREG, TREG ASM_LINE_SEP \
>> - /* Store into errno location */ ASM_LINE_SEP \
>> - stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
>> - /* return -1 as error */ ASM_LINE_SEP \
>> - ldi -1, %ret0 ASM_LINE_SEP \
>> -L(pre_nc_end): ASM_LINE_SEP \
>> - /* No need to LOAD_PIC */ ASM_LINE_SEP \
>> - /* Undo frame */ ASM_LINE_SEP \
>> - ldwm -64(%sp),TREG ASM_LINE_SEP \
>> - /* Restore rp before exit */ ASM_LINE_SEP \
>> - ldw -20(%sp), %rp ASM_LINE_SEP \
>> - ret ASM_LINE_SEP \
>> - END(__##syscall_name##_nocancel) ASM_LINE_SEP \
>> - /**********************************************/ASM_LINE_SEP \
>> - ENTRY (name) \
>> - DOARGS_##args ASM_LINE_SEP \
>> - stwm TREG, 64(%sp) ASM_LINE_SEP \
>> - .cfi_def_cfa_offset -64 ASM_LINE_SEP \
>> - .cfi_offset TREG, 0 ASM_LINE_SEP \
>> - stw %sp, -4(%sp) ASM_LINE_SEP \
>> - stw %r19, -32(%sp) ASM_LINE_SEP \
>> - .cfi_offset 19, 32 ASM_LINE_SEP \
>> - /* Done setting up frame, continue... */ ASM_LINE_SEP \
>> - SINGLE_THREAD_P ASM_LINE_SEP \
>> - cmpib,<>,n 0,%ret0,L(pseudo_cancel) ASM_LINE_SEP \
>> -L(unthreaded): ASM_LINE_SEP \
>> - /* Save r19 */ ASM_LINE_SEP \
>> - SAVE_PIC(TREG) ASM_LINE_SEP \
>> - /* Do syscall, delay loads # */ ASM_LINE_SEP \
>> - ble 0x100(%sr2,%r0) ASM_LINE_SEP \
>> - ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
>> - ldi NO_ERROR,%r1 ASM_LINE_SEP \
>> - cmpb,>>=,n %r1,%ret0,L(pre_end) ASM_LINE_SEP \
>> - /* Restore r19 from TREG */ ASM_LINE_SEP \
>> - LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \
>> - SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
>> - /* Use TREG for temp storage */ ASM_LINE_SEP \
>> - copy %ret0, TREG /* delay */ ASM_LINE_SEP \
>> - /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \
>> - /* do a -1*syscall_ret0 */ ASM_LINE_SEP \
>> - sub %r0, TREG, TREG ASM_LINE_SEP \
>> - /* Store into errno location */ ASM_LINE_SEP \
>> - stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
>> - b L(pre_end) ASM_LINE_SEP \
>> - /* return -1 as error */ ASM_LINE_SEP \
>> - ldi -1, %ret0 /* delay */ ASM_LINE_SEP \
>> -L(pseudo_cancel): ASM_LINE_SEP \
>> - PUSHARGS_##args /* Save args */ ASM_LINE_SEP \
>> - /* Save r19 into TREG */ ASM_LINE_SEP \
>> - CENABLE /* FUNC CALL */ ASM_LINE_SEP \
>> - SAVE_PIC(TREG) /* delay */ ASM_LINE_SEP \
>> - /* restore syscall args */ ASM_LINE_SEP \
>> - POPARGS_##args ASM_LINE_SEP \
>> - /* save mask from cenable (use stub rp slot) */ ASM_LINE_SEP \
>> - stw %ret0, -24(%sp) ASM_LINE_SEP \
>> - /* ... SYSCALL ... */ ASM_LINE_SEP \
>> - ble 0x100(%sr2,%r0) ASM_LINE_SEP \
>> - ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
>> - /* ............... */ ASM_LINE_SEP \
>> - LOAD_PIC(TREG) ASM_LINE_SEP \
>> - /* pass mask as arg0 to cdisable */ ASM_LINE_SEP \
>> - ldw -24(%sp), %r26 ASM_LINE_SEP \
>> - CDISABLE ASM_LINE_SEP \
>> - stw %ret0, -24(%sp) /* delay */ ASM_LINE_SEP \
>> - /* Restore syscall return */ ASM_LINE_SEP \
>> - ldw -24(%sp), %ret0 ASM_LINE_SEP \
>> - /* compare error */ ASM_LINE_SEP \
>> - ldi NO_ERROR,%r1 ASM_LINE_SEP \
>> - /* branch if no error */ ASM_LINE_SEP \
>> - cmpb,>>=,n %r1,%ret0,L(pre_end) ASM_LINE_SEP \
>> - LOAD_PIC(TREG) /* cond. nullify */ ASM_LINE_SEP \
>> - copy %ret0, TREG /* save syscall return */ ASM_LINE_SEP \
>> - SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
>> - /* make syscall res value positive */ ASM_LINE_SEP \
>> - sub %r0, TREG, TREG /* delay */ ASM_LINE_SEP \
>> - /* No need to LOAD_PIC */ ASM_LINE_SEP \
>> - /* store into errno location */ ASM_LINE_SEP \
>> - stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
>> - /* return -1 */ ASM_LINE_SEP \
>> - ldi -1, %ret0 ASM_LINE_SEP \
>> -L(pre_end): ASM_LINE_SEP \
>> - /* No need to LOAD_PIC */ ASM_LINE_SEP \
>> - /* Undo frame */ ASM_LINE_SEP \
>> - ldwm -64(%sp),TREG ASM_LINE_SEP \
>> - /* Restore rp before exit */ ASM_LINE_SEP \
>> - ldw -20(%sp), %rp ASM_LINE_SEP
>> -
>> -/* Save arguments into our frame */
>> -# define PUSHARGS_0 /* nothing to do */
>> -# define PUSHARGS_1 PUSHARGS_0 stw %r26, -36(%sr0,%sp) ASM_LINE_SEP \
>> - .cfi_offset 26, 28 ASM_LINE_SEP
>> -# define PUSHARGS_2 PUSHARGS_1 stw %r25, -40(%sr0,%sp) ASM_LINE_SEP \
>> - .cfi_offset 25, 24 ASM_LINE_SEP
>> -# define PUSHARGS_3 PUSHARGS_2 stw %r24, -44(%sr0,%sp) ASM_LINE_SEP \
>> - .cfi_offset 24, 20 ASM_LINE_SEP
>> -# define PUSHARGS_4 PUSHARGS_3 stw %r23, -48(%sr0,%sp) ASM_LINE_SEP \
>> - .cfi_offset 23, 16 ASM_LINE_SEP
>> -# define PUSHARGS_5 PUSHARGS_4 stw %r22, -52(%sr0,%sp) ASM_LINE_SEP \
>> - .cfi_offset 22, 12 ASM_LINE_SEP
>> -# define PUSHARGS_6 PUSHARGS_5 stw %r21, -56(%sr0,%sp) ASM_LINE_SEP \
>> - .cfi_offset 21, 8 ASM_LINE_SEP
>> -
>> -/* Bring them back from the stack */
>> -# define POPARGS_0 /* nothing to do */
>> -# define POPARGS_1 POPARGS_0 ldw -36(%sr0,%sp), %r26 ASM_LINE_SEP
>> -# define POPARGS_2 POPARGS_1 ldw -40(%sr0,%sp), %r25 ASM_LINE_SEP
>> -# define POPARGS_3 POPARGS_2 ldw -44(%sr0,%sp), %r24 ASM_LINE_SEP
>> -# define POPARGS_4 POPARGS_3 ldw -48(%sr0,%sp), %r23 ASM_LINE_SEP
>> -# define POPARGS_5 POPARGS_4 ldw -52(%sr0,%sp), %r22 ASM_LINE_SEP
>> -# define POPARGS_6 POPARGS_5 ldw -56(%sr0,%sp), %r21 ASM_LINE_SEP
>> -
>> -# if IS_IN (libpthread)
>> -# ifdef PIC
>> -# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
>> - bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
>> -# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
>> - bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
>> -# else
>> -# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
>> - bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
>> -# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
>> - bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
>> -# endif
>> -# elif IS_IN (libc)
>> -# ifdef PIC
>> -# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
>> - bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
>> -# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
>> - bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
>> -# else
>> -# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
>> - bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
>> -# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
>> - bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
>> -# endif
>> -# elif IS_IN (librt)
>> -# ifdef PIC
>> -# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
>> - bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
>> -# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
>> - bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
>> -# else
>> -# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
>> - bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
>> -# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
>> - bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
>> -# endif
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> # if IS_IN (libpthread)
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> @@ -242,17 +33,11 @@ L(pre_end): ASM_LINE_SEP \
>> # error Unsupported library
>> # endif
>>
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -/* Read the value of header.multiple_threads from the thread pointer */
>> -# define SINGLE_THREAD_P \
>> - mfctl %cr27, %ret0 ASM_LINE_SEP \
>> - ldw MULTIPLE_THREADS_THREAD_OFFSET(%sr0,%ret0),%ret0 ASM_LINE_SEP
>> -# endif
>> -#elif !defined __ASSEMBLER__
>> +
>> +#else
>>
>> /* This code should never be used but we define it anyhow. */
>> # define SINGLE_THREAD_P (1)
>> @@ -261,8 +46,6 @@ L(pre_end): ASM_LINE_SEP \
>> #endif
>> /* IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) */
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
>> index ebf6019..34e2b6f 100644
>> --- a/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
>> @@ -24,130 +24,17 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - ENTRY (name) \
>> - cmpl $0, %gs:MULTIPLE_THREADS_OFFSET; \
>> - jne L(pseudo_cancel); \
>> - .type __##syscall_name##_nocancel,@function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - DO_CALL (syscall_name, args); \
>> - cmpl $-4095, %eax; \
>> - jae SYSCALL_ERROR_LABEL; \
>> - ret; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - L(pseudo_cancel): \
>> - CENABLE \
>> - SAVE_OLDTYPE_##args \
>> - PUSHCARGS_##args \
>> - DOCARGS_##args \
>> - movl $SYS_ify (syscall_name), %eax; \
>> - ENTER_KERNEL; \
>> - POPCARGS_##args; \
>> - POPSTATE_##args \
>> - cmpl $-4095, %eax; \
>> - jae SYSCALL_ERROR_LABEL
>> -
>> -# define SAVE_OLDTYPE_0 movl %eax, %ecx;
>> -# define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0
>> -# define SAVE_OLDTYPE_2 pushl %eax; cfi_adjust_cfa_offset (4);
>> -# define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2
>> -# define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2
>> -# define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2
>> -# define SAVE_OLDTYPE_6 SAVE_OLDTYPE_2
>> -
>> -# define PUSHCARGS_0 /* No arguments to push. */
>> -# define DOCARGS_0 /* No arguments to frob. */
>> -# define POPCARGS_0 /* No arguments to pop. */
>> -# define _PUSHCARGS_0 /* No arguments to push. */
>> -# define _POPCARGS_0 /* No arguments to pop. */
>> -
>> -# define PUSHCARGS_1 movl %ebx, %edx; cfi_register (ebx, edx); PUSHCARGS_0
>> -# define DOCARGS_1 _DOARGS_1 (4)
>> -# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; cfi_restore (ebx);
>> -# define _PUSHCARGS_1 pushl %ebx; cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (ebx, 0); _PUSHCARGS_0
>> -# define _POPCARGS_1 _POPCARGS_0; popl %ebx; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (ebx);
>> -
>> -# define PUSHCARGS_2 PUSHCARGS_1
>> -# define DOCARGS_2 _DOARGS_2 (12)
>> -# define POPCARGS_2 POPCARGS_1
>> -# define _PUSHCARGS_2 _PUSHCARGS_1
>> -# define _POPCARGS_2 _POPCARGS_1
>> -
>> -# define PUSHCARGS_3 _PUSHCARGS_2
>> -# define DOCARGS_3 _DOARGS_3 (20)
>> -# define POPCARGS_3 _POPCARGS_3
>> -# define _PUSHCARGS_3 _PUSHCARGS_2
>> -# define _POPCARGS_3 _POPCARGS_2
>> -
>> -# define PUSHCARGS_4 _PUSHCARGS_4
>> -# define DOCARGS_4 _DOARGS_4 (28)
>> -# define POPCARGS_4 _POPCARGS_4
>> -# define _PUSHCARGS_4 pushl %esi; cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (esi, 0); _PUSHCARGS_3
>> -# define _POPCARGS_4 _POPCARGS_3; popl %esi; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (esi);
>> -
>> -# define PUSHCARGS_5 _PUSHCARGS_5
>> -# define DOCARGS_5 _DOARGS_5 (36)
>> -# define POPCARGS_5 _POPCARGS_5
>> -# define _PUSHCARGS_5 pushl %edi; cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (edi, 0); _PUSHCARGS_4
>> -# define _POPCARGS_5 _POPCARGS_4; popl %edi; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (edi);
>> -
>> -# define PUSHCARGS_6 _PUSHCARGS_6
>> -# define DOCARGS_6 _DOARGS_6 (44)
>> -# define POPCARGS_6 _POPCARGS_6
>> -# define _PUSHCARGS_6 pushl %ebp; cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (ebp, 0); _PUSHCARGS_5
>> -# define _POPCARGS_6 _POPCARGS_5; popl %ebp; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (ebp);
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE call __pthread_enable_asynccancel;
>> -# define CDISABLE call __pthread_disable_asynccancel
>> -# elif IS_IN (libc)
>> -# define CENABLE call __libc_enable_asynccancel;
>> -# define CDISABLE call __libc_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define CENABLE call __librt_enable_asynccancel;
>> -# define CDISABLE call __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -# define POPSTATE_0 \
>> - pushl %eax; cfi_adjust_cfa_offset (4); movl %ecx, %eax; \
>> - CDISABLE; popl %eax; cfi_adjust_cfa_offset (-4);
>> -# define POPSTATE_1 POPSTATE_0
>> -# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; \
>> - cfi_adjust_cfa_offset (-4);
>> -# define POPSTATE_3 POPSTATE_2
>> -# define POPSTATE_4 POPSTATE_3
>> -# define POPSTATE_5 POPSTATE_4
>> -# define POPSTATE_6 POPSTATE_5
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
>> -# endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
>> index 7c7f619..96d04de 100644
>> --- a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
>> @@ -23,201 +23,13 @@
>> #endif
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> -
>> -# undef PSEUDO
>> -
>> -# if IS_IN (libc)
>> -# define SYSDEP_CANCEL_ERRNO __libc_errno
>> -# else
>> -# define SYSDEP_CANCEL_ERRNO errno
>> -# endif
>> -# define SYSDEP_CANCEL_ERROR(args) \
>> -.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
>> - .align 32; \
>> - .proc __syscall_error_##args; \
>> - .global __syscall_error_##args; \
>> - .hidden __syscall_error_##args; \
>> - .size __syscall_error_##args, 64; \
>> -__syscall_error_##args: \
>> - .prologue; \
>> - .regstk args, 5, args, 0; \
>> - .save ar.pfs, loc0; \
>> - .save rp, loc1; \
>> - .body; \
>> - addl loc4 = @ltoff(@tprel(SYSDEP_CANCEL_ERRNO)), gp;; \
>> - ld8 loc4 = [loc4]; \
>> - mov rp = loc1;; \
>> - mov r8 = -1; \
>> - add loc4 = loc4, r13;; \
>> - st4 [loc4] = loc3; \
>> - mov ar.pfs = loc0
>> -
>> -# ifndef USE_DL_SYSINFO
>> -
>> -# define PSEUDO(name, syscall_name, args) \
>> -.text; \
>> -ENTRY (name) \
>> - adds r14 = MULTIPLE_THREADS_OFFSET, r13;; \
>> - ld4 r14 = [r14]; \
>> - mov r15 = SYS_ify(syscall_name);; \
>> - cmp4.ne p6, p7 = 0, r14; \
>> -(p6) br.cond.spnt .Lpseudo_cancel;; \
>> - break __BREAK_SYSCALL;; \
>> - cmp.eq p6,p0=-1,r10; \
>> -(p6) br.cond.spnt.few __syscall_error; \
>> - ret;; \
>> - .endp name; \
>> - .proc __GC_##name; \
>> - .globl __GC_##name; \
>> - .hidden __GC_##name; \
>> -__GC_##name: \
>> -.Lpseudo_cancel: \
>> - .prologue; \
>> - .regstk args, 5, args, 0; \
>> - .save ar.pfs, loc0; \
>> - alloc loc0 = ar.pfs, args, 5, args, 0; \
>> - .save rp, loc1; \
>> - mov loc1 = rp;; \
>> - .body; \
>> - CENABLE;; \
>> - mov loc2 = r8; \
>> - COPY_ARGS_##args \
>> - mov r15 = SYS_ify(syscall_name); \
>> - break __BREAK_SYSCALL;; \
>> - mov loc3 = r8; \
>> - mov loc4 = r10; \
>> - mov out0 = loc2; \
>> - CDISABLE;; \
>> - cmp.eq p6,p0=-1,loc4; \
>> -(p6) br.cond.spnt.few __syscall_error_##args; \
>> - mov r8 = loc3; \
>> - mov rp = loc1; \
>> - mov ar.pfs = loc0; \
>> -.Lpseudo_end: \
>> - ret; \
>> - .endp __GC_##name; \
>> - SYSDEP_CANCEL_ERROR(args)
>> -
>> -# else /* USE_DL_SYSINFO */
>> -
>> -# define PSEUDO(name, syscall_name, args) \
>> -.text; \
>> -ENTRY (name) \
>> - .prologue; \
>> - adds r2 = SYSINFO_OFFSET, r13; \
>> - adds r14 = MULTIPLE_THREADS_OFFSET, r13; \
>> - .save ar.pfs, r11; \
>> - mov r11 = ar.pfs;; \
>> - .body; \
>> - ld4 r14 = [r14]; \
>> - ld8 r2 = [r2]; \
>> - mov r15 = SYS_ify(syscall_name);; \
>> - cmp4.ne p6, p7 = 0, r14; \
>> - mov b7 = r2; \
>> -(p6) br.cond.spnt .Lpseudo_cancel; \
>> - br.call.sptk.many b6 = b7;; \
>> - mov ar.pfs = r11; \
>> - cmp.eq p6,p0 = -1, r10; \
>> -(p6) br.cond.spnt.few __syscall_error; \
>> - ret;; \
>> - .endp name; \
>> - \
>> - .proc __##syscall_name##_nocancel; \
>> - .globl __##syscall_name##_nocancel; \
>> -__##syscall_name##_nocancel: \
>> - .prologue; \
>> - adds r2 = SYSINFO_OFFSET, r13; \
>> - .save ar.pfs, r11; \
>> - mov r11 = ar.pfs;; \
>> - .body; \
>> - ld8 r2 = [r2]; \
>> - mov r15 = SYS_ify(syscall_name);; \
>> - mov b7 = r2; \
>> - br.call.sptk.many b6 = b7;; \
>> - mov ar.pfs = r11; \
>> - cmp.eq p6,p0 = -1, r10; \
>> -(p6) br.cond.spnt.few __syscall_error; \
>> - ret;; \
>> - .endp __##syscall_name##_nocancel; \
>> - \
>> - .proc __GC_##name; \
>> - .globl __GC_##name; \
>> - .hidden __GC_##name; \
>> -__GC_##name: \
>> -.Lpseudo_cancel: \
>> - .prologue; \
>> - .regstk args, 5, args, 0; \
>> - .save ar.pfs, loc0; \
>> - alloc loc0 = ar.pfs, args, 5, args, 0; \
>> - adds loc4 = SYSINFO_OFFSET, r13; \
>> - .save rp, loc1; \
>> - mov loc1 = rp;; \
>> - .body; \
>> - ld8 loc4 = [loc4]; \
>> - CENABLE;; \
>> - mov loc2 = r8; \
>> - mov b7 = loc4; \
>> - COPY_ARGS_##args \
>> - mov r15 = SYS_ify(syscall_name); \
>> - br.call.sptk.many b6 = b7;; \
>> - mov loc3 = r8; \
>> - mov loc4 = r10; \
>> - mov out0 = loc2; \
>> - CDISABLE;; \
>> - cmp.eq p6,p0=-1,loc4; \
>> -(p6) br.cond.spnt.few __syscall_error_##args; \
>> - mov r8 = loc3; \
>> - mov rp = loc1; \
>> - mov ar.pfs = loc0; \
>> -.Lpseudo_end: \
>> - ret; \
>> - .endp __GC_##name; \
>> - SYSDEP_CANCEL_ERROR(args)
>> -
>> -# endif /* USE_DL_SYSINFO */
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(name) .endp
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE br.call.sptk.many b0 = __pthread_enable_asynccancel
>> -# define CDISABLE br.call.sptk.many b0 = __pthread_disable_asynccancel
>> -# elif IS_IN (libc)
>> -# define CENABLE br.call.sptk.many b0 = __libc_enable_asynccancel
>> -# define CDISABLE br.call.sptk.many b0 = __libc_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define CENABLE br.call.sptk.many b0 = __librt_enable_asynccancel
>> -# define CDISABLE br.call.sptk.many b0 = __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# define COPY_ARGS_0 /* Nothing */
>> -# define COPY_ARGS_1 COPY_ARGS_0 mov out0 = in0;
>> -# define COPY_ARGS_2 COPY_ARGS_1 mov out1 = in1;
>> -# define COPY_ARGS_3 COPY_ARGS_2 mov out2 = in2;
>> -# define COPY_ARGS_4 COPY_ARGS_3 mov out3 = in3;
>> -# define COPY_ARGS_5 COPY_ARGS_4 mov out4 = in4;
>> -# define COPY_ARGS_6 COPY_ARGS_5 mov out5 = in5;
>> -# define COPY_ARGS_7 COPY_ARGS_6 mov out6 = in6;
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14
>> -# endif
>> -
>> -#elif !defined __ASSEMBLER__
>> -
>> +#else
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION 1
>> -
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h b/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
>> index 9bc9e13..1603c5f 100644
>> --- a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
>> @@ -18,121 +18,21 @@
>>
>> #include <sysdep.h>
>> #include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> +#include <nptl/pthreadP.h>
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P; \
>> - jne .Lpseudo_cancel; \
>> - .type __##syscall_name##_nocancel,@function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - DO_CALL (syscall_name, args); \
>> - cmp.l &-4095, %d0; \
>> - jcc SYSCALL_ERROR_LABEL; \
>> - rts; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - .Lpseudo_cancel: \
>> - CENABLE; \
>> - DOCARGS_##args \
>> - move.l %d0, -(%sp); /* Save result of CENABLE. */ \
>> - cfi_adjust_cfa_offset (4); \
>> - move.l &SYS_ify (syscall_name), %d0; \
>> - trap &0; \
>> - move.l %d0, %d2; \
>> - CDISABLE; \
>> - addq.l &4, %sp; /* Remove result of CENABLE from the stack. */ \
>> - cfi_adjust_cfa_offset (-4); \
>> - move.l %d2, %d0; \
>> - UNDOCARGS_##args \
>> - cmp.l &-4095, %d0; \
>> - jcc SYSCALL_ERROR_LABEL
>> -
>> -/* Note: we use D2 to save syscall's return value as D0 will be clobbered in
>> - CDISABLE. */
>> -# define DOCARGS_0 move.l %d2, -(%sp); \
>> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d2, 0);
>> -# define UNDOCARGS_0 move.l (%sp)+, %d2; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (%d2);
>> -
>> -# define DOCARGS_1 _DOCARGS_1 (4); DOCARGS_0
>> -# define _DOCARGS_1(n) move.l n(%sp), %d1;
>> -# define UNDOCARGS_1 UNDOCARGS_0
>> -
>> -# define DOCARGS_2 _DOCARGS_2 (8)
>> -# define _DOCARGS_2(n) DOCARGS_0 move.l n+4(%sp), %d2; _DOCARGS_1 (n)
>> -# define UNDOCARGS_2 UNDOCARGS_0
>> -
>> -# define DOCARGS_3 _DOCARGS_3 (12)
>> -# define _DOCARGS_3(n) move.l %d3, -(%sp); \
>> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d3, 0); \
>> - move.l n+4(%sp), %d3; _DOCARGS_2 (n)
>> -# define UNDOCARGS_3 UNDOCARGS_2 move.l (%sp)+, %d3; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (%d3);
>> -
>> -# define DOCARGS_4 _DOCARGS_4 (16)
>> -# define _DOCARGS_4(n) move.l %d4, -(%sp); \
>> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d4, 0); \
>> - move.l n+4(%sp), %d4; _DOCARGS_3 (n)
>> -# define UNDOCARGS_4 UNDOCARGS_3 move.l (%sp)+, %d4; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (%d4);
>> -
>> -# define DOCARGS_5 _DOCARGS_5 (20)
>> -# define _DOCARGS_5(n) move.l %d5, -(%sp); \
>> - cfi_adjust_cfa_offset (4); cfi_rel_offset (%d5, 0); \
>> - move.l n+4(%sp), %d5; _DOCARGS_4 (n)
>> -# define UNDOCARGS_5 UNDOCARGS_4 move.l (%sp)+, %d5; \
>> - cfi_adjust_cfa_offset (-4); cfi_restore (%d5);
>> -
>> -# define DOCARGS_6 _DOCARGS_6 (24)
>> -# define _DOCARGS_6(n) move.l n(%sp), %a0; _DOCARGS_5 (n-4)
>> -# define UNDOCARGS_6 UNDOCARGS_5
>> -
>> -# ifdef PIC
>> -# define PSEUDO_JMP(sym) jbsr sym ## @PLTPC
>> -# else
>> -# define PSEUDO_JMP(sym) jbsr sym
>> -# endif
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
>> -# elif IS_IN (libc)
>> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
>> -# elif IS_IN (librt)
>> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - PSEUDO_JMP (__m68k_read_tp); \
>> - tst.l MULTIPLE_THREADS_OFFSET(%a0)
>> -# endif
>> -
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION (1)
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, \
>> 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h b/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
>> index dbcc2b2..7fe030b 100644
>> --- a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
>> @@ -23,136 +23,28 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# if !IS_IN (librt) || !defined(PIC)
>> -# define AC_STACK_SIZE 16 /* space for r15, async_cancel arg and 2 temp words */
>> -# define AC_SET_GOT /* empty */
>> -# define AC_RESTORE_GOT /* empty */
>> -# else
>> -# define AC_STACK_SIZE 20 /* extra 4 bytes for r20 */
>> -# define AC_SET_GOT \
>> - swi r20, r1, AC_STACK_SIZE-4; \
>> - mfs r20, rpc; \
>> - addik r20, r20, _GLOBAL_OFFSET_TABLE_+8;
>> -# define AC_RESTORE_GOT \
>> - lwi r20, r1, AC_STACK_SIZE-4;
>> -# endif
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P(r12); \
>> - bnei r12, L(pseudo_cancel); \
>> - .globl __##syscall_name##_nocancel; \
>> - .type __##syscall_name##_nocancel,@function; \
>> -__##syscall_name##_nocancel: \
>> - DO_CALL (syscall_name, args); \
>> - addik r4, r0, -4095; \
>> - cmpu r4, r4, r3; \
>> - bgei r4, SYSCALL_ERROR_LABEL; \
>> - rtsd r15, 8; \
>> - nop; \
>> - .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
>> -L(pseudo_cancel): \
>> - addik r1, r1, -AC_STACK_SIZE; \
>> - swi r15, r1, 0; \
>> - AC_SET_GOT \
>> - DOCARGS_##args \
>> - CENABLE; \
>> - swi r3, r1, 8; \
>> - UNDOCARGS_##args \
>> - DO_CALL (syscall_name, args); \
>> - swi r3, r1, 12; \
>> - lwi r5, r1, 8; \
>> - CDISABLE; \
>> - lwi r3, r1, 12; \
>> - lwi r15, r1, 0; \
>> - AC_RESTORE_GOT \
>> - addik r1, r1, AC_STACK_SIZE; \
>> - addik r4, r0, -4095; \
>> - cmpu r4, r4, r3; \
>> - bgei r4, SYSCALL_ERROR_LABEL; \
>> - rtsd r15, 8; \
>> - nop;
>> -
>> -/*
>> - * Macros to save/restore syscall arguments across CENABLE
>> - * The arguments are saved into the caller's stack (original r1 + 4)
>> - */
>> -
>> -# define DOCARGS_0
>> -# define DOCARGS_1 swi r5, r1, AC_STACK_SIZE + 4;
>> -# define DOCARGS_2 swi r6, r1, AC_STACK_SIZE + 8; DOCARGS_1
>> -# define DOCARGS_3 swi r7, r1, AC_STACK_SIZE + 12; DOCARGS_2
>> -# define DOCARGS_4 swi r8, r1, AC_STACK_SIZE + 16; DOCARGS_3
>> -# define DOCARGS_5 swi r9, r1, AC_STACK_SIZE + 20; DOCARGS_4
>> -# define DOCARGS_6 swi r10, r1, AC_STACK_SIZE + 24; DOCARGS_5
>> -
>> -# define UNDOCARGS_0
>> -# define UNDOCARGS_1 lwi r5, r1, AC_STACK_SIZE + 4;
>> -# define UNDOCARGS_2 UNDOCARGS_1 lwi r6, r1, AC_STACK_SIZE + 8;
>> -# define UNDOCARGS_3 UNDOCARGS_2 lwi r7, r1, AC_STACK_SIZE + 12;
>> -# define UNDOCARGS_4 UNDOCARGS_3 lwi r8, r1, AC_STACK_SIZE + 16;
>> -# define UNDOCARGS_5 UNDOCARGS_4 lwi r9, r1, AC_STACK_SIZE + 20;
>> -# define UNDOCARGS_6 UNDOCARGS_5 lwi r10, r1, AC_STACK_SIZE + 24;
>> -
>> -# ifdef PIC
>> -# define PSEUDO_JMP(sym) brlid r15, sym##@PLTPC; addk r0, r0, r0
>> -# else
>> -# define PSEUDO_JMP(sym) brlid r15, sym; addk r0, r0, r0
>> -# endif
>> -
>> # if IS_IN (libpthread)
>> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
>> # define __local_multiple_threads __libc_multiple_threads
>> -# elif IS_IN (librt)
>> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
>> -# else
>> -# error Unsupported library
>> # endif
>>
>> -
>> # if IS_IN (libpthread) || IS_IN (libc)
>> -# ifndef __ASSEMBLER__
>> extern int __local_multiple_threads attribute_hidden;
>> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
>> -# else
>> -# if !defined PIC
>> -# define SINGLE_THREAD_P(reg) lwi reg, r0, __local_multiple_threads;
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - mfs reg, rpc; \
>> - addik reg, reg, _GLOBAL_OFFSET_TABLE_+8; \
>> - lwi reg, reg, __local_multiple_threads@GOT; \
>> - lwi reg, reg, 0;
>> -# endif
>> -# endif
>> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
>> # else
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - lwi reg, r0, MULTIPLE_THREADS_OFFSET(reg)
>> -# endif
>> # endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION (1)
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
>> deleted file mode 100644
>> index 0ed3e3d..0000000
>> --- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
>> +++ /dev/null
>> @@ -1,249 +0,0 @@
>> -/* Copyright (C) 2003-2017 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>
>> -#include <sysdeps/generic/sysdep.h>
>> -#include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> -#include <sys/asm.h>
>> -
>> -/* Gas will put the initial save of $gp into the CIE, because it appears to
>> - happen before any instructions. So we use cfi_same_value instead of
>> - cfi_restore. */
>> -
>> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> -
>> -#ifdef __PIC__
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .align 2; \
>> - L(pseudo_start): \
>> - cfi_startproc; \
>> - cfi_adjust_cfa_offset (STKSPACE); \
>> - cfi_rel_offset (gp, STKOFF_GP); \
>> - 99: PTR_LA t9,__syscall_error; \
>> - /* manual cpreturn */ \
>> - REG_L gp, STKOFF_GP(sp); \
>> - cfi_same_value (gp); \
>> - RESTORESTK; \
>> - jr t9; \
>> - .type __##syscall_name##_nocancel, @function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - SAVESTK; \
>> - .cpsetup t9, STKOFF_GP, __##syscall_name##_nocancel; \
>> - cfi_rel_offset (gp, STKOFF_GP); \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - bne a3, zero, SYSCALL_ERROR_LABEL; \
>> - /* manual cpreturn */ \
>> - REG_L gp, STKOFF_GP(sp); \
>> - cfi_same_value (gp); \
>> - RESTORESTK; \
>> - ret; \
>> - cfi_endproc; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - ENTRY (name) \
>> - SAVESTK; \
>> - .cpsetup t9, STKOFF_GP, name; \
>> - cfi_rel_offset (gp, STKOFF_GP); \
>> - SINGLE_THREAD_P(v1); \
>> - bne zero, v1, L(pseudo_cancel); \
>> - .set noreorder; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - bne a3, zero, SYSCALL_ERROR_LABEL; \
>> - /* manual cpreturn */ \
>> - REG_L gp, STKOFF_GP(sp); \
>> - cfi_same_value (gp); \
>> - RESTORESTK; \
>> - ret; \
>> - L(pseudo_cancel): \
>> - cfi_adjust_cfa_offset (STKSPACE); \
>> - cfi_rel_offset (gp, STKOFF_GP); \
>> - REG_S ra, STKOFF_RA(sp); \
>> - cfi_rel_offset (ra, STKOFF_RA); \
>> - PUSHARGS_##args; /* save syscall args */ \
>> - CENABLE; \
>> - REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
>> - POPARGS_##args; /* restore syscall args */ \
>> - .set noreorder; \
>> - li v0, SYS_ify (syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
>> - REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
>> - REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
>> - CDISABLE; \
>> - REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
>> - REG_L ra, STKOFF_RA(sp); /* restore return address */ \
>> - REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
>> - bne a3, zero, SYSCALL_ERROR_LABEL; \
>> - /* manual cpreturn */ \
>> - REG_L gp, STKOFF_GP(sp); \
>> - cfi_same_value (gp); \
>> - RESTORESTK; \
>> - L(pseudo_end):
>> -#else
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .align 2; \
>> - L(pseudo_start): \
>> - cfi_startproc; \
>> - cfi_adjust_cfa_offset (STKSPACE); \
>> - 99: RESTORESTK; \
>> - j __syscall_error; \
>> - .type __##syscall_name##_nocancel, @function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - SAVESTK; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - bne a3, zero, SYSCALL_ERROR_LABEL; \
>> - RESTORESTK; \
>> - ret; \
>> - cfi_endproc; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - ENTRY (name) \
>> - SAVESTK; \
>> - SINGLE_THREAD_P(v1); \
>> - bne zero, v1, L(pseudo_cancel); \
>> - .set noreorder; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - bne a3, zero, SYSCALL_ERROR_LABEL; \
>> - RESTORESTK; \
>> - ret; \
>> - L(pseudo_cancel): \
>> - cfi_adjust_cfa_offset (STKSPACE); \
>> - REG_S ra, STKOFF_RA(sp); \
>> - cfi_rel_offset (ra, STKOFF_RA); \
>> - PUSHARGS_##args; /* save syscall args */ \
>> - CENABLE; \
>> - REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
>> - POPARGS_##args; /* restore syscall args */ \
>> - .set noreorder; \
>> - li v0, SYS_ify (syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
>> - REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
>> - REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
>> - CDISABLE; \
>> - REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
>> - REG_L ra, STKOFF_RA(sp); /* restore return address */ \
>> - REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
>> - bne a3, zero, SYSCALL_ERROR_LABEL; \
>> - RESTORESTK; \
>> - L(pseudo_end):
>> -#endif
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
>> -
>> -# define PUSHARGS_0 /* nothing to do */
>> -# define PUSHARGS_1 PUSHARGS_0 REG_S a0, STKOFF_A0(sp); cfi_rel_offset (a0, STKOFF_A0);
>> -# define PUSHARGS_2 PUSHARGS_1 REG_S a1, STKOFF_A1(sp); cfi_rel_offset (a1, STKOFF_A1);
>> -# define PUSHARGS_3 PUSHARGS_2 REG_S a2, STKOFF_A2(sp); cfi_rel_offset (a2, STKOFF_A2);
>> -# define PUSHARGS_4 PUSHARGS_3 REG_S a3, STKOFF_A3(sp); cfi_rel_offset (a3, STKOFF_A3);
>> -# define PUSHARGS_5 PUSHARGS_4 REG_S a4, STKOFF_A4(sp); cfi_rel_offset (a3, STKOFF_A4);
>> -# define PUSHARGS_6 PUSHARGS_5 REG_S a5, STKOFF_A5(sp); cfi_rel_offset (a3, STKOFF_A5);
>> -
>> -# define POPARGS_0 /* nothing to do */
>> -# define POPARGS_1 POPARGS_0 REG_L a0, STKOFF_A0(sp);
>> -# define POPARGS_2 POPARGS_1 REG_L a1, STKOFF_A1(sp);
>> -# define POPARGS_3 POPARGS_2 REG_L a2, STKOFF_A2(sp);
>> -# define POPARGS_4 POPARGS_3 REG_L a3, STKOFF_A3(sp);
>> -# define POPARGS_5 POPARGS_4 REG_L a4, STKOFF_A4(sp);
>> -# define POPARGS_6 POPARGS_5 REG_L a5, STKOFF_A5(sp);
>> -
>> -/* Save an even number of slots. Should be 0 if an even number of slots
>> - are used below, or SZREG if an odd number are used. */
>> -# ifdef __PIC__
>> -# define STK_PAD SZREG
>> -# else
>> -# define STK_PAD 0
>> -# endif
>> -
>> -/* Place values that we are more likely to use later in this sequence, i.e.
>> - closer to the SP at function entry. If you do that, the are more
>> - likely to already be in your d-cache. */
>> -# define STKOFF_A5 (STK_PAD)
>> -# define STKOFF_A4 (STKOFF_A5 + SZREG)
>> -# define STKOFF_A3 (STKOFF_A4 + SZREG)
>> -# define STKOFF_A2 (STKOFF_A3 + SZREG) /* MT and more args. */
>> -# define STKOFF_A1 (STKOFF_A2 + SZREG) /* MT and 2 args. */
>> -# define STKOFF_A0 (STKOFF_A1 + SZREG) /* MT and 1 arg. */
>> -# define STKOFF_RA (STKOFF_A0 + SZREG) /* Used if MT. */
>> -# define STKOFF_SC_V0 (STKOFF_RA + SZREG) /* Used if MT. */
>> -# define STKOFF_SC_ERR (STKOFF_SC_V0 + SZREG) /* Used if MT. */
>> -# define STKOFF_SVMSK (STKOFF_SC_ERR + SZREG) /* Used if MT. */
>> -
>> -# ifdef __PIC__
>> -# define STKOFF_GP (STKOFF_SVMSK + SZREG) /* Always used. */
>> -# define STKSPACE (STKOFF_GP + SZREG)
>> -# else
>> -# define STKSPACE (STKOFF_SVMSK + SZREG)
>> -# endif
>> -
>> -# define SAVESTK PTR_SUBU sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE)
>> -# define RESTORESTK PTR_ADDU sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE)
>> -
>> -# ifdef __PIC__
>> -# define PSEUDO_JMP(sym) PTR_LA t9, sym; jalr t9
>> -# else
>> -# define PSEUDO_JMP(sym) jal sym
>> -# endif
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
>> -# elif IS_IN (librt)
>> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
>> -# else
>> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) \
>> - == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - READ_THREAD_POINTER(reg); \
>> - lw reg, MULTIPLE_THREADS_OFFSET(reg)
>> -#endif
>> -
>> -#elif !defined __ASSEMBLER__
>> -
>> -# define SINGLE_THREAD_P 1
>> -# define NO_CANCELLATION 1
>> -
>> -#endif
>> -
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h b/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
>> index 0e45f00..fe9a3fc 100644
>> --- a/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
>> @@ -18,173 +18,22 @@
>> #include <sysdep.h>
>> #include <sysdeps/generic/sysdep.h>
>> #include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> +#include <nptl/pthreadP.h>
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# ifdef __PIC__
>> -# define PSEUDO_CPLOAD .cpload t9;
>> -# define PSEUDO_ERRJMP la t9, __syscall_error; jr t9;
>> -# define PSEUDO_SAVEGP sw gp, 32(sp); cfi_rel_offset (gp, 32);
>> -# define PSEUDO_LOADGP lw gp, 32(sp);
>> -# else
>> -# define PSEUDO_CPLOAD
>> -# define PSEUDO_ERRJMP j __syscall_error;
>> -# define PSEUDO_SAVEGP
>> -# define PSEUDO_LOADGP
>> -# endif
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .align 2; \
>> - .set nomips16; \
>> - L(pseudo_start): \
>> - cfi_startproc; \
>> - 99: PSEUDO_ERRJMP \
>> - .type __##syscall_name##_nocancel, @function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - .set noreorder; \
>> - PSEUDO_CPLOAD \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - bne a3, zero, 99b; \
>> - ret; \
>> - cfi_endproc; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - ENTRY (name) \
>> - .set noreorder; \
>> - PSEUDO_CPLOAD \
>> - .set reorder; \
>> - SINGLE_THREAD_P(v1); \
>> - bne zero, v1, L(pseudo_cancel); \
>> - .set noreorder; \
>> - li v0, SYS_ify(syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - bne a3, zero, 99b; \
>> - ret; \
>> - L(pseudo_cancel): \
>> - SAVESTK_##args; \
>> - sw ra, 28(sp); \
>> - cfi_rel_offset (ra, 28); \
>> - PSEUDO_SAVEGP \
>> - PUSHARGS_##args; /* save syscall args */ \
>> - CENABLE; \
>> - PSEUDO_LOADGP \
>> - sw v0, 44(sp); /* save mask */ \
>> - POPARGS_##args; /* restore syscall args */ \
>> - .set noreorder; \
>> - li v0, SYS_ify (syscall_name); \
>> - syscall; \
>> - .set reorder; \
>> - sw v0, 36(sp); /* save syscall result */ \
>> - sw a3, 40(sp); /* save syscall error flag */ \
>> - lw a0, 44(sp); /* pass mask as arg1 */ \
>> - CDISABLE; \
>> - PSEUDO_LOADGP \
>> - lw v0, 36(sp); /* restore syscall result */ \
>> - lw a3, 40(sp); /* restore syscall error flag */ \
>> - lw ra, 28(sp); /* restore return address */ \
>> - .set noreorder; \
>> - bne a3, zero, 99b; \
>> - RESTORESTK; \
>> - L(pseudo_end): \
>> - .set reorder;
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
>> -
>> -# define PUSHARGS_0 /* nothing to do */
>> -# define PUSHARGS_1 PUSHARGS_0 sw a0, 0(sp); cfi_rel_offset (a0, 0);
>> -# define PUSHARGS_2 PUSHARGS_1 sw a1, 4(sp); cfi_rel_offset (a1, 4);
>> -# define PUSHARGS_3 PUSHARGS_2 sw a2, 8(sp); cfi_rel_offset (a2, 8);
>> -# define PUSHARGS_4 PUSHARGS_3 sw a3, 12(sp); cfi_rel_offset (a3, 12);
>> -# define PUSHARGS_5 PUSHARGS_4 /* handled by SAVESTK_## */
>> -# define PUSHARGS_6 PUSHARGS_5
>> -# define PUSHARGS_7 PUSHARGS_6
>> -
>> -# define POPARGS_0 /* nothing to do */
>> -# define POPARGS_1 POPARGS_0 lw a0, 0(sp);
>> -# define POPARGS_2 POPARGS_1 lw a1, 4(sp);
>> -# define POPARGS_3 POPARGS_2 lw a2, 8(sp);
>> -# define POPARGS_4 POPARGS_3 lw a3, 12(sp);
>> -# define POPARGS_5 POPARGS_4 /* args already in new stackframe */
>> -# define POPARGS_6 POPARGS_5
>> -# define POPARGS_7 POPARGS_6
>> -
>> -
>> -# define STKSPACE 48
>> -# define SAVESTK_0 subu sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE)
>> -# define SAVESTK_1 SAVESTK_0
>> -# define SAVESTK_2 SAVESTK_1
>> -# define SAVESTK_3 SAVESTK_2
>> -# define SAVESTK_4 SAVESTK_3
>> -# define SAVESTK_5 lw t0, 16(sp); \
>> - SAVESTK_0; \
>> - sw t0, 16(sp)
>> -
>> -# define SAVESTK_6 lw t0, 16(sp); \
>> - lw t1, 20(sp); \
>> - SAVESTK_0; \
>> - sw t0, 16(sp); \
>> - sw t1, 20(sp)
>> -
>> -# define SAVESTK_7 lw t0, 16(sp); \
>> - lw t1, 20(sp); \
>> - lw t2, 24(sp); \
>> - SAVESTK_0; \
>> - sw t0, 16(sp); \
>> - sw t1, 20(sp); \
>> - sw t2, 24(sp)
>> -
>> -# define RESTORESTK addu sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE)
>> -
>> -
>> -# ifdef __PIC__
>> -/* We use jalr rather than jal. This means that the assembler will not
>> - automatically restore $gp (in case libc has multiple GOTs) so we must
>> - do it manually - which we have to do anyway since we don't use .cprestore.
>> - It also shuts up the assembler warning about not using .cprestore. */
>> -# define PSEUDO_JMP(sym) la t9, sym; jalr t9;
>> -# else
>> -# define PSEUDO_JMP(sym) jal sym;
>> -# endif
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
>> -# elif IS_IN (librt)
>> -# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
>> -# else
>> -# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
>> -# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) \
>> == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - READ_THREAD_POINTER(reg); \
>> - lw reg, MULTIPLE_THREADS_OFFSET(reg)
>> -#endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P 1
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h b/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
>> index 47b92d9..7647363 100644
>> --- a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
>> @@ -18,124 +18,22 @@
>>
>> #include <sysdep.h>
>> #include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> +#include <nptl/pthreadP.h>
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .type __##syscall_name##_nocancel, @function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - cfi_startproc; \
>> - DO_CALL (syscall_name, args); \
>> - bne r7, zero, SYSCALL_ERROR_LABEL; \
>> - ret; \
>> - cfi_endproc; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P(r2); \
>> - bne r2, zero, pseudo_cancel; \
>> - DO_CALL (syscall_name, args); \
>> - bne r7, zero, SYSCALL_ERROR_LABEL; \
>> - ret; \
>> - pseudo_cancel: \
>> - SAVESTK_##args; /* save syscall args and adjust stack */ \
>> - SAVEREG(ra, 0); /* save return address */ \
>> - SAVEREG(r22, 4); /* save GOT pointer */ \
>> - nextpc r22; \
>> -1: movhi r2, %hiadj(_gp_got - 1b); \
>> - addi r2, r2, %lo(_gp_got - 1b); \
>> - add r22, r22, r2; \
>> - CENABLE; \
>> - callr r3; \
>> - stw r2, 8(sp); /* save mask */ \
>> - LOADARGS_##args; \
>> - movi r2, SYS_ify(syscall_name); \
>> - trap; \
>> - stw r2, 12(sp); /* save syscall result */ \
>> - stw r7, 16(sp); /* save syscall error flag */ \
>> - ldw r4, 8(sp); /* pass mask as argument 1 */ \
>> - CDISABLE; \
>> - callr r3; \
>> - ldw r7, 16(sp); /* restore syscall error flag */ \
>> - ldw r2, 12(sp); /* restore syscall result */ \
>> - ldw ra, 0(sp); /* restore return address */ \
>> - ldw r22, 4(sp); /* restore GOT pointer */ \
>> - RESTORESTK_##args; \
>> - bne r7, zero, SYSCALL_ERROR_LABEL;
>> -
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(sym) \
>> - SYSCALL_ERROR_HANDLER \
>> - END (sym)
>> -
>> -#define SAVEREG(REG, LOC) stw REG, LOC(sp); cfi_rel_offset (REG, LOC)
>> -#define SAVESTK(X) subi sp, sp, X; cfi_adjust_cfa_offset(X)
>> -#define SAVESTK_0 SAVESTK(20)
>> -#define SAVEARG_1 SAVEREG(r4, 20)
>> -#define SAVESTK_1 SAVESTK(24); SAVEARG_1
>> -#define SAVEARG_2 SAVEREG(r5, 24); SAVEARG_1
>> -#define SAVESTK_2 SAVESTK(28); SAVEARG_2
>> -#define SAVEARG_3 SAVEREG(r6, 28); SAVEARG_2
>> -#define SAVESTK_3 SAVESTK(32); SAVEARG_3
>> -#define SAVEARG_4 SAVEREG(r7, 32); SAVEARG_3
>> -#define SAVESTK_4 SAVESTK(36); SAVEARG_4
>> -#define SAVESTK_5 SAVESTK_4
>> -#define SAVESTK_6 SAVESTK_5
>> -
>> -#define LOADARGS_0
>> -#define LOADARGS_1 ldw r4, 20(sp)
>> -#define LOADARGS_2 LOADARGS_1; ldw r5, 24(sp)
>> -#define LOADARGS_3 LOADARGS_2; ldw r6, 28(sp)
>> -#define LOADARGS_4 LOADARGS_3; ldw r7, 32(sp)
>> -#define LOADARGS_5 LOADARGS_4; ldw r8, 36(sp)
>> -#define LOADARGS_6 LOADARGS_5; ldw r9, 40(sp)
>> -
>> -#define RESTORESTK(X) addi sp, sp, X; cfi_adjust_cfa_offset(-X)
>> -#define RESTORESTK_0 RESTORESTK(20)
>> -#define RESTORESTK_1 RESTORESTK(24)
>> -#define RESTORESTK_2 RESTORESTK(28)
>> -#define RESTORESTK_3 RESTORESTK(32)
>> -#define RESTORESTK_4 RESTORESTK(36)
>> -#define RESTORESTK_5 RESTORESTK(36)
>> -#define RESTORESTK_6 RESTORESTK(36)
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE ldw r3, %call(__pthread_enable_asynccancel)(r22)
>> -# define CDISABLE ldw r3, %call(__pthread_disable_asynccancel)(r22)
>> -# elif IS_IN (librt)
>> -# define CENABLE ldw r3, %call(__librt_enable_asynccancel)(r22)
>> -# define CDISABLE ldw r3, %call(__librt_disable_asynccancel)(r22)
>> -# elif IS_IN (libc)
>> -# define CENABLE ldw r3, %call(__libc_enable_asynccancel)(r22)
>> -# define CDISABLE ldw r3, %call(__libc_disable_asynccancel)(r22)
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) \
>> == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - ldw reg, MULTIPLE_THREADS_OFFSET(r23)
>> -#endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P 1
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
>> deleted file mode 100644
>> index 35d3f05..0000000
>> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
>> +++ /dev/null
>> @@ -1,118 +0,0 @@
>> -/* Cancellable system call stubs. Linux/PowerPC version.
>> - Copyright (C) 2003-2017 Free Software Foundation, Inc.
>> - This file is part of the GNU C Library.
>> - Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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>
>> -#include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> -
>> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .section ".text"; \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P; \
>> - bne- .Lpseudo_cancel; \
>> - .type __##syscall_name##_nocancel,@function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - DO_CALL (SYS_ify (syscall_name)); \
>> - PSEUDO_RET; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - .Lpseudo_cancel: \
>> - stwu 1,-48(1); \
>> - cfi_adjust_cfa_offset (48); \
>> - mflr 9; \
>> - stw 9,52(1); \
>> - cfi_offset (lr, 4); \
>> - DOCARGS_##args; /* save syscall args around CENABLE. */ \
>> - CENABLE; \
>> - stw 3,16(1); /* store CENABLE return value (MASK). */ \
>> - UNDOCARGS_##args; /* restore syscall args. */ \
>> - DO_CALL (SYS_ify (syscall_name)); \
>> - mfcr 0; /* save CR/R3 around CDISABLE. */ \
>> - stw 3,8(1); \
>> - stw 0,12(1); \
>> - lwz 3,16(1); /* pass MASK to CDISABLE. */ \
>> - CDISABLE; \
>> - lwz 4,52(1); \
>> - lwz 0,12(1); /* restore CR/R3. */ \
>> - lwz 3,8(1); \
>> - mtlr 4; \
>> - mtcr 0; \
>> - addi 1,1,48;
>> -
>> -# define DOCARGS_0
>> -# define UNDOCARGS_0
>> -
>> -# define DOCARGS_1 stw 3,20(1); DOCARGS_0
>> -# define UNDOCARGS_1 lwz 3,20(1); UNDOCARGS_0
>> -
>> -# define DOCARGS_2 stw 4,24(1); DOCARGS_1
>> -# define UNDOCARGS_2 lwz 4,24(1); UNDOCARGS_1
>> -
>> -# define DOCARGS_3 stw 5,28(1); DOCARGS_2
>> -# define UNDOCARGS_3 lwz 5,28(1); UNDOCARGS_2
>> -
>> -# define DOCARGS_4 stw 6,32(1); DOCARGS_3
>> -# define UNDOCARGS_4 lwz 6,32(1); UNDOCARGS_3
>> -
>> -# define DOCARGS_5 stw 7,36(1); DOCARGS_4
>> -# define UNDOCARGS_5 lwz 7,36(1); UNDOCARGS_4
>> -
>> -# define DOCARGS_6 stw 8,40(1); DOCARGS_5
>> -# define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE bl __pthread_enable_asynccancel@local
>> -# define CDISABLE bl __pthread_disable_asynccancel@local
>> -# elif IS_IN (libc)
>> -# define CENABLE bl __libc_enable_asynccancel@local
>> -# define CDISABLE bl __libc_disable_asynccancel@local
>> -# elif IS_IN (librt)
>> -# define CENABLE bl __librt_enable_asynccancel@local
>> -# define CDISABLE bl __librt_disable_asynccancel@local
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - lwz 10,MULTIPLE_THREADS_OFFSET(2); \
>> - cmpwi 10,0
>> -# endif
>> -
>> -#elif !defined __ASSEMBLER__
>> -
>> -# define SINGLE_THREAD_P (1)
>> -# define NO_CANCELLATION 1
>> -
>> -#endif
>> -
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
>> deleted file mode 100644
>> index cad13da..0000000
>> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
>> +++ /dev/null
>> @@ -1,147 +0,0 @@
>> -/* Cancellable system call stubs. Linux/PowerPC64 version.
>> - Copyright (C) 2003-2017 Free Software Foundation, Inc.
>> - This file is part of the GNU C Library.
>> - Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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>
>> -#include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> -
>> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> -
>> -# define DASHDASHPFX(str) __##str
>> -
>> -#if _CALL_ELF == 2
>> -#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16+48)
>> -#define CANCEL_PARM_SAVE (FRAME_MIN_SIZE+16)
>> -#else
>> -#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16)
>> -#define CANCEL_PARM_SAVE (CANCEL_FRAMESIZE+FRAME_PARM_SAVE)
>> -#endif
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .section ".text"; \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P; \
>> - bne- .Lpseudo_cancel; \
>> - .type DASHDASHPFX(syscall_name##_nocancel),@function; \
>> - .globl DASHDASHPFX(syscall_name##_nocancel); \
>> - DASHDASHPFX(syscall_name##_nocancel): \
>> - DO_CALL (SYS_ify (syscall_name)); \
>> - PSEUDO_RET; \
>> - .size DASHDASHPFX(syscall_name##_nocancel),.-DASHDASHPFX(syscall_name##_nocancel); \
>> - .Lpseudo_cancel: \
>> - stdu 1,-CANCEL_FRAMESIZE(1); \
>> - cfi_adjust_cfa_offset (CANCEL_FRAMESIZE); \
>> - mflr 9; \
>> - std 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \
>> - cfi_offset (lr, FRAME_LR_SAVE); \
>> - DOCARGS_##args; /* save syscall args around CENABLE. */ \
>> - CENABLE; \
>> - std 3,FRAME_MIN_SIZE(1); /* store CENABLE return value (MASK). */ \
>> - UNDOCARGS_##args; /* restore syscall args. */ \
>> - DO_CALL (SYS_ify (syscall_name)); \
>> - mfcr 0; /* save CR/R3 around CDISABLE. */ \
>> - std 3,FRAME_MIN_SIZE+8(1); \
>> - std 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); \
>> - cfi_offset (cr, FRAME_CR_SAVE); \
>> - ld 3,FRAME_MIN_SIZE(1); /* pass MASK to CDISABLE. */ \
>> - CDISABLE; \
>> - ld 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \
>> - ld 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); /* restore CR/R3. */ \
>> - ld 3,FRAME_MIN_SIZE+8(1); \
>> - mtlr 9; \
>> - mtcr 0; \
>> - addi 1,1,CANCEL_FRAMESIZE; \
>> - cfi_adjust_cfa_offset (-CANCEL_FRAMESIZE); \
>> - cfi_restore (lr); \
>> - cfi_restore (cr)
>> -
>> -# define DOCARGS_0
>> -# define UNDOCARGS_0
>> -
>> -# define DOCARGS_1 std 3,CANCEL_PARM_SAVE(1); DOCARGS_0
>> -# define UNDOCARGS_1 ld 3,CANCEL_PARM_SAVE(1); UNDOCARGS_0
>> -
>> -# define DOCARGS_2 std 4,CANCEL_PARM_SAVE+8(1); DOCARGS_1
>> -# define UNDOCARGS_2 ld 4,CANCEL_PARM_SAVE+8(1); UNDOCARGS_1
>> -
>> -# define DOCARGS_3 std 5,CANCEL_PARM_SAVE+16(1); DOCARGS_2
>> -# define UNDOCARGS_3 ld 5,CANCEL_PARM_SAVE+16(1); UNDOCARGS_2
>> -
>> -# define DOCARGS_4 std 6,CANCEL_PARM_SAVE+24(1); DOCARGS_3
>> -# define UNDOCARGS_4 ld 6,CANCEL_PARM_SAVE+24(1); UNDOCARGS_3
>> -
>> -# define DOCARGS_5 std 7,CANCEL_PARM_SAVE+32(1); DOCARGS_4
>> -# define UNDOCARGS_5 ld 7,CANCEL_PARM_SAVE+32(1); UNDOCARGS_4
>> -
>> -# define DOCARGS_6 std 8,CANCEL_PARM_SAVE+40(1); DOCARGS_5
>> -# define UNDOCARGS_6 ld 8,CANCEL_PARM_SAVE+40(1); UNDOCARGS_5
>> -
>> -# if IS_IN (libpthread)
>> -# ifdef SHARED
>> -# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel)
>> -# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel)
>> -# else
>> -# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel); nop
>> -# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel); nop
>> -# endif
>> -# elif IS_IN (libc)
>> -# ifdef SHARED
>> -# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel)
>> -# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel)
>> -# else
>> -# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel); nop
>> -# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel); nop
>> -# endif
>> -# elif IS_IN (librt)
>> -# ifdef SHARED
>> -# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel)
>> -# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel)
>> -# else
>> -# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel); nop
>> -# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel); nop
>> -# endif
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - lwz 10,MULTIPLE_THREADS_OFFSET(13); \
>> - cmpwi 10,0
>> -# endif
>> -
>> -#elif !defined __ASSEMBLER__
>> -
>> -# define SINGLE_THREAD_P (1)
>> -# define NO_CANCELLATION 1
>> -
>> -#endif
>> -
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
>> new file mode 100644
>> index 0000000..85af880
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
>> @@ -0,0 +1,38 @@
>> +/* Cancellable system call stubs. Linux/PowerPC version.
>> + 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 <sysdep.h>
>> +#include <tls.h>
>> +#include <nptl/pthreadP.h>
>> +
>> +#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> +
>> +# define SINGLE_THREAD_P \
>> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> + header.multiple_threads) == 0, 1)
>> +
>> +#else
>> +
>> +# define SINGLE_THREAD_P (1)
>> +# define NO_CANCELLATION 1
>> +
>> +#endif
>> +
>> +#define RTLD_SINGLE_THREAD_P \
>> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> + header.multiple_threads) == 0, 1)
>> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
>> index b1e80bc..82763b7 100644
>> --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
>> @@ -24,116 +24,17 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> -L(pseudo_cancel): \
>> - cfi_startproc; \
>> - STM_##args \
>> - stm %r12,%r15,48(%r15); \
>> - cfi_offset (%r15, -36); \
>> - cfi_offset (%r14, -40); \
>> - cfi_offset (%r13, -44); \
>> - cfi_offset (%r12, -48); \
>> - lr %r14,%r15; \
>> - ahi %r15,-96; \
>> - cfi_adjust_cfa_offset (96); \
>> - st %r14,0(%r15); \
>> - basr %r13,0; \
>> -0: l %r1,1f-0b(%r13); \
>> - bas %r14,0(%r1,%r13); \
>> - lr %r0,%r2; \
>> - LM_##args \
>> - .if SYS_ify (syscall_name) < 256; \
>> - svc SYS_ify (syscall_name); \
>> - .else; \
>> - lhi %r1,SYS_ify (syscall_name); \
>> - svc 0; \
>> - .endif; \
>> - LR7_##args \
>> - l %r1,2f-0b(%r13); \
>> - lr %r12,%r2; \
>> - lr %r2,%r0; \
>> - bas %r14,0(%r1,%r13); \
>> - lr %r2,%r12; \
>> - lm %r12,%r15,48+96(%r15); \
>> - cfi_endproc; \
>> - j L(pseudo_check); \
>> -1: .long CENABLE-0b; \
>> -2: .long CDISABLE-0b; \
>> -ENTRY(name) \
>> - SINGLE_THREAD_P(%r1) \
>> - jne L(pseudo_cancel); \
>> -.type __##syscall_name##_nocancel,@function; \
>> -.globl __##syscall_name##_nocancel; \
>> -__##syscall_name##_nocancel: \
>> - DO_CALL(syscall_name, args); \
>> -L(pseudo_check): \
>> - lhi %r4,-4095; \
>> - clr %r2,%r4; \
>> - jnl SYSCALL_ERROR_LABEL; \
>> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> -L(pseudo_end):
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE __pthread_enable_asynccancel
>> -# define CDISABLE __pthread_disable_asynccancel
>> -# elif IS_IN (libc)
>> -# define CENABLE __libc_enable_asynccancel
>> -# define CDISABLE __libc_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define CENABLE __librt_enable_asynccancel
>> -# define CDISABLE __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -#define STM_0 /* Nothing */
>> -#define STM_1 st %r2,8(%r15);
>> -#define STM_2 stm %r2,%r3,8(%r15);
>> -#define STM_3 stm %r2,%r4,8(%r15);
>> -#define STM_4 stm %r2,%r5,8(%r15);
>> -#define STM_5 stm %r2,%r5,8(%r15);
>> -#define STM_6 stm %r2,%r7,8(%r15);
>> -
>> -#define LM_0 /* Nothing */
>> -#define LM_1 l %r2,8+96(%r15);
>> -#define LM_2 lm %r2,%r3,8+96(%r15);
>> -#define LM_3 lm %r2,%r4,8+96(%r15);
>> -#define LM_4 lm %r2,%r5,8+96(%r15);
>> -#define LM_5 lm %r2,%r5,8+96(%r15);
>> -#define LM_6 lm %r2,%r5,8+96(%r15); \
>> - cfi_offset (%r7, -68); \
>> - l %r7,96+96(%r15);
>> -
>> -#define LR7_0 /* Nothing */
>> -#define LR7_1 /* Nothing */
>> -#define LR7_2 /* Nothing */
>> -#define LR7_3 /* Nothing */
>> -#define LR7_4 /* Nothing */
>> -#define LR7_5 /* Nothing */
>> -#define LR7_6 l %r7,28+96(%r15); \
>> - cfi_restore (%r7);
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - ear reg,%a0; \
>> - icm reg,15,MULTIPLE_THREADS_OFFSET(reg);
>> -# endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
>> index 9b2c546..952d2af 100644
>> --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
>> @@ -18,135 +18,36 @@
>>
>> #include <sysdep.h>
>> #include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> +#include <nptl/pthreadP.h>
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> -L(pseudo_cancel): \
>> - cfi_startproc; \
>> - STM_##args \
>> - stmg %r13,%r15,104(%r15); \
>> - cfi_offset (%r15,-40); \
>> - cfi_offset (%r14,-48); \
>> - cfi_offset (%r13,-56); \
>> - lgr %r14,%r15; \
>> - aghi %r15,-160; \
>> - cfi_adjust_cfa_offset (160); \
>> - stg %r14,0(%r15); \
>> - brasl %r14,CENABLE; \
>> - lgr %r0,%r2; \
>> - LM_##args \
>> - .if SYS_ify (syscall_name) < 256; \
>> - svc SYS_ify (syscall_name); \
>> - .else; \
>> - lghi %r1,SYS_ify (syscall_name); \
>> - svc 0; \
>> - .endif; \
>> - LR7_##args \
>> - lgr %r13,%r2; \
>> - lgr %r2,%r0; \
>> - brasl %r14,CDISABLE; \
>> - lgr %r2,%r13; \
>> - lmg %r13,%r15,104+160(%r15); \
>> - cfi_endproc; \
>> - j L(pseudo_check); \
>> -ENTRY(name) \
>> - SINGLE_THREAD_P \
>> - jne L(pseudo_cancel); \
>> -.type __##syscall_name##_nocancel,@function; \
>> -.globl __##syscall_name##_nocancel; \
>> -__##syscall_name##_nocancel: \
>> - DO_CALL(syscall_name, args); \
>> -L(pseudo_check): \
>> - lghi %r4,-4095; \
>> - clgr %r2,%r4; \
>> - jgnl SYSCALL_ERROR_LABEL; \
>> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> -L(pseudo_end):
>> -
>> # if IS_IN (libpthread)
>> -# define CENABLE __pthread_enable_asynccancel
>> -# define CDISABLE __pthread_disable_asynccancel
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> -# define CENABLE __libc_enable_asynccancel
>> -# define CDISABLE __libc_disable_asynccancel
>> # define __local_multiple_threads __libc_multiple_threads
>> -# elif IS_IN (librt)
>> -# define CENABLE __librt_enable_asynccancel
>> -# define CDISABLE __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> # endif
>>
>> -#define STM_0 /* Nothing */
>> -#define STM_1 stg %r2,16(%r15);
>> -#define STM_2 stmg %r2,%r3,16(%r15);
>> -#define STM_3 stmg %r2,%r4,16(%r15);
>> -#define STM_4 stmg %r2,%r5,16(%r15);
>> -#define STM_5 stmg %r2,%r5,16(%r15);
>> -#define STM_6 stmg %r2,%r7,16(%r15);
>> -
>> -#define LM_0 /* Nothing */
>> -#define LM_1 lg %r2,16+160(%r15);
>> -#define LM_2 lmg %r2,%r3,16+160(%r15);
>> -#define LM_3 lmg %r2,%r4,16+160(%r15);
>> -#define LM_4 lmg %r2,%r5,16+160(%r15);
>> -#define LM_5 lmg %r2,%r5,16+160(%r15);
>> -#define LM_6 lmg %r2,%r5,16+160(%r15); \
>> - cfi_offset (%r7, -104); \
>> - lg %r7,160+160(%r15);
>> -
>> -#define LR7_0 /* Nothing */
>> -#define LR7_1 /* Nothing */
>> -#define LR7_2 /* Nothing */
>> -#define LR7_3 /* Nothing */
>> -#define LR7_4 /* Nothing */
>> -#define LR7_5 /* Nothing */
>> -#define LR7_6 lg %r7,56+160(%r15); \
>> - cfi_restore (%r7);
>> -
>> # if IS_IN (libpthread) || IS_IN (libc)
>> -# ifndef __ASSEMBLER__
>> extern int __local_multiple_threads attribute_hidden;
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (__local_multiple_threads == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - larl %r1,__local_multiple_threads; \
>> - icm %r0,15,0(%r1);
>> -# endif
>>
>> # else
>>
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - ear %r1,%a0; \
>> - sllg %r1,%r1,32; \
>> - ear %r1,%a1; \
>> - icm %r1,15,MULTIPLE_THREADS_OFFSET(%r1);
>> -# endif
>>
>> # endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
>> index 5645cad..1ea501b 100644
>> --- a/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
>> @@ -23,147 +23,17 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -# define _IMM12 #-12
>> -# define _IMM16 #-16
>> -# define _IMP16 #16
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - ENTRY (name); \
>> - .Lpseudo_start: \
>> - SINGLE_THREAD_P; \
>> - bf .Lpseudo_cancel; \
>> - .type __##syscall_name##_nocancel,@function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - DO_CALL (syscall_name, args); \
>> - mov r0,r1; \
>> - mov _IMM12,r2; \
>> - shad r2,r1; \
>> - not r1,r1; \
>> - tst r1,r1; \
>> - bt .Lsyscall_error; \
>> - bra .Lpseudo_end; \
>> - nop; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - .Lpseudo_cancel: \
>> - sts.l pr,@-r15; \
>> - cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (pr, 0); \
>> - add _IMM16,r15; \
>> - cfi_adjust_cfa_offset (16); \
>> - SAVE_ARGS_##args; \
>> - CENABLE; \
>> - LOAD_ARGS_##args; \
>> - add _IMP16,r15; \
>> - cfi_adjust_cfa_offset (-16); \
>> - lds.l @r15+,pr; \
>> - cfi_adjust_cfa_offset (-4); \
>> - cfi_restore (pr); \
>> - DO_CALL(syscall_name, args); \
>> - SYSCALL_INST_PAD; \
>> - sts.l pr,@-r15; \
>> - cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (pr, 0); \
>> - mov.l r0,@-r15; \
>> - cfi_adjust_cfa_offset (4); \
>> - cfi_rel_offset (r0, 0); \
>> - CDISABLE; \
>> - mov.l @r15+,r0; \
>> - cfi_adjust_cfa_offset (-4); \
>> - cfi_restore (r0); \
>> - lds.l @r15+,pr; \
>> - cfi_adjust_cfa_offset (-4); \
>> - cfi_restore (pr); \
>> - mov r0,r1; \
>> - mov _IMM12,r2; \
>> - shad r2,r1; \
>> - not r1,r1; \
>> - tst r1,r1; \
>> - bf .Lpseudo_end; \
>> - .Lsyscall_error: \
>> - SYSCALL_ERROR_HANDLER; \
>> - .Lpseudo_end:
>> -
>> -# undef PSEUDO_END
>> -# define PSEUDO_END(sym) \
>> - END (sym)
>> -
>> -# define SAVE_ARGS_0 /* Nothing. */
>> -# define SAVE_ARGS_1 SAVE_ARGS_0; mov.l r4,@(0,r15); cfi_offset (r4,-4)
>> -# define SAVE_ARGS_2 SAVE_ARGS_1; mov.l r5,@(4,r15); cfi_offset (r5,-8)
>> -# define SAVE_ARGS_3 SAVE_ARGS_2; mov.l r6,@(8,r15); cfi_offset (r6,-12)
>> -# define SAVE_ARGS_4 SAVE_ARGS_3; mov.l r7,@(12,r15); cfi_offset (r7,-16)
>> -# define SAVE_ARGS_5 SAVE_ARGS_4
>> -# define SAVE_ARGS_6 SAVE_ARGS_5
>> -
>> -# define LOAD_ARGS_0 /* Nothing. */
>> -# define LOAD_ARGS_1 LOAD_ARGS_0; mov.l @(0,r15),r4; cfi_restore (r4)
>> -# define LOAD_ARGS_2 LOAD_ARGS_1; mov.l @(4,r15),r5; cfi_restore (r5)
>> -# define LOAD_ARGS_3 LOAD_ARGS_2; mov.l @(8,r15),r6; cfi_restore (r6)
>> -# define LOAD_ARGS_4 LOAD_ARGS_3; mov.l @(12,r15),r7; cfi_restore (r7)
>> -# define LOAD_ARGS_5 LOAD_ARGS_4
>> -# define LOAD_ARGS_6 LOAD_ARGS_5
>> -
>> -# if IS_IN (libpthread)
>> -# define __local_enable_asynccancel __pthread_enable_asynccancel
>> -# define __local_disable_asynccancel __pthread_disable_asynccancel
>> -# elif IS_IN (libc)
>> -# define __local_enable_asynccancel __libc_enable_asynccancel
>> -# define __local_disable_asynccancel __libc_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define __local_enable_asynccancel __librt_enable_asynccancel
>> -# define __local_disable_asynccancel __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -# define CENABLE \
>> - mov.l 1f,r0; \
>> - bsrf r0; \
>> - nop; \
>> - 0: bra 2f; \
>> - mov r0,r2; \
>> - .align 2; \
>> - 1: .long __local_enable_asynccancel - 0b; \
>> - 2:
>> -
>> -# define CDISABLE \
>> - mov.l 1f,r0; \
>> - bsrf r0; \
>> - mov r2,r4; \
>> - 0: bra 2f; \
>> - nop; \
>> - .align 2; \
>> - 1: .long __local_disable_asynccancel - 0b; \
>> - 2:
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P \
>> - stc gbr,r0; \
>> - mov.w 0f,r1; \
>> - sub r1,r0; \
>> - mov.l @(MULTIPLE_THREADS_OFFSET,r0),r0; \
>> - bra 1f; \
>> - tst r0,r0; \
>> - 0: .word TLS_PRE_TCB_SIZE; \
>> - 1:
>> -
>> -# endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
>> deleted file mode 100644
>> index c513212..0000000
>> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
>> +++ /dev/null
>> @@ -1,111 +0,0 @@
>> -/* Copyright (C) 2002-2017 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, see
>> - <http://www.gnu.org/licenses/>. */
>> -
>> -#include <sysdep.h>
>> -#include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> -
>> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - .globl __syscall_error; \
>> -ENTRY(name) \
>> - ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
>> - cmp %g1, 0; \
>> - bne 1f; \
>> -.type __##syscall_name##_nocancel,@function; \
>> -.globl __##syscall_name##_nocancel; \
>> -__##syscall_name##_nocancel: \
>> - mov SYS_ify(syscall_name), %g1; \
>> - ta 0x10; \
>> - bcc 8f; \
>> - mov %o7, %g1; \
>> - call __syscall_error; \
>> - mov %g1, %o7; \
>> -8: jmpl %o7 + 8, %g0; \
>> - nop; \
>> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
>> -1: save %sp, -96, %sp; \
>> - cfi_def_cfa_register(%fp); \
>> - cfi_window_save; \
>> - cfi_register(%o7, %i7); \
>> - CENABLE; \
>> - nop; \
>> - mov %o0, %l0; \
>> - COPY_ARGS_##args \
>> - mov SYS_ify(syscall_name), %g1; \
>> - ta 0x10; \
>> - bcc 1f; \
>> - mov %o0, %l1; \
>> - CDISABLE; \
>> - mov %l0, %o0; \
>> - call __syscall_error; \
>> - mov %l1, %o0; \
>> - b 2f; \
>> - mov -1, %l1; \
>> -1: CDISABLE; \
>> - mov %l0, %o0; \
>> -2: jmpl %i7 + 8, %g0; \
>> - restore %g0, %l1, %o0;
>> -
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE call __pthread_enable_asynccancel
>> -# define CDISABLE call __pthread_disable_asynccancel
>> -# elif IS_IN (libc)
>> -# define CENABLE call __libc_enable_asynccancel
>> -# define CDISABLE call __libc_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define CENABLE call __librt_enable_asynccancel
>> -# define CDISABLE call __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -#define COPY_ARGS_0 /* Nothing */
>> -#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
>> -#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
>> -#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
>> -#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
>> -#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
>> -#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
>> -# endif
>> -
>> -#elif !defined __ASSEMBLER__
>> -
>> -# define SINGLE_THREAD_P (1)
>> -# define NO_CANCELLATION 1
>> -
>> -#endif
>> -
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
>> deleted file mode 100644
>> index 45fbd73..0000000
>> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
>> +++ /dev/null
>> @@ -1,109 +0,0 @@
>> -/* Copyright (C) 2002-2017 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, see
>> - <http://www.gnu.org/licenses/>. */
>> -
>> -#include <sysdep.h>
>> -#include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> -
>> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> -
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - .globl __syscall_error; \
>> -ENTRY(name) \
>> - ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
>> - brnz,pn %g1, 1f; \
>> -.type __##syscall_name##_nocancel,@function; \
>> -.globl __##syscall_name##_nocancel; \
>> -__##syscall_name##_nocancel: \
>> - mov SYS_ify(syscall_name), %g1; \
>> - ta 0x6d; \
>> - bcc,pt %xcc, 8f; \
>> - mov %o7, %g1; \
>> - call __syscall_error; \
>> - mov %g1, %o7; \
>> -8: jmpl %o7 + 8, %g0; \
>> - nop; \
>> -.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
>> -1: save %sp, -192, %sp; \
>> - cfi_def_cfa_register(%fp); \
>> - cfi_window_save; \
>> - cfi_register(%o7, %i7); \
>> - CENABLE; \
>> - nop; \
>> - mov %o0, %l0; \
>> - COPY_ARGS_##args \
>> - mov SYS_ify(syscall_name), %g1; \
>> - ta 0x6d; \
>> - bcc,pt %xcc, 1f; \
>> - mov %o0, %l1; \
>> - CDISABLE; \
>> - mov %l0, %o0; \
>> - call __syscall_error; \
>> - mov %l1, %o0; \
>> - ba,pt %xcc, 2f; \
>> - mov -1, %l1; \
>> -1: CDISABLE; \
>> - mov %l0, %o0; \
>> -2: jmpl %i7 + 8, %g0; \
>> - restore %g0, %l1, %o0;
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE call __pthread_enable_asynccancel
>> -# define CDISABLE call __pthread_disable_asynccancel
>> -# elif IS_IN (libc)
>> -# define CENABLE call __libc_enable_asynccancel
>> -# define CDISABLE call __libc_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define CENABLE call __librt_enable_asynccancel
>> -# define CDISABLE call __librt_disable_asynccancel
>> -# else
>> -# error Unsupported library
>> -# endif
>> -
>> -#define COPY_ARGS_0 /* Nothing */
>> -#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
>> -#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
>> -#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
>> -#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
>> -#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
>> -#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
>> -# endif
>> -
>> -#elif !defined __ASSEMBLER__
>> -
>> -# define SINGLE_THREAD_P (1)
>> -# define NO_CANCELLATION 1
>> -
>> -#endif
>> -
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> - header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
>> new file mode 100644
>> index 0000000..61bfa33
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
>> @@ -0,0 +1,38 @@
>> +/* Copyright (C) 2002-2015 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, see
>> + <http://www.gnu.org/licenses/>. */
>> +
>> +#include <sysdep.h>
>> +#include <tls.h>
>> +#include <nptl/pthreadP.h>
>> +
>> +#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>> +
>> +# define SINGLE_THREAD_P \
>> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> + header.multiple_threads) == 0, 1)
>> +
>> +#else
>> +
>> +# define SINGLE_THREAD_P (1)
>> +# define NO_CANCELLATION 1
>> +
>> +#endif
>> +
>> +#define RTLD_SINGLE_THREAD_P \
>> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> + header.multiple_threads) == 0, 1)
>> diff --git a/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h b/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
>> index 092a90c..c8994db 100644
>> --- a/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
>> @@ -18,137 +18,22 @@
>>
>> #include <sysdep.h>
>> #include <tls.h>
>> -#ifndef __ASSEMBLER__
>> -# include <nptl/pthreadP.h>
>> -#endif
>> +#include <nptl/pthreadP.h>
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -/* Allow hacking in some extra code if desired. */
>> -#ifndef PSEUDO_EXTRA
>> -#define PSEUDO_EXTRA
>> -#endif
>> -
>> -#undef PSEUDO
>> -#define PSEUDO(name, syscall_name, args) \
>> - ENTRY(__##syscall_name##_nocancel); \
>> - PSEUDO_EXTRA \
>> - moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
>> - swint1; \
>> - BNEZ r1, 0f; \
>> - jrp lr; \
>> - END(__##syscall_name##_nocancel); \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P(r11); \
>> - BEQZ r11, L(pseudo_cancel); \
>> - PSEUDO_EXTRA \
>> - moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
>> - swint1; \
>> - BNEZ r1, 0f; \
>> - jrp lr; \
>> - L(pseudo_cancel): \
>> - { \
>> - move r11, sp; \
>> - ST sp, lr; \
>> - ADDI_PTR sp, sp, -STKSPACE; \
>> - }; \
>> - cfi_offset (lr, 0); \
>> - cfi_def_cfa_offset (STKSPACE); \
>> - { \
>> - ADDI_PTR r12, sp, REGSIZE; \
>> - ADDI_PTR r13, sp, 2 * REGSIZE; /* set up for PUSHARGS_0 */ \
>> - }; \
>> - ST r12, r11; \
>> - PUSHARGS_##args /* save syscall args */ \
>> - CENABLE; \
>> - ADDI_PTR r12, sp, 10 * REGSIZE; \
>> - { \
>> - ST r12, r0; /* save mask */ \
>> - ADDI_PTR r13, sp, 2 * REGSIZE; /* set up for POPARGS_0 */ \
>> - }; \
>> - POPARGS_##args /* restore syscall args */ \
>> - PSEUDO_EXTRA \
>> - moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
>> - swint1; \
>> - ADDI_PTR r12, sp, 12 * REGSIZE; \
>> - { \
>> - ST r12, r1; /* save syscall result */ \
>> - ADDI_PTR r12, sp, 11 * REGSIZE; \
>> - }; \
>> - { \
>> - ST r12, r0; \
>> - ADDI_PTR r13, sp, 10 * REGSIZE; \
>> - }; \
>> - LD r0, r13; /* pass mask as arg1 */ \
>> - CDISABLE; \
>> - { \
>> - ADDI_PTR lr, sp, STKSPACE; \
>> - ADDI_PTR r0, sp, 11 * REGSIZE; \
>> - }; \
>> - { \
>> - LD r0, r0; \
>> - ADDI_PTR r1, sp, 12 * REGSIZE; \
>> - }; \
>> - LD r1, r1; \
>> - { \
>> - LD lr, lr; \
>> - ADDI_PTR sp, sp, STKSPACE; \
>> - }; \
>> - cfi_def_cfa_offset (0); \
>> - BNEZ r1, 0f
>> -
>> -# define PUSHARGS_0 /* nothing to do */
>> -# define PUSHARGS_1 PUSHARGS_0 { ADDI_PTR r14, sp, 3 * REGSIZE; ST r13, r0 };
>> -# define PUSHARGS_2 PUSHARGS_1 { ADDI_PTR r13, sp, 4 * REGSIZE; ST r14, r1 };
>> -# define PUSHARGS_3 PUSHARGS_2 { ADDI_PTR r14, sp, 5 * REGSIZE; ST r13, r2 };
>> -# define PUSHARGS_4 PUSHARGS_3 { ADDI_PTR r13, sp, 6 * REGSIZE; ST r14, r3 };
>> -# define PUSHARGS_5 PUSHARGS_4 { ADDI_PTR r14, sp, 7 * REGSIZE; ST r13, r4 };
>> -# define PUSHARGS_6 PUSHARGS_5 { ADDI_PTR r13, sp, 8 * REGSIZE; ST r14, r5 };
>> -# define PUSHARGS_7 PUSHARGS_6 { ADDI_PTR r14, sp, 9 * REGSIZE; ST r13, r6 };
>> -
>> -# define POPARGS_0 /* nothing to do */
>> -# define POPARGS_1 POPARGS_0 { ADDI_PTR r14, sp, 3 * REGSIZE; LD r0, r13 };
>> -# define POPARGS_2 POPARGS_1 { ADDI_PTR r13, sp, 4 * REGSIZE; LD r1, r14 };
>> -# define POPARGS_3 POPARGS_2 { ADDI_PTR r14, sp, 5 * REGSIZE; LD r2, r13 };
>> -# define POPARGS_4 POPARGS_3 { ADDI_PTR r13, sp, 6 * REGSIZE; LD r3, r14 };
>> -# define POPARGS_5 POPARGS_4 { ADDI_PTR r14, sp, 7 * REGSIZE; LD r4, r13 };
>> -# define POPARGS_6 POPARGS_5 { ADDI_PTR r13, sp, 8 * REGSIZE; LD r5, r14 };
>> -# define POPARGS_7 POPARGS_6 { ADDI_PTR r14, sp, 9 * REGSIZE; LD r6, r13 };
>> -
>> -# define STKSPACE (13 * REGSIZE)
>> -
>> -# if IS_IN (libpthread)
>> -# define CENABLE jal __pthread_enable_asynccancel
>> -# define CDISABLE jal __pthread_disable_asynccancel
>> -# elif IS_IN (librt)
>> -# define CENABLE jal __librt_enable_asynccancel
>> -# define CDISABLE jal __librt_disable_asynccancel
>> -# else
>> -# define CENABLE jal __libc_enable_asynccancel
>> -# define CDISABLE jal __libc_disable_asynccancel
>> -# endif
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) \
>> == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P(reg) \
>> - ADDLI_PTR reg, tp, MULTIPLE_THREADS_OFFSET; \
>> - LD reg, reg; \
>> - CMPEQI reg, reg, 0
>> -#endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P 1
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
>> index 6598010..0979bde 100644
>> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
>> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
>> @@ -24,86 +24,32 @@
>>
>> #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
>>
>> -/* The code to disable cancellation depends on the fact that the called
>> - functions are special. They don't modify registers other than %rax
>> - and %r11 if they return. Therefore we don't have to preserve other
>> - registers around these calls. */
>> -# undef PSEUDO
>> -# define PSEUDO(name, syscall_name, args) \
>> - .text; \
>> - ENTRY (name) \
>> - SINGLE_THREAD_P; \
>> - jne L(pseudo_cancel); \
>> - .type __##syscall_name##_nocancel,@function; \
>> - .globl __##syscall_name##_nocancel; \
>> - __##syscall_name##_nocancel: \
>> - DO_CALL (syscall_name, args); \
>> - cmpq $-4095, %rax; \
>> - jae SYSCALL_ERROR_LABEL; \
>> - ret; \
>> - .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
>> - L(pseudo_cancel): \
>> - /* We always have to align the stack before calling a function. */ \
>> - subq $8, %rsp; cfi_adjust_cfa_offset (8); \
>> - CENABLE \
>> - /* The return value from CENABLE is argument for CDISABLE. */ \
>> - movq %rax, (%rsp); \
>> - DO_CALL (syscall_name, args); \
>> - movq (%rsp), %rdi; \
>> - /* Save %rax since it's the error code from the syscall. */ \
>> - movq %rax, %rdx; \
>> - CDISABLE \
>> - movq %rdx, %rax; \
>> - addq $8,%rsp; cfi_adjust_cfa_offset (-8); \
>> - cmpq $-4095, %rax; \
>> - jae SYSCALL_ERROR_LABEL
>> -
>> -
>> # if IS_IN (libpthread)
>> -# define CENABLE call __pthread_enable_asynccancel;
>> -# define CDISABLE call __pthread_disable_asynccancel;
>> # define __local_multiple_threads __pthread_multiple_threads
>> # elif IS_IN (libc)
>> -# define CENABLE call __libc_enable_asynccancel;
>> -# define CDISABLE call __libc_disable_asynccancel;
>> # define __local_multiple_threads __libc_multiple_threads
>> # elif IS_IN (librt)
>> -# define CENABLE call __librt_enable_asynccancel;
>> -# define CDISABLE call __librt_disable_asynccancel;
>> # else
>> # error Unsupported library
>> # endif
>>
>> # if IS_IN (libpthread) || IS_IN (libc)
>> -# ifndef __ASSEMBLER__
>> extern int __local_multiple_threads attribute_hidden;
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (__local_multiple_threads == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P cmpl $0, __local_multiple_threads(%rip)
>> -# endif
>> -
>> # else
>> -
>> -# ifndef __ASSEMBLER__
>> -# define SINGLE_THREAD_P \
>> +# define SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -# else
>> -# define SINGLE_THREAD_P cmpl $0, %fs:MULTIPLE_THREADS_OFFSET
>> -# endif
>> -
>> # endif
>>
>> -#elif !defined __ASSEMBLER__
>> +#else
>>
>> # define SINGLE_THREAD_P (1)
>> # define NO_CANCELLATION 1
>>
>> #endif
>>
>> -#ifndef __ASSEMBLER__
>> -# define RTLD_SINGLE_THREAD_P \
>> +#define RTLD_SINGLE_THREAD_P \
>> __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
>> header.multiple_threads) == 0, 1)
>> -#endif
>>
@@ -1,5 +1,178 @@
2017-08-02 Adhemerval Zanella <adhemerval.zanella@linaro.org>
+ * sysdeps/unix/make-syscalls.sh: Remove cancellable tagging for
+ syscall definitions.
+ * sysdeps/unix/syscall-template.S (SYSCALL_CANCELLABLE): Remove
+ definition.
+ * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (__local_enable_asynccancel): Likewise.
+ [IS_IN (libpthread)] (__local_disable_asynccancel): Likewise.
+ [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
+ [IS_IN (libc)] (__local_enable_asynccancel): Likewise.
+ [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
+ [IS_IN (librt)] (__local_disable_asynccancel): Likewise.
+ (CENABLE): Likewise.
+ (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Remove
+ defintion.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h (PSEUDO):
+ Remove definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Remove file.
+ * sysdeps/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: New file.
+ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Remove file.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: New file.
+ * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Remove
+ definition.
+ (PSEUDO_END): Likewise.
+ [IS_IN (libpthread)] (CENABLE): Likewise.
+ [IS_IN (libpthread)] (CDISABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (libc)] (CENABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [IS_IN (librt)] (CDISABLE): Likewise.
+ [__ASSEMBLER__] (SINGLE_THREAD_P): Likewise.
+
* sysdeps/unix/sysv/linux/x86_64/syscalls.list (pread64): Remove.
(preadv64): Likewise.
(pwrite64(: Likewise.
@@ -12,7 +12,6 @@
#
# Syscall Signature Prefixes:
#
-# C: cancellable (i.e., this syscall is a cancellation point)
# E: errno and return value are not set by the call
# V: errno is not set, but errno or zero (success) is returned from the call
#
@@ -171,11 +170,9 @@ while read file srcfile caller syscall args strong weak; do
;;
esac
- cancellable=0
noerrno=0
errval=0
case $args in
- C*) cancellable=1; args=`echo $args | sed 's/C:\?//'`;;
E*) noerrno=1; args=`echo $args | sed 's/E:\?//'`;;
V*) errval=1; args=`echo $args | sed 's/V:\?//'`;;
esac
@@ -258,7 +255,6 @@ while read file srcfile caller syscall args strong weak; do
(echo '#define SYSCALL_NAME $syscall'; \\
echo '#define SYSCALL_NARGS $nargs'; \\
echo '#define SYSCALL_SYMBOL $strong'; \\
- echo '#define SYSCALL_CANCELLABLE $cancellable'; \\
echo '#define SYSCALL_NOERRNO $noerrno'; \\
echo '#define SYSCALL_ERRVAL $errval'; \\
echo '#include <syscall-template.S>'; \\"
@@ -27,7 +27,6 @@
SYSCALL_NAME syscall name
SYSCALL_NARGS number of arguments this call takes
SYSCALL_SYMBOL primary symbol name
- SYSCALL_CANCELLABLE 1 if the call is a cancelation point
SYSCALL_NOERRNO 1 to define a no-errno version (see below)
SYSCALL_ERRVAL 1 to define an error-value version (see below)
@@ -41,11 +40,7 @@
instructions long and the untrained eye might not distinguish them from
some compiled code that inexplicably lacks source line information. */
-#if SYSCALL_CANCELLABLE
-# include <sysdep-cancel.h>
-#else
-# include <sysdep.h>
-#endif
+#include <sysdep.h>
/* This indirection is needed so that SYMBOL gets macro-expanded. */
#define syscall_hidden_def(SYMBOL) hidden_def (SYMBOL)
@@ -24,102 +24,23 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .section ".text"; \
-ENTRY (__##syscall_name##_nocancel); \
-.Lpseudo_nocancel: \
- DO_CALL (syscall_name, args); \
-.Lpseudo_finish: \
- cmn x0, 4095; \
- b.cs .Lsyscall_error; \
- .subsection 2; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
-ENTRY (name); \
- SINGLE_THREAD_P(16); \
- cbz w16, .Lpseudo_nocancel; \
- /* Setup common stack frame no matter the number of args. \
- Also save the first arg, since it's basically free. */ \
- stp x30, x0, [sp, -64]!; \
- cfi_adjust_cfa_offset (64); \
- cfi_rel_offset (x30, 0); \
- DOCARGS_##args; /* save syscall args around CENABLE. */ \
- CENABLE; \
- mov x16, x0; /* save mask around syscall. */ \
- UNDOCARGS_##args; /* restore syscall args. */ \
- DO_CALL (syscall_name, args); \
- str x0, [sp, 8]; /* save result around CDISABLE. */ \
- mov x0, x16; /* restore mask for CDISABLE. */ \
- CDISABLE; \
- /* Break down the stack frame, restoring result at once. */ \
- ldp x30, x0, [sp], 64; \
- cfi_adjust_cfa_offset (-64); \
- cfi_restore (x30); \
- b .Lpseudo_finish; \
- cfi_endproc; \
- .size name, .-name; \
- .previous
-
-# undef PSEUDO_END
-# define PSEUDO_END(name) \
- SYSCALL_ERROR_HANDLER; \
- cfi_endproc
-
-# define DOCARGS_0
-# define DOCARGS_1
-# define DOCARGS_2 str x1, [sp, 16]
-# define DOCARGS_3 stp x1, x2, [sp, 16]
-# define DOCARGS_4 DOCARGS_3; str x3, [sp, 32]
-# define DOCARGS_5 DOCARGS_3; stp x3, x4, [sp, 32]
-# define DOCARGS_6 DOCARGS_5; str x5, [sp, 48]
-
-# define UNDOCARGS_0
-# define UNDOCARGS_1 ldr x0, [sp, 8]
-# define UNDOCARGS_2 ldp x0, x1, [sp, 8]
-# define UNDOCARGS_3 UNDOCARGS_1; ldp x1, x2, [sp, 16]
-# define UNDOCARGS_4 UNDOCARGS_2; ldp x2, x3, [sp, 24]
-# define UNDOCARGS_5 UNDOCARGS_3; ldp x3, x4, [sp, 32]
-# define UNDOCARGS_6 UNDOCARGS_4; ldp x4, x5, [sp, 40]
-
# if IS_IN (libpthread)
-# define CENABLE bl __pthread_enable_asynccancel
-# define CDISABLE bl __pthread_disable_asynccancel
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
-# define CENABLE bl __libc_enable_asynccancel
-# define CDISABLE bl __libc_disable_asynccancel
# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# define CENABLE bl __librt_enable_asynccancel
-# define CDISABLE bl __librt_disable_asynccancel
-# else
-# error Unsupported library
# endif
# if IS_IN (libpthread) || IS_IN (libc)
-# ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P(R) \
- adrp x##R, __local_multiple_threads; \
- ldr w##R, [x##R, :lo12:__local_multiple_threads]
-# endif
+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
# else
/* There is no __local_multiple_threads for librt, so use the TCB. */
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P(R) \
- mrs x##R, tpidr_el0; \
- sub x##R, x##R, PTHREAD_SIZEOF; \
- ldr w##R, [x##R, PTHREAD_MULTIPLE_THREADS_OFFSET]
-# endif
# endif
-#elif !defined __ASSEMBLER__
+#else
/* For rtld, et cetera. */
# define SINGLE_THREAD_P 1
@@ -127,8 +48,6 @@ extern int __local_multiple_threads attribute_hidden;
#endif
-#ifndef __ASSEMBLER__
# define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -17,147 +17,24 @@
#include <sysdep.h>
#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
+#include <nptl/pthreadP.h>
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-/* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END
- besides "ret". */
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .globl __##syscall_name##_nocancel; \
- .type __##syscall_name##_nocancel, @function; \
- .usepv __##syscall_name##_nocancel, std; \
- .align 4; \
- cfi_startproc; \
-__LABEL(__##syscall_name##_nocancel) \
- ldgp gp, 0(pv); \
- PSEUDO_PROF; \
-__LABEL($pseudo_nocancel) \
- PSEUDO_PREPARE_ARGS; \
- lda v0, SYS_ify(syscall_name); \
- call_pal PAL_callsys; \
- bne a3, SYSCALL_ERROR_LABEL; \
-__LABEL($pseudo_ret) \
- .subsection 2; \
- .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
- .globl name; \
- .type name, @function; \
- .usepv name, std; \
- .align 4; \
- cfi_startproc; \
-__LABEL(name) \
- ldgp gp, 0(pv); \
- PSEUDO_PROF; \
- SINGLE_THREAD_P(t0); \
- beq t0, $pseudo_nocancel; \
- subq sp, 64, sp; \
- cfi_def_cfa_offset(64); \
- stq ra, 0(sp); \
- cfi_offset(ra, -64); \
- SAVE_ARGS_##args; \
- CENABLE; \
- LOAD_ARGS_##args; \
- /* Save the CENABLE return value in RA. That register \
- is preserved across syscall and the real return \
- address is saved on the stack. */ \
- mov v0, ra; \
- lda v0, SYS_ify(syscall_name); \
- call_pal PAL_callsys; \
- stq v0, 8(sp); \
- mov ra, a0; \
- bne a3, $multi_error; \
- CDISABLE; \
- ldq ra, 0(sp); \
- ldq v0, 8(sp); \
- addq sp, 64, sp; \
- cfi_remember_state; \
- cfi_restore(ra); \
- cfi_def_cfa_offset(0); \
- ret; \
- cfi_restore_state; \
-__LABEL($multi_error) \
- CDISABLE; \
- ldq ra, 0(sp); \
- ldq v0, 8(sp); \
- addq sp, 64, sp; \
- cfi_restore(ra); \
- cfi_def_cfa_offset(0); \
- SYSCALL_ERROR_FALLTHRU; \
- SYSCALL_ERROR_HANDLER; \
- cfi_endproc; \
- .previous
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) \
- cfi_endproc; \
- .subsection 2; \
- .size sym, .-sym
-
-# define SAVE_ARGS_0 /* Nothing. */
-# define SAVE_ARGS_1 SAVE_ARGS_0; stq a0, 8(sp)
-# define SAVE_ARGS_2 SAVE_ARGS_1; stq a1, 16(sp)
-# define SAVE_ARGS_3 SAVE_ARGS_2; stq a2, 24(sp)
-# define SAVE_ARGS_4 SAVE_ARGS_3; stq a3, 32(sp)
-# define SAVE_ARGS_5 SAVE_ARGS_4; stq a4, 40(sp)
-# define SAVE_ARGS_6 SAVE_ARGS_5; stq a5, 48(sp)
-
-# define LOAD_ARGS_0 /* Nothing. */
-# define LOAD_ARGS_1 LOAD_ARGS_0; ldq a0, 8(sp)
-# define LOAD_ARGS_2 LOAD_ARGS_1; ldq a1, 16(sp)
-# define LOAD_ARGS_3 LOAD_ARGS_2; ldq a2, 24(sp)
-# define LOAD_ARGS_4 LOAD_ARGS_3; ldq a3, 32(sp)
-# define LOAD_ARGS_5 LOAD_ARGS_4; ldq a4, 40(sp)
-# define LOAD_ARGS_6 LOAD_ARGS_5; ldq a5, 48(sp)
-
# if IS_IN (libpthread)
-# define __local_enable_asynccancel __pthread_enable_asynccancel
-# define __local_disable_asynccancel __pthread_disable_asynccancel
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
-# define __local_enable_asynccancel __libc_enable_asynccancel
-# define __local_disable_asynccancel __libc_disable_asynccancel
# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# define __local_enable_asynccancel __librt_enable_asynccancel
-# define __local_disable_asynccancel __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-
-# ifdef PIC
-# define CENABLE bsr ra, __local_enable_asynccancel !samegp
-# define CDISABLE bsr ra, __local_disable_asynccancel !samegp
-# else
-# define CENABLE jsr ra, __local_enable_asynccancel; ldgp ra, 0(gp)
-# define CDISABLE jsr ra, __local_disable_asynccancel; ldgp ra, 0(gp)
# endif
# if IS_IN (libpthread) || IS_IN (libc)
-# ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (__local_multiple_threads == 0, 1)
-# elif defined(PIC)
-# define SINGLE_THREAD_P(reg) ldl reg, __local_multiple_threads(gp) !gprel
-# else
-# define SINGLE_THREAD_P(reg) \
- ldah reg, __local_multiple_threads(gp) !gprelhigh; \
- ldl reg, __local_multiple_threads(reg) !gprellow
-# endif
# else
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- call_pal PAL_rduniq; \
- ldl reg, MULTIPLE_THREADS_OFFSET($0)
-# endif
# endif
#else
@@ -167,8 +44,6 @@ extern int __local_multiple_threads attribute_hidden;
#endif
-#ifndef __ASSEMBLER__
# define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -23,210 +23,23 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-/* NOTE: We do mark syscalls with unwind annotations, for the benefit of
- cancellation; but they're really only accurate at the point of the
- syscall. The ARM unwind directives are not rich enough without adding
- a custom personality function. */
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (__##syscall_name##_nocancel); \
- CFI_SECTIONS; \
- DO_CALL (syscall_name, args); \
- cmn r0, $4096; \
- PSEUDO_RET; \
- END (__##syscall_name##_nocancel); \
- ENTRY (name); \
- SINGLE_THREAD_P; \
- DOARGS_##args; \
- bne .Lpseudo_cancel; \
- cfi_remember_state; \
- ldr r7, =SYS_ify (syscall_name); \
- swi 0x0; \
- UNDOARGS_##args; \
- cmn r0, $4096; \
- PSEUDO_RET; \
- cfi_restore_state; \
- .Lpseudo_cancel: \
- .fnstart; /* matched by the .fnend in UNDOARGS below. */ \
- DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \
- CENABLE; \
- mov ip, r0; /* put mask in safe place. */ \
- UNDOCARGS_##args; /* restore syscall args. */ \
- ldr r7, =SYS_ify (syscall_name); \
- swi 0x0; /* do the call. */ \
- mov r7, r0; /* save syscall return value. */ \
- mov r0, ip; /* get mask back. */ \
- CDISABLE; \
- mov r0, r7; /* retrieve return value. */ \
- RESTORE_LR_##args; \
- UNDOARGS_##args; \
- cmn r0, $4096
-
-/* DOARGS pushes eight bytes on the stack for five arguments, twelve bytes for
- six arguments, and four bytes for fewer. In order to preserve doubleword
- alignment, sometimes we must save an extra register. */
-
-# define RESTART_UNWIND \
- .fnend; \
- .fnstart; \
- .save {r7}; \
- .save {lr}
-
-# define DOCARGS_0 \
- .save {r7}; \
- push {lr}; \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (lr, 0); \
- .save {lr}
-# define UNDOCARGS_0
-# define RESTORE_LR_0 \
- pop {lr}; \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (lr)
-
-# define DOCARGS_1 \
- .save {r7}; \
- push {r0, r1, lr}; \
- cfi_adjust_cfa_offset (12); \
- cfi_rel_offset (lr, 8); \
- .save {lr}; \
- .pad #8
-# define UNDOCARGS_1 \
- ldr r0, [sp], #8; \
- cfi_adjust_cfa_offset (-8); \
- RESTART_UNWIND
-# define RESTORE_LR_1 \
- RESTORE_LR_0
-
-# define DOCARGS_2 \
- .save {r7}; \
- push {r0, r1, lr}; \
- cfi_adjust_cfa_offset (12); \
- cfi_rel_offset (lr, 8); \
- .save {lr}; \
- .pad #8
-# define UNDOCARGS_2 \
- pop {r0, r1}; \
- cfi_adjust_cfa_offset (-8); \
- RESTART_UNWIND
-# define RESTORE_LR_2 \
- RESTORE_LR_0
-
-# define DOCARGS_3 \
- .save {r7}; \
- push {r0, r1, r2, r3, lr}; \
- cfi_adjust_cfa_offset (20); \
- cfi_rel_offset (lr, 16); \
- .save {lr}; \
- .pad #16
-# define UNDOCARGS_3 \
- pop {r0, r1, r2, r3}; \
- cfi_adjust_cfa_offset (-16); \
- RESTART_UNWIND
-# define RESTORE_LR_3 \
- RESTORE_LR_0
-
-# define DOCARGS_4 \
- .save {r7}; \
- push {r0, r1, r2, r3, lr}; \
- cfi_adjust_cfa_offset (20); \
- cfi_rel_offset (lr, 16); \
- .save {lr}; \
- .pad #16
-# define UNDOCARGS_4 \
- pop {r0, r1, r2, r3}; \
- cfi_adjust_cfa_offset (-16); \
- RESTART_UNWIND
-# define RESTORE_LR_4 \
- RESTORE_LR_0
-
-/* r4 is only stmfd'ed for correct stack alignment. */
-# define DOCARGS_5 \
- .save {r4, r7}; \
- push {r0, r1, r2, r3, r4, lr}; \
- cfi_adjust_cfa_offset (24); \
- cfi_rel_offset (lr, 20); \
- .save {lr}; \
- .pad #20
-# define UNDOCARGS_5 \
- pop {r0, r1, r2, r3}; \
- cfi_adjust_cfa_offset (-16); \
- .fnend; \
- .fnstart; \
- .save {r4, r7}; \
- .save {lr}; \
- .pad #4
-# define RESTORE_LR_5 \
- pop {r4, lr}; \
- cfi_adjust_cfa_offset (-8); \
- /* r4 will be marked as restored later. */ \
- cfi_restore (lr)
-
-# define DOCARGS_6 \
- .save {r4, r5, r7}; \
- push {r0, r1, r2, r3, lr}; \
- cfi_adjust_cfa_offset (20); \
- cfi_rel_offset (lr, 16); \
- .save {lr}; \
- .pad #16
-# define UNDOCARGS_6 \
- pop {r0, r1, r2, r3}; \
- cfi_adjust_cfa_offset (-16); \
- .fnend; \
- .fnstart; \
- .save {r4, r5, r7}; \
- .save {lr};
-# define RESTORE_LR_6 \
- RESTORE_LR_0
-
# if IS_IN (libpthread)
-# define CENABLE bl PLTJMP(__pthread_enable_asynccancel)
-# define CDISABLE bl PLTJMP(__pthread_disable_asynccancel)
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
-# define CENABLE bl PLTJMP(__libc_enable_asynccancel)
-# define CDISABLE bl PLTJMP(__libc_disable_asynccancel)
# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# define CENABLE bl PLTJMP(__librt_enable_asynccancel)
-# define CDISABLE bl PLTJMP(__librt_disable_asynccancel)
-# else
-# error Unsupported library
# endif
# if IS_IN (libpthread) || IS_IN (libc)
-# ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- LDST_PCREL(ldr, ip, ip, __local_multiple_threads); \
- teq ip, #0
-# endif
+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
# else
/* There is no __local_multiple_threads for librt, so use the TCB. */
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- push {r0, lr}; \
- cfi_adjust_cfa_offset (8); \
- cfi_rel_offset (lr, 4); \
- GET_TLS (lr); \
- NEGOFF_ADJ_BASE (r0, MULTIPLE_THREADS_OFFSET); \
- ldr ip, NEGOFF_OFF1 (r0, MULTIPLE_THREADS_OFFSET); \
- pop {r0, lr}; \
- cfi_adjust_cfa_offset (-8); \
- cfi_restore (lr); \
- teq ip, #0
-# endif
# endif
-#elif !defined __ASSEMBLER__
+#else
/* For rtld, et cetera. */
# define SINGLE_THREAD_P 1
@@ -234,8 +47,6 @@ extern int __local_multiple_threads attribute_hidden;
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -23,215 +23,6 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# ifndef NO_ERROR
-# define NO_ERROR -0x1000
-# endif
-
-/* The syscall cancellation mechanism requires userspace
- assistance, the following code does roughly this:
-
- do arguments (read arg5 and arg6 to registers)
- setup frame
-
- check if there are threads, yes jump to pseudo_cancel
-
- unthreaded:
- syscall
- check syscall return (jump to pre_end)
- set errno
- set return to -1
- (jump to pre_end)
-
- pseudo_cancel:
- cenable
- syscall
- cdisable
- check syscall return (jump to pre_end)
- set errno
- set return to -1
-
- pre_end
- restore stack
-
- It is expected that 'ret' and 'END' macros will
- append an 'undo arguments' and 'return' to the
- this PSEUDO macro. */
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- ENTRY (__##syscall_name##_nocancel) \
- DOARGS_##args ASM_LINE_SEP \
- stwm TREG, 64(%sp) ASM_LINE_SEP \
- .cfi_def_cfa_offset -64 ASM_LINE_SEP \
- .cfi_offset TREG, 0 ASM_LINE_SEP \
- stw %sp, -4(%sp) ASM_LINE_SEP \
- stw %r19, -32(%sp) ASM_LINE_SEP \
- .cfi_offset 19, 32 ASM_LINE_SEP \
- /* Save r19 */ ASM_LINE_SEP \
- SAVE_PIC(TREG) ASM_LINE_SEP \
- /* Do syscall, delay loads # */ ASM_LINE_SEP \
- ble 0x100(%sr2,%r0) ASM_LINE_SEP \
- ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
- ldi NO_ERROR,%r1 ASM_LINE_SEP \
- cmpb,>>=,n %r1,%ret0,L(pre_nc_end) ASM_LINE_SEP \
- /* Restore r19 from TREG */ ASM_LINE_SEP \
- LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \
- SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
- /* Use TREG for temp storage */ ASM_LINE_SEP \
- copy %ret0, TREG /* delay */ ASM_LINE_SEP \
- /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \
- /* do a -1*syscall_ret0 */ ASM_LINE_SEP \
- sub %r0, TREG, TREG ASM_LINE_SEP \
- /* Store into errno location */ ASM_LINE_SEP \
- stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
- /* return -1 as error */ ASM_LINE_SEP \
- ldi -1, %ret0 ASM_LINE_SEP \
-L(pre_nc_end): ASM_LINE_SEP \
- /* No need to LOAD_PIC */ ASM_LINE_SEP \
- /* Undo frame */ ASM_LINE_SEP \
- ldwm -64(%sp),TREG ASM_LINE_SEP \
- /* Restore rp before exit */ ASM_LINE_SEP \
- ldw -20(%sp), %rp ASM_LINE_SEP \
- ret ASM_LINE_SEP \
- END(__##syscall_name##_nocancel) ASM_LINE_SEP \
- /**********************************************/ASM_LINE_SEP \
- ENTRY (name) \
- DOARGS_##args ASM_LINE_SEP \
- stwm TREG, 64(%sp) ASM_LINE_SEP \
- .cfi_def_cfa_offset -64 ASM_LINE_SEP \
- .cfi_offset TREG, 0 ASM_LINE_SEP \
- stw %sp, -4(%sp) ASM_LINE_SEP \
- stw %r19, -32(%sp) ASM_LINE_SEP \
- .cfi_offset 19, 32 ASM_LINE_SEP \
- /* Done setting up frame, continue... */ ASM_LINE_SEP \
- SINGLE_THREAD_P ASM_LINE_SEP \
- cmpib,<>,n 0,%ret0,L(pseudo_cancel) ASM_LINE_SEP \
-L(unthreaded): ASM_LINE_SEP \
- /* Save r19 */ ASM_LINE_SEP \
- SAVE_PIC(TREG) ASM_LINE_SEP \
- /* Do syscall, delay loads # */ ASM_LINE_SEP \
- ble 0x100(%sr2,%r0) ASM_LINE_SEP \
- ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
- ldi NO_ERROR,%r1 ASM_LINE_SEP \
- cmpb,>>=,n %r1,%ret0,L(pre_end) ASM_LINE_SEP \
- /* Restore r19 from TREG */ ASM_LINE_SEP \
- LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \
- SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
- /* Use TREG for temp storage */ ASM_LINE_SEP \
- copy %ret0, TREG /* delay */ ASM_LINE_SEP \
- /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \
- /* do a -1*syscall_ret0 */ ASM_LINE_SEP \
- sub %r0, TREG, TREG ASM_LINE_SEP \
- /* Store into errno location */ ASM_LINE_SEP \
- stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
- b L(pre_end) ASM_LINE_SEP \
- /* return -1 as error */ ASM_LINE_SEP \
- ldi -1, %ret0 /* delay */ ASM_LINE_SEP \
-L(pseudo_cancel): ASM_LINE_SEP \
- PUSHARGS_##args /* Save args */ ASM_LINE_SEP \
- /* Save r19 into TREG */ ASM_LINE_SEP \
- CENABLE /* FUNC CALL */ ASM_LINE_SEP \
- SAVE_PIC(TREG) /* delay */ ASM_LINE_SEP \
- /* restore syscall args */ ASM_LINE_SEP \
- POPARGS_##args ASM_LINE_SEP \
- /* save mask from cenable (use stub rp slot) */ ASM_LINE_SEP \
- stw %ret0, -24(%sp) ASM_LINE_SEP \
- /* ... SYSCALL ... */ ASM_LINE_SEP \
- ble 0x100(%sr2,%r0) ASM_LINE_SEP \
- ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \
- /* ............... */ ASM_LINE_SEP \
- LOAD_PIC(TREG) ASM_LINE_SEP \
- /* pass mask as arg0 to cdisable */ ASM_LINE_SEP \
- ldw -24(%sp), %r26 ASM_LINE_SEP \
- CDISABLE ASM_LINE_SEP \
- stw %ret0, -24(%sp) /* delay */ ASM_LINE_SEP \
- /* Restore syscall return */ ASM_LINE_SEP \
- ldw -24(%sp), %ret0 ASM_LINE_SEP \
- /* compare error */ ASM_LINE_SEP \
- ldi NO_ERROR,%r1 ASM_LINE_SEP \
- /* branch if no error */ ASM_LINE_SEP \
- cmpb,>>=,n %r1,%ret0,L(pre_end) ASM_LINE_SEP \
- LOAD_PIC(TREG) /* cond. nullify */ ASM_LINE_SEP \
- copy %ret0, TREG /* save syscall return */ ASM_LINE_SEP \
- SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
- /* make syscall res value positive */ ASM_LINE_SEP \
- sub %r0, TREG, TREG /* delay */ ASM_LINE_SEP \
- /* No need to LOAD_PIC */ ASM_LINE_SEP \
- /* store into errno location */ ASM_LINE_SEP \
- stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \
- /* return -1 */ ASM_LINE_SEP \
- ldi -1, %ret0 ASM_LINE_SEP \
-L(pre_end): ASM_LINE_SEP \
- /* No need to LOAD_PIC */ ASM_LINE_SEP \
- /* Undo frame */ ASM_LINE_SEP \
- ldwm -64(%sp),TREG ASM_LINE_SEP \
- /* Restore rp before exit */ ASM_LINE_SEP \
- ldw -20(%sp), %rp ASM_LINE_SEP
-
-/* Save arguments into our frame */
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 stw %r26, -36(%sr0,%sp) ASM_LINE_SEP \
- .cfi_offset 26, 28 ASM_LINE_SEP
-# define PUSHARGS_2 PUSHARGS_1 stw %r25, -40(%sr0,%sp) ASM_LINE_SEP \
- .cfi_offset 25, 24 ASM_LINE_SEP
-# define PUSHARGS_3 PUSHARGS_2 stw %r24, -44(%sr0,%sp) ASM_LINE_SEP \
- .cfi_offset 24, 20 ASM_LINE_SEP
-# define PUSHARGS_4 PUSHARGS_3 stw %r23, -48(%sr0,%sp) ASM_LINE_SEP \
- .cfi_offset 23, 16 ASM_LINE_SEP
-# define PUSHARGS_5 PUSHARGS_4 stw %r22, -52(%sr0,%sp) ASM_LINE_SEP \
- .cfi_offset 22, 12 ASM_LINE_SEP
-# define PUSHARGS_6 PUSHARGS_5 stw %r21, -56(%sr0,%sp) ASM_LINE_SEP \
- .cfi_offset 21, 8 ASM_LINE_SEP
-
-/* Bring them back from the stack */
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 ldw -36(%sr0,%sp), %r26 ASM_LINE_SEP
-# define POPARGS_2 POPARGS_1 ldw -40(%sr0,%sp), %r25 ASM_LINE_SEP
-# define POPARGS_3 POPARGS_2 ldw -44(%sr0,%sp), %r24 ASM_LINE_SEP
-# define POPARGS_4 POPARGS_3 ldw -48(%sr0,%sp), %r23 ASM_LINE_SEP
-# define POPARGS_5 POPARGS_4 ldw -52(%sr0,%sp), %r22 ASM_LINE_SEP
-# define POPARGS_6 POPARGS_5 ldw -56(%sr0,%sp), %r21 ASM_LINE_SEP
-
-# if IS_IN (libpthread)
-# ifdef PIC
-# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
-# else
-# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
-# endif
-# elif IS_IN (libc)
-# ifdef PIC
-# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
- bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
- bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
-# else
-# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
- bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
- bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
-# endif
-# elif IS_IN (librt)
-# ifdef PIC
-# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
- bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
- bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
-# else
-# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
- bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
- bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
-# endif
-# else
-# error Unsupported library
-# endif
-
# if IS_IN (libpthread)
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
@@ -242,17 +33,11 @@ L(pre_end): ASM_LINE_SEP \
# error Unsupported library
# endif
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-/* Read the value of header.multiple_threads from the thread pointer */
-# define SINGLE_THREAD_P \
- mfctl %cr27, %ret0 ASM_LINE_SEP \
- ldw MULTIPLE_THREADS_THREAD_OFFSET(%sr0,%ret0),%ret0 ASM_LINE_SEP
-# endif
-#elif !defined __ASSEMBLER__
+
+#else
/* This code should never be used but we define it anyhow. */
# define SINGLE_THREAD_P (1)
@@ -261,8 +46,6 @@ L(pre_end): ASM_LINE_SEP \
#endif
/* IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) */
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -24,130 +24,17 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- cmpl $0, %gs:MULTIPLE_THREADS_OFFSET; \
- jne L(pseudo_cancel); \
- .type __##syscall_name##_nocancel,@function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- DO_CALL (syscall_name, args); \
- cmpl $-4095, %eax; \
- jae SYSCALL_ERROR_LABEL; \
- ret; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- L(pseudo_cancel): \
- CENABLE \
- SAVE_OLDTYPE_##args \
- PUSHCARGS_##args \
- DOCARGS_##args \
- movl $SYS_ify (syscall_name), %eax; \
- ENTER_KERNEL; \
- POPCARGS_##args; \
- POPSTATE_##args \
- cmpl $-4095, %eax; \
- jae SYSCALL_ERROR_LABEL
-
-# define SAVE_OLDTYPE_0 movl %eax, %ecx;
-# define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0
-# define SAVE_OLDTYPE_2 pushl %eax; cfi_adjust_cfa_offset (4);
-# define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2
-# define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2
-# define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2
-# define SAVE_OLDTYPE_6 SAVE_OLDTYPE_2
-
-# define PUSHCARGS_0 /* No arguments to push. */
-# define DOCARGS_0 /* No arguments to frob. */
-# define POPCARGS_0 /* No arguments to pop. */
-# define _PUSHCARGS_0 /* No arguments to push. */
-# define _POPCARGS_0 /* No arguments to pop. */
-
-# define PUSHCARGS_1 movl %ebx, %edx; cfi_register (ebx, edx); PUSHCARGS_0
-# define DOCARGS_1 _DOARGS_1 (4)
-# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; cfi_restore (ebx);
-# define _PUSHCARGS_1 pushl %ebx; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (ebx, 0); _PUSHCARGS_0
-# define _POPCARGS_1 _POPCARGS_0; popl %ebx; \
- cfi_adjust_cfa_offset (-4); cfi_restore (ebx);
-
-# define PUSHCARGS_2 PUSHCARGS_1
-# define DOCARGS_2 _DOARGS_2 (12)
-# define POPCARGS_2 POPCARGS_1
-# define _PUSHCARGS_2 _PUSHCARGS_1
-# define _POPCARGS_2 _POPCARGS_1
-
-# define PUSHCARGS_3 _PUSHCARGS_2
-# define DOCARGS_3 _DOARGS_3 (20)
-# define POPCARGS_3 _POPCARGS_3
-# define _PUSHCARGS_3 _PUSHCARGS_2
-# define _POPCARGS_3 _POPCARGS_2
-
-# define PUSHCARGS_4 _PUSHCARGS_4
-# define DOCARGS_4 _DOARGS_4 (28)
-# define POPCARGS_4 _POPCARGS_4
-# define _PUSHCARGS_4 pushl %esi; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (esi, 0); _PUSHCARGS_3
-# define _POPCARGS_4 _POPCARGS_3; popl %esi; \
- cfi_adjust_cfa_offset (-4); cfi_restore (esi);
-
-# define PUSHCARGS_5 _PUSHCARGS_5
-# define DOCARGS_5 _DOARGS_5 (36)
-# define POPCARGS_5 _POPCARGS_5
-# define _PUSHCARGS_5 pushl %edi; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (edi, 0); _PUSHCARGS_4
-# define _POPCARGS_5 _POPCARGS_4; popl %edi; \
- cfi_adjust_cfa_offset (-4); cfi_restore (edi);
-
-# define PUSHCARGS_6 _PUSHCARGS_6
-# define DOCARGS_6 _DOARGS_6 (44)
-# define POPCARGS_6 _POPCARGS_6
-# define _PUSHCARGS_6 pushl %ebp; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (ebp, 0); _PUSHCARGS_5
-# define _POPCARGS_6 _POPCARGS_5; popl %ebp; \
- cfi_adjust_cfa_offset (-4); cfi_restore (ebp);
-
-# if IS_IN (libpthread)
-# define CENABLE call __pthread_enable_asynccancel;
-# define CDISABLE call __pthread_disable_asynccancel
-# elif IS_IN (libc)
-# define CENABLE call __libc_enable_asynccancel;
-# define CDISABLE call __libc_disable_asynccancel
-# elif IS_IN (librt)
-# define CENABLE call __librt_enable_asynccancel;
-# define CDISABLE call __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-# define POPSTATE_0 \
- pushl %eax; cfi_adjust_cfa_offset (4); movl %ecx, %eax; \
- CDISABLE; popl %eax; cfi_adjust_cfa_offset (-4);
-# define POPSTATE_1 POPSTATE_0
-# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; \
- cfi_adjust_cfa_offset (-4);
-# define POPSTATE_3 POPSTATE_2
-# define POPSTATE_4 POPSTATE_3
-# define POPSTATE_5 POPSTATE_4
-# define POPSTATE_6 POPSTATE_5
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
-# endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -23,201 +23,13 @@
#endif
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# undef PSEUDO
-
-# if IS_IN (libc)
-# define SYSDEP_CANCEL_ERRNO __libc_errno
-# else
-# define SYSDEP_CANCEL_ERRNO errno
-# endif
-# define SYSDEP_CANCEL_ERROR(args) \
-.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
- .align 32; \
- .proc __syscall_error_##args; \
- .global __syscall_error_##args; \
- .hidden __syscall_error_##args; \
- .size __syscall_error_##args, 64; \
-__syscall_error_##args: \
- .prologue; \
- .regstk args, 5, args, 0; \
- .save ar.pfs, loc0; \
- .save rp, loc1; \
- .body; \
- addl loc4 = @ltoff(@tprel(SYSDEP_CANCEL_ERRNO)), gp;; \
- ld8 loc4 = [loc4]; \
- mov rp = loc1;; \
- mov r8 = -1; \
- add loc4 = loc4, r13;; \
- st4 [loc4] = loc3; \
- mov ar.pfs = loc0
-
-# ifndef USE_DL_SYSINFO
-
-# define PSEUDO(name, syscall_name, args) \
-.text; \
-ENTRY (name) \
- adds r14 = MULTIPLE_THREADS_OFFSET, r13;; \
- ld4 r14 = [r14]; \
- mov r15 = SYS_ify(syscall_name);; \
- cmp4.ne p6, p7 = 0, r14; \
-(p6) br.cond.spnt .Lpseudo_cancel;; \
- break __BREAK_SYSCALL;; \
- cmp.eq p6,p0=-1,r10; \
-(p6) br.cond.spnt.few __syscall_error; \
- ret;; \
- .endp name; \
- .proc __GC_##name; \
- .globl __GC_##name; \
- .hidden __GC_##name; \
-__GC_##name: \
-.Lpseudo_cancel: \
- .prologue; \
- .regstk args, 5, args, 0; \
- .save ar.pfs, loc0; \
- alloc loc0 = ar.pfs, args, 5, args, 0; \
- .save rp, loc1; \
- mov loc1 = rp;; \
- .body; \
- CENABLE;; \
- mov loc2 = r8; \
- COPY_ARGS_##args \
- mov r15 = SYS_ify(syscall_name); \
- break __BREAK_SYSCALL;; \
- mov loc3 = r8; \
- mov loc4 = r10; \
- mov out0 = loc2; \
- CDISABLE;; \
- cmp.eq p6,p0=-1,loc4; \
-(p6) br.cond.spnt.few __syscall_error_##args; \
- mov r8 = loc3; \
- mov rp = loc1; \
- mov ar.pfs = loc0; \
-.Lpseudo_end: \
- ret; \
- .endp __GC_##name; \
- SYSDEP_CANCEL_ERROR(args)
-
-# else /* USE_DL_SYSINFO */
-
-# define PSEUDO(name, syscall_name, args) \
-.text; \
-ENTRY (name) \
- .prologue; \
- adds r2 = SYSINFO_OFFSET, r13; \
- adds r14 = MULTIPLE_THREADS_OFFSET, r13; \
- .save ar.pfs, r11; \
- mov r11 = ar.pfs;; \
- .body; \
- ld4 r14 = [r14]; \
- ld8 r2 = [r2]; \
- mov r15 = SYS_ify(syscall_name);; \
- cmp4.ne p6, p7 = 0, r14; \
- mov b7 = r2; \
-(p6) br.cond.spnt .Lpseudo_cancel; \
- br.call.sptk.many b6 = b7;; \
- mov ar.pfs = r11; \
- cmp.eq p6,p0 = -1, r10; \
-(p6) br.cond.spnt.few __syscall_error; \
- ret;; \
- .endp name; \
- \
- .proc __##syscall_name##_nocancel; \
- .globl __##syscall_name##_nocancel; \
-__##syscall_name##_nocancel: \
- .prologue; \
- adds r2 = SYSINFO_OFFSET, r13; \
- .save ar.pfs, r11; \
- mov r11 = ar.pfs;; \
- .body; \
- ld8 r2 = [r2]; \
- mov r15 = SYS_ify(syscall_name);; \
- mov b7 = r2; \
- br.call.sptk.many b6 = b7;; \
- mov ar.pfs = r11; \
- cmp.eq p6,p0 = -1, r10; \
-(p6) br.cond.spnt.few __syscall_error; \
- ret;; \
- .endp __##syscall_name##_nocancel; \
- \
- .proc __GC_##name; \
- .globl __GC_##name; \
- .hidden __GC_##name; \
-__GC_##name: \
-.Lpseudo_cancel: \
- .prologue; \
- .regstk args, 5, args, 0; \
- .save ar.pfs, loc0; \
- alloc loc0 = ar.pfs, args, 5, args, 0; \
- adds loc4 = SYSINFO_OFFSET, r13; \
- .save rp, loc1; \
- mov loc1 = rp;; \
- .body; \
- ld8 loc4 = [loc4]; \
- CENABLE;; \
- mov loc2 = r8; \
- mov b7 = loc4; \
- COPY_ARGS_##args \
- mov r15 = SYS_ify(syscall_name); \
- br.call.sptk.many b6 = b7;; \
- mov loc3 = r8; \
- mov loc4 = r10; \
- mov out0 = loc2; \
- CDISABLE;; \
- cmp.eq p6,p0=-1,loc4; \
-(p6) br.cond.spnt.few __syscall_error_##args; \
- mov r8 = loc3; \
- mov rp = loc1; \
- mov ar.pfs = loc0; \
-.Lpseudo_end: \
- ret; \
- .endp __GC_##name; \
- SYSDEP_CANCEL_ERROR(args)
-
-# endif /* USE_DL_SYSINFO */
-
-# undef PSEUDO_END
-# define PSEUDO_END(name) .endp
-
-# if IS_IN (libpthread)
-# define CENABLE br.call.sptk.many b0 = __pthread_enable_asynccancel
-# define CDISABLE br.call.sptk.many b0 = __pthread_disable_asynccancel
-# elif IS_IN (libc)
-# define CENABLE br.call.sptk.many b0 = __libc_enable_asynccancel
-# define CDISABLE br.call.sptk.many b0 = __libc_disable_asynccancel
-# elif IS_IN (librt)
-# define CENABLE br.call.sptk.many b0 = __librt_enable_asynccancel
-# define CDISABLE br.call.sptk.many b0 = __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-
-# define COPY_ARGS_0 /* Nothing */
-# define COPY_ARGS_1 COPY_ARGS_0 mov out0 = in0;
-# define COPY_ARGS_2 COPY_ARGS_1 mov out1 = in1;
-# define COPY_ARGS_3 COPY_ARGS_2 mov out2 = in2;
-# define COPY_ARGS_4 COPY_ARGS_3 mov out3 = in3;
-# define COPY_ARGS_5 COPY_ARGS_4 mov out4 = in4;
-# define COPY_ARGS_6 COPY_ARGS_5 mov out5 = in5;
-# define COPY_ARGS_7 COPY_ARGS_6 mov out6 = in6;
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14
-# endif
-
-#elif !defined __ASSEMBLER__
-
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION 1
-
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -18,121 +18,21 @@
#include <sysdep.h>
#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
+#include <nptl/pthreadP.h>
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- jne .Lpseudo_cancel; \
- .type __##syscall_name##_nocancel,@function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- DO_CALL (syscall_name, args); \
- cmp.l &-4095, %d0; \
- jcc SYSCALL_ERROR_LABEL; \
- rts; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- .Lpseudo_cancel: \
- CENABLE; \
- DOCARGS_##args \
- move.l %d0, -(%sp); /* Save result of CENABLE. */ \
- cfi_adjust_cfa_offset (4); \
- move.l &SYS_ify (syscall_name), %d0; \
- trap &0; \
- move.l %d0, %d2; \
- CDISABLE; \
- addq.l &4, %sp; /* Remove result of CENABLE from the stack. */ \
- cfi_adjust_cfa_offset (-4); \
- move.l %d2, %d0; \
- UNDOCARGS_##args \
- cmp.l &-4095, %d0; \
- jcc SYSCALL_ERROR_LABEL
-
-/* Note: we use D2 to save syscall's return value as D0 will be clobbered in
- CDISABLE. */
-# define DOCARGS_0 move.l %d2, -(%sp); \
- cfi_adjust_cfa_offset (4); cfi_rel_offset (%d2, 0);
-# define UNDOCARGS_0 move.l (%sp)+, %d2; \
- cfi_adjust_cfa_offset (-4); cfi_restore (%d2);
-
-# define DOCARGS_1 _DOCARGS_1 (4); DOCARGS_0
-# define _DOCARGS_1(n) move.l n(%sp), %d1;
-# define UNDOCARGS_1 UNDOCARGS_0
-
-# define DOCARGS_2 _DOCARGS_2 (8)
-# define _DOCARGS_2(n) DOCARGS_0 move.l n+4(%sp), %d2; _DOCARGS_1 (n)
-# define UNDOCARGS_2 UNDOCARGS_0
-
-# define DOCARGS_3 _DOCARGS_3 (12)
-# define _DOCARGS_3(n) move.l %d3, -(%sp); \
- cfi_adjust_cfa_offset (4); cfi_rel_offset (%d3, 0); \
- move.l n+4(%sp), %d3; _DOCARGS_2 (n)
-# define UNDOCARGS_3 UNDOCARGS_2 move.l (%sp)+, %d3; \
- cfi_adjust_cfa_offset (-4); cfi_restore (%d3);
-
-# define DOCARGS_4 _DOCARGS_4 (16)
-# define _DOCARGS_4(n) move.l %d4, -(%sp); \
- cfi_adjust_cfa_offset (4); cfi_rel_offset (%d4, 0); \
- move.l n+4(%sp), %d4; _DOCARGS_3 (n)
-# define UNDOCARGS_4 UNDOCARGS_3 move.l (%sp)+, %d4; \
- cfi_adjust_cfa_offset (-4); cfi_restore (%d4);
-
-# define DOCARGS_5 _DOCARGS_5 (20)
-# define _DOCARGS_5(n) move.l %d5, -(%sp); \
- cfi_adjust_cfa_offset (4); cfi_rel_offset (%d5, 0); \
- move.l n+4(%sp), %d5; _DOCARGS_4 (n)
-# define UNDOCARGS_5 UNDOCARGS_4 move.l (%sp)+, %d5; \
- cfi_adjust_cfa_offset (-4); cfi_restore (%d5);
-
-# define DOCARGS_6 _DOCARGS_6 (24)
-# define _DOCARGS_6(n) move.l n(%sp), %a0; _DOCARGS_5 (n-4)
-# define UNDOCARGS_6 UNDOCARGS_5
-
-# ifdef PIC
-# define PSEUDO_JMP(sym) jbsr sym ## @PLTPC
-# else
-# define PSEUDO_JMP(sym) jbsr sym
-# endif
-
-# if IS_IN (libpthread)
-# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
-# elif IS_IN (libc)
-# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
-# elif IS_IN (librt)
-# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
-# else
-# error Unsupported library
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- PSEUDO_JMP (__m68k_read_tp); \
- tst.l MULTIPLE_THREADS_OFFSET(%a0)
-# endif
-
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION (1)
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, \
1)
-#endif
@@ -23,136 +23,28 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# if !IS_IN (librt) || !defined(PIC)
-# define AC_STACK_SIZE 16 /* space for r15, async_cancel arg and 2 temp words */
-# define AC_SET_GOT /* empty */
-# define AC_RESTORE_GOT /* empty */
-# else
-# define AC_STACK_SIZE 20 /* extra 4 bytes for r20 */
-# define AC_SET_GOT \
- swi r20, r1, AC_STACK_SIZE-4; \
- mfs r20, rpc; \
- addik r20, r20, _GLOBAL_OFFSET_TABLE_+8;
-# define AC_RESTORE_GOT \
- lwi r20, r1, AC_STACK_SIZE-4;
-# endif
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- SINGLE_THREAD_P(r12); \
- bnei r12, L(pseudo_cancel); \
- .globl __##syscall_name##_nocancel; \
- .type __##syscall_name##_nocancel,@function; \
-__##syscall_name##_nocancel: \
- DO_CALL (syscall_name, args); \
- addik r4, r0, -4095; \
- cmpu r4, r4, r3; \
- bgei r4, SYSCALL_ERROR_LABEL; \
- rtsd r15, 8; \
- nop; \
- .size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
-L(pseudo_cancel): \
- addik r1, r1, -AC_STACK_SIZE; \
- swi r15, r1, 0; \
- AC_SET_GOT \
- DOCARGS_##args \
- CENABLE; \
- swi r3, r1, 8; \
- UNDOCARGS_##args \
- DO_CALL (syscall_name, args); \
- swi r3, r1, 12; \
- lwi r5, r1, 8; \
- CDISABLE; \
- lwi r3, r1, 12; \
- lwi r15, r1, 0; \
- AC_RESTORE_GOT \
- addik r1, r1, AC_STACK_SIZE; \
- addik r4, r0, -4095; \
- cmpu r4, r4, r3; \
- bgei r4, SYSCALL_ERROR_LABEL; \
- rtsd r15, 8; \
- nop;
-
-/*
- * Macros to save/restore syscall arguments across CENABLE
- * The arguments are saved into the caller's stack (original r1 + 4)
- */
-
-# define DOCARGS_0
-# define DOCARGS_1 swi r5, r1, AC_STACK_SIZE + 4;
-# define DOCARGS_2 swi r6, r1, AC_STACK_SIZE + 8; DOCARGS_1
-# define DOCARGS_3 swi r7, r1, AC_STACK_SIZE + 12; DOCARGS_2
-# define DOCARGS_4 swi r8, r1, AC_STACK_SIZE + 16; DOCARGS_3
-# define DOCARGS_5 swi r9, r1, AC_STACK_SIZE + 20; DOCARGS_4
-# define DOCARGS_6 swi r10, r1, AC_STACK_SIZE + 24; DOCARGS_5
-
-# define UNDOCARGS_0
-# define UNDOCARGS_1 lwi r5, r1, AC_STACK_SIZE + 4;
-# define UNDOCARGS_2 UNDOCARGS_1 lwi r6, r1, AC_STACK_SIZE + 8;
-# define UNDOCARGS_3 UNDOCARGS_2 lwi r7, r1, AC_STACK_SIZE + 12;
-# define UNDOCARGS_4 UNDOCARGS_3 lwi r8, r1, AC_STACK_SIZE + 16;
-# define UNDOCARGS_5 UNDOCARGS_4 lwi r9, r1, AC_STACK_SIZE + 20;
-# define UNDOCARGS_6 UNDOCARGS_5 lwi r10, r1, AC_STACK_SIZE + 24;
-
-# ifdef PIC
-# define PSEUDO_JMP(sym) brlid r15, sym##@PLTPC; addk r0, r0, r0
-# else
-# define PSEUDO_JMP(sym) brlid r15, sym; addk r0, r0, r0
-# endif
-
# if IS_IN (libpthread)
-# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
-# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
-# else
-# error Unsupported library
# endif
-
# if IS_IN (libpthread) || IS_IN (libc)
-# ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# if !defined PIC
-# define SINGLE_THREAD_P(reg) lwi reg, r0, __local_multiple_threads;
-# else
-# define SINGLE_THREAD_P(reg) \
- mfs reg, rpc; \
- addik reg, reg, _GLOBAL_OFFSET_TABLE_+8; \
- lwi reg, reg, __local_multiple_threads@GOT; \
- lwi reg, reg, 0;
-# endif
-# endif
+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
# else
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- lwi reg, r0, MULTIPLE_THREADS_OFFSET(reg)
-# endif
# endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION (1)
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
deleted file mode 100644
@@ -1,249 +0,0 @@
-/* Copyright (C) 2003-2017 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>
-#include <sysdeps/generic/sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-#include <sys/asm.h>
-
-/* Gas will put the initial save of $gp into the CIE, because it appears to
- happen before any instructions. So we use cfi_same_value instead of
- cfi_restore. */
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-#ifdef __PIC__
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .align 2; \
- L(pseudo_start): \
- cfi_startproc; \
- cfi_adjust_cfa_offset (STKSPACE); \
- cfi_rel_offset (gp, STKOFF_GP); \
- 99: PTR_LA t9,__syscall_error; \
- /* manual cpreturn */ \
- REG_L gp, STKOFF_GP(sp); \
- cfi_same_value (gp); \
- RESTORESTK; \
- jr t9; \
- .type __##syscall_name##_nocancel, @function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- SAVESTK; \
- .cpsetup t9, STKOFF_GP, __##syscall_name##_nocancel; \
- cfi_rel_offset (gp, STKOFF_GP); \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- /* manual cpreturn */ \
- REG_L gp, STKOFF_GP(sp); \
- cfi_same_value (gp); \
- RESTORESTK; \
- ret; \
- cfi_endproc; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- ENTRY (name) \
- SAVESTK; \
- .cpsetup t9, STKOFF_GP, name; \
- cfi_rel_offset (gp, STKOFF_GP); \
- SINGLE_THREAD_P(v1); \
- bne zero, v1, L(pseudo_cancel); \
- .set noreorder; \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- .set reorder; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- /* manual cpreturn */ \
- REG_L gp, STKOFF_GP(sp); \
- cfi_same_value (gp); \
- RESTORESTK; \
- ret; \
- L(pseudo_cancel): \
- cfi_adjust_cfa_offset (STKSPACE); \
- cfi_rel_offset (gp, STKOFF_GP); \
- REG_S ra, STKOFF_RA(sp); \
- cfi_rel_offset (ra, STKOFF_RA); \
- PUSHARGS_##args; /* save syscall args */ \
- CENABLE; \
- REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
- POPARGS_##args; /* restore syscall args */ \
- .set noreorder; \
- li v0, SYS_ify (syscall_name); \
- syscall; \
- .set reorder; \
- REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
- REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
- REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
- CDISABLE; \
- REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
- REG_L ra, STKOFF_RA(sp); /* restore return address */ \
- REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- /* manual cpreturn */ \
- REG_L gp, STKOFF_GP(sp); \
- cfi_same_value (gp); \
- RESTORESTK; \
- L(pseudo_end):
-#else
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .align 2; \
- L(pseudo_start): \
- cfi_startproc; \
- cfi_adjust_cfa_offset (STKSPACE); \
- 99: RESTORESTK; \
- j __syscall_error; \
- .type __##syscall_name##_nocancel, @function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- SAVESTK; \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- RESTORESTK; \
- ret; \
- cfi_endproc; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- ENTRY (name) \
- SAVESTK; \
- SINGLE_THREAD_P(v1); \
- bne zero, v1, L(pseudo_cancel); \
- .set noreorder; \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- .set reorder; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- RESTORESTK; \
- ret; \
- L(pseudo_cancel): \
- cfi_adjust_cfa_offset (STKSPACE); \
- REG_S ra, STKOFF_RA(sp); \
- cfi_rel_offset (ra, STKOFF_RA); \
- PUSHARGS_##args; /* save syscall args */ \
- CENABLE; \
- REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
- POPARGS_##args; /* restore syscall args */ \
- .set noreorder; \
- li v0, SYS_ify (syscall_name); \
- syscall; \
- .set reorder; \
- REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
- REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
- REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
- CDISABLE; \
- REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
- REG_L ra, STKOFF_RA(sp); /* restore return address */ \
- REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- RESTORESTK; \
- L(pseudo_end):
-#endif
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
-
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 REG_S a0, STKOFF_A0(sp); cfi_rel_offset (a0, STKOFF_A0);
-# define PUSHARGS_2 PUSHARGS_1 REG_S a1, STKOFF_A1(sp); cfi_rel_offset (a1, STKOFF_A1);
-# define PUSHARGS_3 PUSHARGS_2 REG_S a2, STKOFF_A2(sp); cfi_rel_offset (a2, STKOFF_A2);
-# define PUSHARGS_4 PUSHARGS_3 REG_S a3, STKOFF_A3(sp); cfi_rel_offset (a3, STKOFF_A3);
-# define PUSHARGS_5 PUSHARGS_4 REG_S a4, STKOFF_A4(sp); cfi_rel_offset (a3, STKOFF_A4);
-# define PUSHARGS_6 PUSHARGS_5 REG_S a5, STKOFF_A5(sp); cfi_rel_offset (a3, STKOFF_A5);
-
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 REG_L a0, STKOFF_A0(sp);
-# define POPARGS_2 POPARGS_1 REG_L a1, STKOFF_A1(sp);
-# define POPARGS_3 POPARGS_2 REG_L a2, STKOFF_A2(sp);
-# define POPARGS_4 POPARGS_3 REG_L a3, STKOFF_A3(sp);
-# define POPARGS_5 POPARGS_4 REG_L a4, STKOFF_A4(sp);
-# define POPARGS_6 POPARGS_5 REG_L a5, STKOFF_A5(sp);
-
-/* Save an even number of slots. Should be 0 if an even number of slots
- are used below, or SZREG if an odd number are used. */
-# ifdef __PIC__
-# define STK_PAD SZREG
-# else
-# define STK_PAD 0
-# endif
-
-/* Place values that we are more likely to use later in this sequence, i.e.
- closer to the SP at function entry. If you do that, the are more
- likely to already be in your d-cache. */
-# define STKOFF_A5 (STK_PAD)
-# define STKOFF_A4 (STKOFF_A5 + SZREG)
-# define STKOFF_A3 (STKOFF_A4 + SZREG)
-# define STKOFF_A2 (STKOFF_A3 + SZREG) /* MT and more args. */
-# define STKOFF_A1 (STKOFF_A2 + SZREG) /* MT and 2 args. */
-# define STKOFF_A0 (STKOFF_A1 + SZREG) /* MT and 1 arg. */
-# define STKOFF_RA (STKOFF_A0 + SZREG) /* Used if MT. */
-# define STKOFF_SC_V0 (STKOFF_RA + SZREG) /* Used if MT. */
-# define STKOFF_SC_ERR (STKOFF_SC_V0 + SZREG) /* Used if MT. */
-# define STKOFF_SVMSK (STKOFF_SC_ERR + SZREG) /* Used if MT. */
-
-# ifdef __PIC__
-# define STKOFF_GP (STKOFF_SVMSK + SZREG) /* Always used. */
-# define STKSPACE (STKOFF_GP + SZREG)
-# else
-# define STKSPACE (STKOFF_SVMSK + SZREG)
-# endif
-
-# define SAVESTK PTR_SUBU sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE)
-# define RESTORESTK PTR_ADDU sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE)
-
-# ifdef __PIC__
-# define PSEUDO_JMP(sym) PTR_LA t9, sym; jalr t9
-# else
-# define PSEUDO_JMP(sym) jal sym
-# endif
-
-# if IS_IN (libpthread)
-# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
-# elif IS_IN (librt)
-# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
-# else
-# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) \
- == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- READ_THREAD_POINTER(reg); \
- lw reg, MULTIPLE_THREADS_OFFSET(reg)
-#endif
-
-#elif !defined __ASSEMBLER__
-
-# define SINGLE_THREAD_P 1
-# define NO_CANCELLATION 1
-
-#endif
-
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#endif
@@ -18,173 +18,22 @@
#include <sysdep.h>
#include <sysdeps/generic/sysdep.h>
#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
+#include <nptl/pthreadP.h>
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# ifdef __PIC__
-# define PSEUDO_CPLOAD .cpload t9;
-# define PSEUDO_ERRJMP la t9, __syscall_error; jr t9;
-# define PSEUDO_SAVEGP sw gp, 32(sp); cfi_rel_offset (gp, 32);
-# define PSEUDO_LOADGP lw gp, 32(sp);
-# else
-# define PSEUDO_CPLOAD
-# define PSEUDO_ERRJMP j __syscall_error;
-# define PSEUDO_SAVEGP
-# define PSEUDO_LOADGP
-# endif
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .align 2; \
- .set nomips16; \
- L(pseudo_start): \
- cfi_startproc; \
- 99: PSEUDO_ERRJMP \
- .type __##syscall_name##_nocancel, @function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- .set noreorder; \
- PSEUDO_CPLOAD \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- .set reorder; \
- bne a3, zero, 99b; \
- ret; \
- cfi_endproc; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- ENTRY (name) \
- .set noreorder; \
- PSEUDO_CPLOAD \
- .set reorder; \
- SINGLE_THREAD_P(v1); \
- bne zero, v1, L(pseudo_cancel); \
- .set noreorder; \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- .set reorder; \
- bne a3, zero, 99b; \
- ret; \
- L(pseudo_cancel): \
- SAVESTK_##args; \
- sw ra, 28(sp); \
- cfi_rel_offset (ra, 28); \
- PSEUDO_SAVEGP \
- PUSHARGS_##args; /* save syscall args */ \
- CENABLE; \
- PSEUDO_LOADGP \
- sw v0, 44(sp); /* save mask */ \
- POPARGS_##args; /* restore syscall args */ \
- .set noreorder; \
- li v0, SYS_ify (syscall_name); \
- syscall; \
- .set reorder; \
- sw v0, 36(sp); /* save syscall result */ \
- sw a3, 40(sp); /* save syscall error flag */ \
- lw a0, 44(sp); /* pass mask as arg1 */ \
- CDISABLE; \
- PSEUDO_LOADGP \
- lw v0, 36(sp); /* restore syscall result */ \
- lw a3, 40(sp); /* restore syscall error flag */ \
- lw ra, 28(sp); /* restore return address */ \
- .set noreorder; \
- bne a3, zero, 99b; \
- RESTORESTK; \
- L(pseudo_end): \
- .set reorder;
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
-
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 sw a0, 0(sp); cfi_rel_offset (a0, 0);
-# define PUSHARGS_2 PUSHARGS_1 sw a1, 4(sp); cfi_rel_offset (a1, 4);
-# define PUSHARGS_3 PUSHARGS_2 sw a2, 8(sp); cfi_rel_offset (a2, 8);
-# define PUSHARGS_4 PUSHARGS_3 sw a3, 12(sp); cfi_rel_offset (a3, 12);
-# define PUSHARGS_5 PUSHARGS_4 /* handled by SAVESTK_## */
-# define PUSHARGS_6 PUSHARGS_5
-# define PUSHARGS_7 PUSHARGS_6
-
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 lw a0, 0(sp);
-# define POPARGS_2 POPARGS_1 lw a1, 4(sp);
-# define POPARGS_3 POPARGS_2 lw a2, 8(sp);
-# define POPARGS_4 POPARGS_3 lw a3, 12(sp);
-# define POPARGS_5 POPARGS_4 /* args already in new stackframe */
-# define POPARGS_6 POPARGS_5
-# define POPARGS_7 POPARGS_6
-
-
-# define STKSPACE 48
-# define SAVESTK_0 subu sp, STKSPACE; cfi_adjust_cfa_offset(STKSPACE)
-# define SAVESTK_1 SAVESTK_0
-# define SAVESTK_2 SAVESTK_1
-# define SAVESTK_3 SAVESTK_2
-# define SAVESTK_4 SAVESTK_3
-# define SAVESTK_5 lw t0, 16(sp); \
- SAVESTK_0; \
- sw t0, 16(sp)
-
-# define SAVESTK_6 lw t0, 16(sp); \
- lw t1, 20(sp); \
- SAVESTK_0; \
- sw t0, 16(sp); \
- sw t1, 20(sp)
-
-# define SAVESTK_7 lw t0, 16(sp); \
- lw t1, 20(sp); \
- lw t2, 24(sp); \
- SAVESTK_0; \
- sw t0, 16(sp); \
- sw t1, 20(sp); \
- sw t2, 24(sp)
-
-# define RESTORESTK addu sp, STKSPACE; cfi_adjust_cfa_offset(-STKSPACE)
-
-
-# ifdef __PIC__
-/* We use jalr rather than jal. This means that the assembler will not
- automatically restore $gp (in case libc has multiple GOTs) so we must
- do it manually - which we have to do anyway since we don't use .cprestore.
- It also shuts up the assembler warning about not using .cprestore. */
-# define PSEUDO_JMP(sym) la t9, sym; jalr t9;
-# else
-# define PSEUDO_JMP(sym) jal sym;
-# endif
-
-# if IS_IN (libpthread)
-# define CENABLE PSEUDO_JMP (__pthread_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__pthread_disable_asynccancel)
-# elif IS_IN (librt)
-# define CENABLE PSEUDO_JMP (__librt_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__librt_disable_asynccancel)
-# else
-# define CENABLE PSEUDO_JMP (__libc_enable_asynccancel)
-# define CDISABLE PSEUDO_JMP (__libc_disable_asynccancel)
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) \
== 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- READ_THREAD_POINTER(reg); \
- lw reg, MULTIPLE_THREADS_OFFSET(reg)
-#endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P 1
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -18,124 +18,22 @@
#include <sysdep.h>
#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
+#include <nptl/pthreadP.h>
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .type __##syscall_name##_nocancel, @function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- cfi_startproc; \
- DO_CALL (syscall_name, args); \
- bne r7, zero, SYSCALL_ERROR_LABEL; \
- ret; \
- cfi_endproc; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- ENTRY (name) \
- SINGLE_THREAD_P(r2); \
- bne r2, zero, pseudo_cancel; \
- DO_CALL (syscall_name, args); \
- bne r7, zero, SYSCALL_ERROR_LABEL; \
- ret; \
- pseudo_cancel: \
- SAVESTK_##args; /* save syscall args and adjust stack */ \
- SAVEREG(ra, 0); /* save return address */ \
- SAVEREG(r22, 4); /* save GOT pointer */ \
- nextpc r22; \
-1: movhi r2, %hiadj(_gp_got - 1b); \
- addi r2, r2, %lo(_gp_got - 1b); \
- add r22, r22, r2; \
- CENABLE; \
- callr r3; \
- stw r2, 8(sp); /* save mask */ \
- LOADARGS_##args; \
- movi r2, SYS_ify(syscall_name); \
- trap; \
- stw r2, 12(sp); /* save syscall result */ \
- stw r7, 16(sp); /* save syscall error flag */ \
- ldw r4, 8(sp); /* pass mask as argument 1 */ \
- CDISABLE; \
- callr r3; \
- ldw r7, 16(sp); /* restore syscall error flag */ \
- ldw r2, 12(sp); /* restore syscall result */ \
- ldw ra, 0(sp); /* restore return address */ \
- ldw r22, 4(sp); /* restore GOT pointer */ \
- RESTORESTK_##args; \
- bne r7, zero, SYSCALL_ERROR_LABEL;
-
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) \
- SYSCALL_ERROR_HANDLER \
- END (sym)
-
-#define SAVEREG(REG, LOC) stw REG, LOC(sp); cfi_rel_offset (REG, LOC)
-#define SAVESTK(X) subi sp, sp, X; cfi_adjust_cfa_offset(X)
-#define SAVESTK_0 SAVESTK(20)
-#define SAVEARG_1 SAVEREG(r4, 20)
-#define SAVESTK_1 SAVESTK(24); SAVEARG_1
-#define SAVEARG_2 SAVEREG(r5, 24); SAVEARG_1
-#define SAVESTK_2 SAVESTK(28); SAVEARG_2
-#define SAVEARG_3 SAVEREG(r6, 28); SAVEARG_2
-#define SAVESTK_3 SAVESTK(32); SAVEARG_3
-#define SAVEARG_4 SAVEREG(r7, 32); SAVEARG_3
-#define SAVESTK_4 SAVESTK(36); SAVEARG_4
-#define SAVESTK_5 SAVESTK_4
-#define SAVESTK_6 SAVESTK_5
-
-#define LOADARGS_0
-#define LOADARGS_1 ldw r4, 20(sp)
-#define LOADARGS_2 LOADARGS_1; ldw r5, 24(sp)
-#define LOADARGS_3 LOADARGS_2; ldw r6, 28(sp)
-#define LOADARGS_4 LOADARGS_3; ldw r7, 32(sp)
-#define LOADARGS_5 LOADARGS_4; ldw r8, 36(sp)
-#define LOADARGS_6 LOADARGS_5; ldw r9, 40(sp)
-
-#define RESTORESTK(X) addi sp, sp, X; cfi_adjust_cfa_offset(-X)
-#define RESTORESTK_0 RESTORESTK(20)
-#define RESTORESTK_1 RESTORESTK(24)
-#define RESTORESTK_2 RESTORESTK(28)
-#define RESTORESTK_3 RESTORESTK(32)
-#define RESTORESTK_4 RESTORESTK(36)
-#define RESTORESTK_5 RESTORESTK(36)
-#define RESTORESTK_6 RESTORESTK(36)
-
-# if IS_IN (libpthread)
-# define CENABLE ldw r3, %call(__pthread_enable_asynccancel)(r22)
-# define CDISABLE ldw r3, %call(__pthread_disable_asynccancel)(r22)
-# elif IS_IN (librt)
-# define CENABLE ldw r3, %call(__librt_enable_asynccancel)(r22)
-# define CDISABLE ldw r3, %call(__librt_disable_asynccancel)(r22)
-# elif IS_IN (libc)
-# define CENABLE ldw r3, %call(__libc_enable_asynccancel)(r22)
-# define CDISABLE ldw r3, %call(__libc_disable_asynccancel)(r22)
-# else
-# error Unsupported library
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) \
== 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- ldw reg, MULTIPLE_THREADS_OFFSET(r23)
-#endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P 1
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
deleted file mode 100644
@@ -1,118 +0,0 @@
-/* Cancellable system call stubs. Linux/PowerPC version.
- Copyright (C) 2003-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- bne- .Lpseudo_cancel; \
- .type __##syscall_name##_nocancel,@function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- DO_CALL (SYS_ify (syscall_name)); \
- PSEUDO_RET; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- .Lpseudo_cancel: \
- stwu 1,-48(1); \
- cfi_adjust_cfa_offset (48); \
- mflr 9; \
- stw 9,52(1); \
- cfi_offset (lr, 4); \
- DOCARGS_##args; /* save syscall args around CENABLE. */ \
- CENABLE; \
- stw 3,16(1); /* store CENABLE return value (MASK). */ \
- UNDOCARGS_##args; /* restore syscall args. */ \
- DO_CALL (SYS_ify (syscall_name)); \
- mfcr 0; /* save CR/R3 around CDISABLE. */ \
- stw 3,8(1); \
- stw 0,12(1); \
- lwz 3,16(1); /* pass MASK to CDISABLE. */ \
- CDISABLE; \
- lwz 4,52(1); \
- lwz 0,12(1); /* restore CR/R3. */ \
- lwz 3,8(1); \
- mtlr 4; \
- mtcr 0; \
- addi 1,1,48;
-
-# define DOCARGS_0
-# define UNDOCARGS_0
-
-# define DOCARGS_1 stw 3,20(1); DOCARGS_0
-# define UNDOCARGS_1 lwz 3,20(1); UNDOCARGS_0
-
-# define DOCARGS_2 stw 4,24(1); DOCARGS_1
-# define UNDOCARGS_2 lwz 4,24(1); UNDOCARGS_1
-
-# define DOCARGS_3 stw 5,28(1); DOCARGS_2
-# define UNDOCARGS_3 lwz 5,28(1); UNDOCARGS_2
-
-# define DOCARGS_4 stw 6,32(1); DOCARGS_3
-# define UNDOCARGS_4 lwz 6,32(1); UNDOCARGS_3
-
-# define DOCARGS_5 stw 7,36(1); DOCARGS_4
-# define UNDOCARGS_5 lwz 7,36(1); UNDOCARGS_4
-
-# define DOCARGS_6 stw 8,40(1); DOCARGS_5
-# define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5
-
-# if IS_IN (libpthread)
-# define CENABLE bl __pthread_enable_asynccancel@local
-# define CDISABLE bl __pthread_disable_asynccancel@local
-# elif IS_IN (libc)
-# define CENABLE bl __libc_enable_asynccancel@local
-# define CDISABLE bl __libc_disable_asynccancel@local
-# elif IS_IN (librt)
-# define CENABLE bl __librt_enable_asynccancel@local
-# define CDISABLE bl __librt_disable_asynccancel@local
-# else
-# error Unsupported library
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- lwz 10,MULTIPLE_THREADS_OFFSET(2); \
- cmpwi 10,0
-# endif
-
-#elif !defined __ASSEMBLER__
-
-# define SINGLE_THREAD_P (1)
-# define NO_CANCELLATION 1
-
-#endif
-
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#endif
deleted file mode 100644
@@ -1,147 +0,0 @@
-/* Cancellable system call stubs. Linux/PowerPC64 version.
- Copyright (C) 2003-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define DASHDASHPFX(str) __##str
-
-#if _CALL_ELF == 2
-#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16+48)
-#define CANCEL_PARM_SAVE (FRAME_MIN_SIZE+16)
-#else
-#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16)
-#define CANCEL_PARM_SAVE (CANCEL_FRAMESIZE+FRAME_PARM_SAVE)
-#endif
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- bne- .Lpseudo_cancel; \
- .type DASHDASHPFX(syscall_name##_nocancel),@function; \
- .globl DASHDASHPFX(syscall_name##_nocancel); \
- DASHDASHPFX(syscall_name##_nocancel): \
- DO_CALL (SYS_ify (syscall_name)); \
- PSEUDO_RET; \
- .size DASHDASHPFX(syscall_name##_nocancel),.-DASHDASHPFX(syscall_name##_nocancel); \
- .Lpseudo_cancel: \
- stdu 1,-CANCEL_FRAMESIZE(1); \
- cfi_adjust_cfa_offset (CANCEL_FRAMESIZE); \
- mflr 9; \
- std 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \
- cfi_offset (lr, FRAME_LR_SAVE); \
- DOCARGS_##args; /* save syscall args around CENABLE. */ \
- CENABLE; \
- std 3,FRAME_MIN_SIZE(1); /* store CENABLE return value (MASK). */ \
- UNDOCARGS_##args; /* restore syscall args. */ \
- DO_CALL (SYS_ify (syscall_name)); \
- mfcr 0; /* save CR/R3 around CDISABLE. */ \
- std 3,FRAME_MIN_SIZE+8(1); \
- std 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); \
- cfi_offset (cr, FRAME_CR_SAVE); \
- ld 3,FRAME_MIN_SIZE(1); /* pass MASK to CDISABLE. */ \
- CDISABLE; \
- ld 9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1); \
- ld 0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); /* restore CR/R3. */ \
- ld 3,FRAME_MIN_SIZE+8(1); \
- mtlr 9; \
- mtcr 0; \
- addi 1,1,CANCEL_FRAMESIZE; \
- cfi_adjust_cfa_offset (-CANCEL_FRAMESIZE); \
- cfi_restore (lr); \
- cfi_restore (cr)
-
-# define DOCARGS_0
-# define UNDOCARGS_0
-
-# define DOCARGS_1 std 3,CANCEL_PARM_SAVE(1); DOCARGS_0
-# define UNDOCARGS_1 ld 3,CANCEL_PARM_SAVE(1); UNDOCARGS_0
-
-# define DOCARGS_2 std 4,CANCEL_PARM_SAVE+8(1); DOCARGS_1
-# define UNDOCARGS_2 ld 4,CANCEL_PARM_SAVE+8(1); UNDOCARGS_1
-
-# define DOCARGS_3 std 5,CANCEL_PARM_SAVE+16(1); DOCARGS_2
-# define UNDOCARGS_3 ld 5,CANCEL_PARM_SAVE+16(1); UNDOCARGS_2
-
-# define DOCARGS_4 std 6,CANCEL_PARM_SAVE+24(1); DOCARGS_3
-# define UNDOCARGS_4 ld 6,CANCEL_PARM_SAVE+24(1); UNDOCARGS_3
-
-# define DOCARGS_5 std 7,CANCEL_PARM_SAVE+32(1); DOCARGS_4
-# define UNDOCARGS_5 ld 7,CANCEL_PARM_SAVE+32(1); UNDOCARGS_4
-
-# define DOCARGS_6 std 8,CANCEL_PARM_SAVE+40(1); DOCARGS_5
-# define UNDOCARGS_6 ld 8,CANCEL_PARM_SAVE+40(1); UNDOCARGS_5
-
-# if IS_IN (libpthread)
-# ifdef SHARED
-# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel)
-# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel)
-# else
-# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel); nop
-# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel); nop
-# endif
-# elif IS_IN (libc)
-# ifdef SHARED
-# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel)
-# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel)
-# else
-# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel); nop
-# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel); nop
-# endif
-# elif IS_IN (librt)
-# ifdef SHARED
-# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel)
-# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel)
-# else
-# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel); nop
-# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel); nop
-# endif
-# else
-# error Unsupported library
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- lwz 10,MULTIPLE_THREADS_OFFSET(13); \
- cmpwi 10,0
-# endif
-
-#elif !defined __ASSEMBLER__
-
-# define SINGLE_THREAD_P (1)
-# define NO_CANCELLATION 1
-
-#endif
-
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#endif
new file mode 100644
@@ -0,0 +1,38 @@
+/* Cancellable system call stubs. Linux/PowerPC version.
+ 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 <sysdep.h>
+#include <tls.h>
+#include <nptl/pthreadP.h>
+
+#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
+
+# define SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0, 1)
+
+#else
+
+# define SINGLE_THREAD_P (1)
+# define NO_CANCELLATION 1
+
+#endif
+
+#define RTLD_SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0, 1)
@@ -24,116 +24,17 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
-L(pseudo_cancel): \
- cfi_startproc; \
- STM_##args \
- stm %r12,%r15,48(%r15); \
- cfi_offset (%r15, -36); \
- cfi_offset (%r14, -40); \
- cfi_offset (%r13, -44); \
- cfi_offset (%r12, -48); \
- lr %r14,%r15; \
- ahi %r15,-96; \
- cfi_adjust_cfa_offset (96); \
- st %r14,0(%r15); \
- basr %r13,0; \
-0: l %r1,1f-0b(%r13); \
- bas %r14,0(%r1,%r13); \
- lr %r0,%r2; \
- LM_##args \
- .if SYS_ify (syscall_name) < 256; \
- svc SYS_ify (syscall_name); \
- .else; \
- lhi %r1,SYS_ify (syscall_name); \
- svc 0; \
- .endif; \
- LR7_##args \
- l %r1,2f-0b(%r13); \
- lr %r12,%r2; \
- lr %r2,%r0; \
- bas %r14,0(%r1,%r13); \
- lr %r2,%r12; \
- lm %r12,%r15,48+96(%r15); \
- cfi_endproc; \
- j L(pseudo_check); \
-1: .long CENABLE-0b; \
-2: .long CDISABLE-0b; \
-ENTRY(name) \
- SINGLE_THREAD_P(%r1) \
- jne L(pseudo_cancel); \
-.type __##syscall_name##_nocancel,@function; \
-.globl __##syscall_name##_nocancel; \
-__##syscall_name##_nocancel: \
- DO_CALL(syscall_name, args); \
-L(pseudo_check): \
- lhi %r4,-4095; \
- clr %r2,%r4; \
- jnl SYSCALL_ERROR_LABEL; \
-.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
-L(pseudo_end):
-
-# if IS_IN (libpthread)
-# define CENABLE __pthread_enable_asynccancel
-# define CDISABLE __pthread_disable_asynccancel
-# elif IS_IN (libc)
-# define CENABLE __libc_enable_asynccancel
-# define CDISABLE __libc_disable_asynccancel
-# elif IS_IN (librt)
-# define CENABLE __librt_enable_asynccancel
-# define CDISABLE __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-
-#define STM_0 /* Nothing */
-#define STM_1 st %r2,8(%r15);
-#define STM_2 stm %r2,%r3,8(%r15);
-#define STM_3 stm %r2,%r4,8(%r15);
-#define STM_4 stm %r2,%r5,8(%r15);
-#define STM_5 stm %r2,%r5,8(%r15);
-#define STM_6 stm %r2,%r7,8(%r15);
-
-#define LM_0 /* Nothing */
-#define LM_1 l %r2,8+96(%r15);
-#define LM_2 lm %r2,%r3,8+96(%r15);
-#define LM_3 lm %r2,%r4,8+96(%r15);
-#define LM_4 lm %r2,%r5,8+96(%r15);
-#define LM_5 lm %r2,%r5,8+96(%r15);
-#define LM_6 lm %r2,%r5,8+96(%r15); \
- cfi_offset (%r7, -68); \
- l %r7,96+96(%r15);
-
-#define LR7_0 /* Nothing */
-#define LR7_1 /* Nothing */
-#define LR7_2 /* Nothing */
-#define LR7_3 /* Nothing */
-#define LR7_4 /* Nothing */
-#define LR7_5 /* Nothing */
-#define LR7_6 l %r7,28+96(%r15); \
- cfi_restore (%r7);
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- ear reg,%a0; \
- icm reg,15,MULTIPLE_THREADS_OFFSET(reg);
-# endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -18,135 +18,36 @@
#include <sysdep.h>
#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
+#include <nptl/pthreadP.h>
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
-L(pseudo_cancel): \
- cfi_startproc; \
- STM_##args \
- stmg %r13,%r15,104(%r15); \
- cfi_offset (%r15,-40); \
- cfi_offset (%r14,-48); \
- cfi_offset (%r13,-56); \
- lgr %r14,%r15; \
- aghi %r15,-160; \
- cfi_adjust_cfa_offset (160); \
- stg %r14,0(%r15); \
- brasl %r14,CENABLE; \
- lgr %r0,%r2; \
- LM_##args \
- .if SYS_ify (syscall_name) < 256; \
- svc SYS_ify (syscall_name); \
- .else; \
- lghi %r1,SYS_ify (syscall_name); \
- svc 0; \
- .endif; \
- LR7_##args \
- lgr %r13,%r2; \
- lgr %r2,%r0; \
- brasl %r14,CDISABLE; \
- lgr %r2,%r13; \
- lmg %r13,%r15,104+160(%r15); \
- cfi_endproc; \
- j L(pseudo_check); \
-ENTRY(name) \
- SINGLE_THREAD_P \
- jne L(pseudo_cancel); \
-.type __##syscall_name##_nocancel,@function; \
-.globl __##syscall_name##_nocancel; \
-__##syscall_name##_nocancel: \
- DO_CALL(syscall_name, args); \
-L(pseudo_check): \
- lghi %r4,-4095; \
- clgr %r2,%r4; \
- jgnl SYSCALL_ERROR_LABEL; \
-.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
-L(pseudo_end):
-
# if IS_IN (libpthread)
-# define CENABLE __pthread_enable_asynccancel
-# define CDISABLE __pthread_disable_asynccancel
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
-# define CENABLE __libc_enable_asynccancel
-# define CDISABLE __libc_disable_asynccancel
# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# define CENABLE __librt_enable_asynccancel
-# define CDISABLE __librt_disable_asynccancel
-# else
-# error Unsupported library
# endif
-#define STM_0 /* Nothing */
-#define STM_1 stg %r2,16(%r15);
-#define STM_2 stmg %r2,%r3,16(%r15);
-#define STM_3 stmg %r2,%r4,16(%r15);
-#define STM_4 stmg %r2,%r5,16(%r15);
-#define STM_5 stmg %r2,%r5,16(%r15);
-#define STM_6 stmg %r2,%r7,16(%r15);
-
-#define LM_0 /* Nothing */
-#define LM_1 lg %r2,16+160(%r15);
-#define LM_2 lmg %r2,%r3,16+160(%r15);
-#define LM_3 lmg %r2,%r4,16+160(%r15);
-#define LM_4 lmg %r2,%r5,16+160(%r15);
-#define LM_5 lmg %r2,%r5,16+160(%r15);
-#define LM_6 lmg %r2,%r5,16+160(%r15); \
- cfi_offset (%r7, -104); \
- lg %r7,160+160(%r15);
-
-#define LR7_0 /* Nothing */
-#define LR7_1 /* Nothing */
-#define LR7_2 /* Nothing */
-#define LR7_3 /* Nothing */
-#define LR7_4 /* Nothing */
-#define LR7_5 /* Nothing */
-#define LR7_6 lg %r7,56+160(%r15); \
- cfi_restore (%r7);
-
# if IS_IN (libpthread) || IS_IN (libc)
-# ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- larl %r1,__local_multiple_threads; \
- icm %r0,15,0(%r1);
-# endif
# else
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- ear %r1,%a0; \
- sllg %r1,%r1,32; \
- ear %r1,%a1; \
- icm %r1,15,MULTIPLE_THREADS_OFFSET(%r1);
-# endif
# endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -23,147 +23,17 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# define _IMM12 #-12
-# define _IMM16 #-16
-# define _IMP16 #16
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name); \
- .Lpseudo_start: \
- SINGLE_THREAD_P; \
- bf .Lpseudo_cancel; \
- .type __##syscall_name##_nocancel,@function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- DO_CALL (syscall_name, args); \
- mov r0,r1; \
- mov _IMM12,r2; \
- shad r2,r1; \
- not r1,r1; \
- tst r1,r1; \
- bt .Lsyscall_error; \
- bra .Lpseudo_end; \
- nop; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- .Lpseudo_cancel: \
- sts.l pr,@-r15; \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (pr, 0); \
- add _IMM16,r15; \
- cfi_adjust_cfa_offset (16); \
- SAVE_ARGS_##args; \
- CENABLE; \
- LOAD_ARGS_##args; \
- add _IMP16,r15; \
- cfi_adjust_cfa_offset (-16); \
- lds.l @r15+,pr; \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (pr); \
- DO_CALL(syscall_name, args); \
- SYSCALL_INST_PAD; \
- sts.l pr,@-r15; \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (pr, 0); \
- mov.l r0,@-r15; \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (r0, 0); \
- CDISABLE; \
- mov.l @r15+,r0; \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (r0); \
- lds.l @r15+,pr; \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (pr); \
- mov r0,r1; \
- mov _IMM12,r2; \
- shad r2,r1; \
- not r1,r1; \
- tst r1,r1; \
- bf .Lpseudo_end; \
- .Lsyscall_error: \
- SYSCALL_ERROR_HANDLER; \
- .Lpseudo_end:
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) \
- END (sym)
-
-# define SAVE_ARGS_0 /* Nothing. */
-# define SAVE_ARGS_1 SAVE_ARGS_0; mov.l r4,@(0,r15); cfi_offset (r4,-4)
-# define SAVE_ARGS_2 SAVE_ARGS_1; mov.l r5,@(4,r15); cfi_offset (r5,-8)
-# define SAVE_ARGS_3 SAVE_ARGS_2; mov.l r6,@(8,r15); cfi_offset (r6,-12)
-# define SAVE_ARGS_4 SAVE_ARGS_3; mov.l r7,@(12,r15); cfi_offset (r7,-16)
-# define SAVE_ARGS_5 SAVE_ARGS_4
-# define SAVE_ARGS_6 SAVE_ARGS_5
-
-# define LOAD_ARGS_0 /* Nothing. */
-# define LOAD_ARGS_1 LOAD_ARGS_0; mov.l @(0,r15),r4; cfi_restore (r4)
-# define LOAD_ARGS_2 LOAD_ARGS_1; mov.l @(4,r15),r5; cfi_restore (r5)
-# define LOAD_ARGS_3 LOAD_ARGS_2; mov.l @(8,r15),r6; cfi_restore (r6)
-# define LOAD_ARGS_4 LOAD_ARGS_3; mov.l @(12,r15),r7; cfi_restore (r7)
-# define LOAD_ARGS_5 LOAD_ARGS_4
-# define LOAD_ARGS_6 LOAD_ARGS_5
-
-# if IS_IN (libpthread)
-# define __local_enable_asynccancel __pthread_enable_asynccancel
-# define __local_disable_asynccancel __pthread_disable_asynccancel
-# elif IS_IN (libc)
-# define __local_enable_asynccancel __libc_enable_asynccancel
-# define __local_disable_asynccancel __libc_disable_asynccancel
-# elif IS_IN (librt)
-# define __local_enable_asynccancel __librt_enable_asynccancel
-# define __local_disable_asynccancel __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-
-# define CENABLE \
- mov.l 1f,r0; \
- bsrf r0; \
- nop; \
- 0: bra 2f; \
- mov r0,r2; \
- .align 2; \
- 1: .long __local_enable_asynccancel - 0b; \
- 2:
-
-# define CDISABLE \
- mov.l 1f,r0; \
- bsrf r0; \
- mov r2,r4; \
- 0: bra 2f; \
- nop; \
- .align 2; \
- 1: .long __local_disable_asynccancel - 0b; \
- 2:
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- stc gbr,r0; \
- mov.w 0f,r1; \
- sub r1,r0; \
- mov.l @(MULTIPLE_THREADS_OFFSET,r0),r0; \
- bra 1f; \
- tst r0,r0; \
- 0: .word TLS_PRE_TCB_SIZE; \
- 1:
-
-# endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
deleted file mode 100644
@@ -1,111 +0,0 @@
-/* Copyright (C) 2002-2017 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- .globl __syscall_error; \
-ENTRY(name) \
- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
- cmp %g1, 0; \
- bne 1f; \
-.type __##syscall_name##_nocancel,@function; \
-.globl __##syscall_name##_nocancel; \
-__##syscall_name##_nocancel: \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x10; \
- bcc 8f; \
- mov %o7, %g1; \
- call __syscall_error; \
- mov %g1, %o7; \
-8: jmpl %o7 + 8, %g0; \
- nop; \
-.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
-1: save %sp, -96, %sp; \
- cfi_def_cfa_register(%fp); \
- cfi_window_save; \
- cfi_register(%o7, %i7); \
- CENABLE; \
- nop; \
- mov %o0, %l0; \
- COPY_ARGS_##args \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x10; \
- bcc 1f; \
- mov %o0, %l1; \
- CDISABLE; \
- mov %l0, %o0; \
- call __syscall_error; \
- mov %l1, %o0; \
- b 2f; \
- mov -1, %l1; \
-1: CDISABLE; \
- mov %l0, %o0; \
-2: jmpl %i7 + 8, %g0; \
- restore %g0, %l1, %o0;
-
-
-# if IS_IN (libpthread)
-# define CENABLE call __pthread_enable_asynccancel
-# define CDISABLE call __pthread_disable_asynccancel
-# elif IS_IN (libc)
-# define CENABLE call __libc_enable_asynccancel
-# define CDISABLE call __libc_disable_asynccancel
-# elif IS_IN (librt)
-# define CENABLE call __librt_enable_asynccancel
-# define CDISABLE call __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-
-#define COPY_ARGS_0 /* Nothing */
-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
-# endif
-
-#elif !defined __ASSEMBLER__
-
-# define SINGLE_THREAD_P (1)
-# define NO_CANCELLATION 1
-
-#endif
-
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#endif
deleted file mode 100644
@@ -1,109 +0,0 @@
-/* Copyright (C) 2002-2017 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- .globl __syscall_error; \
-ENTRY(name) \
- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
- brnz,pn %g1, 1f; \
-.type __##syscall_name##_nocancel,@function; \
-.globl __##syscall_name##_nocancel; \
-__##syscall_name##_nocancel: \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x6d; \
- bcc,pt %xcc, 8f; \
- mov %o7, %g1; \
- call __syscall_error; \
- mov %g1, %o7; \
-8: jmpl %o7 + 8, %g0; \
- nop; \
-.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
-1: save %sp, -192, %sp; \
- cfi_def_cfa_register(%fp); \
- cfi_window_save; \
- cfi_register(%o7, %i7); \
- CENABLE; \
- nop; \
- mov %o0, %l0; \
- COPY_ARGS_##args \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x6d; \
- bcc,pt %xcc, 1f; \
- mov %o0, %l1; \
- CDISABLE; \
- mov %l0, %o0; \
- call __syscall_error; \
- mov %l1, %o0; \
- ba,pt %xcc, 2f; \
- mov -1, %l1; \
-1: CDISABLE; \
- mov %l0, %o0; \
-2: jmpl %i7 + 8, %g0; \
- restore %g0, %l1, %o0;
-
-# if IS_IN (libpthread)
-# define CENABLE call __pthread_enable_asynccancel
-# define CDISABLE call __pthread_disable_asynccancel
-# elif IS_IN (libc)
-# define CENABLE call __libc_enable_asynccancel
-# define CDISABLE call __libc_disable_asynccancel
-# elif IS_IN (librt)
-# define CENABLE call __librt_enable_asynccancel
-# define CDISABLE call __librt_disable_asynccancel
-# else
-# error Unsupported library
-# endif
-
-#define COPY_ARGS_0 /* Nothing */
-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
-# endif
-
-#elif !defined __ASSEMBLER__
-
-# define SINGLE_THREAD_P (1)
-# define NO_CANCELLATION 1
-
-#endif
-
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#endif
new file mode 100644
@@ -0,0 +1,38 @@
+/* Copyright (C) 2002-2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include <tls.h>
+#include <nptl/pthreadP.h>
+
+#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
+
+# define SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0, 1)
+
+#else
+
+# define SINGLE_THREAD_P (1)
+# define NO_CANCELLATION 1
+
+#endif
+
+#define RTLD_SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0, 1)
@@ -18,137 +18,22 @@
#include <sysdep.h>
#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
+#include <nptl/pthreadP.h>
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-/* Allow hacking in some extra code if desired. */
-#ifndef PSEUDO_EXTRA
-#define PSEUDO_EXTRA
-#endif
-
-#undef PSEUDO
-#define PSEUDO(name, syscall_name, args) \
- ENTRY(__##syscall_name##_nocancel); \
- PSEUDO_EXTRA \
- moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
- swint1; \
- BNEZ r1, 0f; \
- jrp lr; \
- END(__##syscall_name##_nocancel); \
- ENTRY (name) \
- SINGLE_THREAD_P(r11); \
- BEQZ r11, L(pseudo_cancel); \
- PSEUDO_EXTRA \
- moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
- swint1; \
- BNEZ r1, 0f; \
- jrp lr; \
- L(pseudo_cancel): \
- { \
- move r11, sp; \
- ST sp, lr; \
- ADDI_PTR sp, sp, -STKSPACE; \
- }; \
- cfi_offset (lr, 0); \
- cfi_def_cfa_offset (STKSPACE); \
- { \
- ADDI_PTR r12, sp, REGSIZE; \
- ADDI_PTR r13, sp, 2 * REGSIZE; /* set up for PUSHARGS_0 */ \
- }; \
- ST r12, r11; \
- PUSHARGS_##args /* save syscall args */ \
- CENABLE; \
- ADDI_PTR r12, sp, 10 * REGSIZE; \
- { \
- ST r12, r0; /* save mask */ \
- ADDI_PTR r13, sp, 2 * REGSIZE; /* set up for POPARGS_0 */ \
- }; \
- POPARGS_##args /* restore syscall args */ \
- PSEUDO_EXTRA \
- moveli TREG_SYSCALL_NR_NAME, SYS_ify(syscall_name); \
- swint1; \
- ADDI_PTR r12, sp, 12 * REGSIZE; \
- { \
- ST r12, r1; /* save syscall result */ \
- ADDI_PTR r12, sp, 11 * REGSIZE; \
- }; \
- { \
- ST r12, r0; \
- ADDI_PTR r13, sp, 10 * REGSIZE; \
- }; \
- LD r0, r13; /* pass mask as arg1 */ \
- CDISABLE; \
- { \
- ADDI_PTR lr, sp, STKSPACE; \
- ADDI_PTR r0, sp, 11 * REGSIZE; \
- }; \
- { \
- LD r0, r0; \
- ADDI_PTR r1, sp, 12 * REGSIZE; \
- }; \
- LD r1, r1; \
- { \
- LD lr, lr; \
- ADDI_PTR sp, sp, STKSPACE; \
- }; \
- cfi_def_cfa_offset (0); \
- BNEZ r1, 0f
-
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 { ADDI_PTR r14, sp, 3 * REGSIZE; ST r13, r0 };
-# define PUSHARGS_2 PUSHARGS_1 { ADDI_PTR r13, sp, 4 * REGSIZE; ST r14, r1 };
-# define PUSHARGS_3 PUSHARGS_2 { ADDI_PTR r14, sp, 5 * REGSIZE; ST r13, r2 };
-# define PUSHARGS_4 PUSHARGS_3 { ADDI_PTR r13, sp, 6 * REGSIZE; ST r14, r3 };
-# define PUSHARGS_5 PUSHARGS_4 { ADDI_PTR r14, sp, 7 * REGSIZE; ST r13, r4 };
-# define PUSHARGS_6 PUSHARGS_5 { ADDI_PTR r13, sp, 8 * REGSIZE; ST r14, r5 };
-# define PUSHARGS_7 PUSHARGS_6 { ADDI_PTR r14, sp, 9 * REGSIZE; ST r13, r6 };
-
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 { ADDI_PTR r14, sp, 3 * REGSIZE; LD r0, r13 };
-# define POPARGS_2 POPARGS_1 { ADDI_PTR r13, sp, 4 * REGSIZE; LD r1, r14 };
-# define POPARGS_3 POPARGS_2 { ADDI_PTR r14, sp, 5 * REGSIZE; LD r2, r13 };
-# define POPARGS_4 POPARGS_3 { ADDI_PTR r13, sp, 6 * REGSIZE; LD r3, r14 };
-# define POPARGS_5 POPARGS_4 { ADDI_PTR r14, sp, 7 * REGSIZE; LD r4, r13 };
-# define POPARGS_6 POPARGS_5 { ADDI_PTR r13, sp, 8 * REGSIZE; LD r5, r14 };
-# define POPARGS_7 POPARGS_6 { ADDI_PTR r14, sp, 9 * REGSIZE; LD r6, r13 };
-
-# define STKSPACE (13 * REGSIZE)
-
-# if IS_IN (libpthread)
-# define CENABLE jal __pthread_enable_asynccancel
-# define CDISABLE jal __pthread_disable_asynccancel
-# elif IS_IN (librt)
-# define CENABLE jal __librt_enable_asynccancel
-# define CDISABLE jal __librt_disable_asynccancel
-# else
-# define CENABLE jal __libc_enable_asynccancel
-# define CDISABLE jal __libc_disable_asynccancel
-# endif
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) \
== 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- ADDLI_PTR reg, tp, MULTIPLE_THREADS_OFFSET; \
- LD reg, reg; \
- CMPEQI reg, reg, 0
-#endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P 1
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif
@@ -24,86 +24,32 @@
#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-/* The code to disable cancellation depends on the fact that the called
- functions are special. They don't modify registers other than %rax
- and %r11 if they return. Therefore we don't have to preserve other
- registers around these calls. */
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- jne L(pseudo_cancel); \
- .type __##syscall_name##_nocancel,@function; \
- .globl __##syscall_name##_nocancel; \
- __##syscall_name##_nocancel: \
- DO_CALL (syscall_name, args); \
- cmpq $-4095, %rax; \
- jae SYSCALL_ERROR_LABEL; \
- ret; \
- .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
- L(pseudo_cancel): \
- /* We always have to align the stack before calling a function. */ \
- subq $8, %rsp; cfi_adjust_cfa_offset (8); \
- CENABLE \
- /* The return value from CENABLE is argument for CDISABLE. */ \
- movq %rax, (%rsp); \
- DO_CALL (syscall_name, args); \
- movq (%rsp), %rdi; \
- /* Save %rax since it's the error code from the syscall. */ \
- movq %rax, %rdx; \
- CDISABLE \
- movq %rdx, %rax; \
- addq $8,%rsp; cfi_adjust_cfa_offset (-8); \
- cmpq $-4095, %rax; \
- jae SYSCALL_ERROR_LABEL
-
-
# if IS_IN (libpthread)
-# define CENABLE call __pthread_enable_asynccancel;
-# define CDISABLE call __pthread_disable_asynccancel;
# define __local_multiple_threads __pthread_multiple_threads
# elif IS_IN (libc)
-# define CENABLE call __libc_enable_asynccancel;
-# define CDISABLE call __libc_disable_asynccancel;
# define __local_multiple_threads __libc_multiple_threads
# elif IS_IN (librt)
-# define CENABLE call __librt_enable_asynccancel;
-# define CDISABLE call __librt_disable_asynccancel;
# else
# error Unsupported library
# endif
# if IS_IN (libpthread) || IS_IN (libc)
-# ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P cmpl $0, __local_multiple_threads(%rip)
-# endif
-
# else
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
+# define SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P cmpl $0, %fs:MULTIPLE_THREADS_OFFSET
-# endif
-
# endif
-#elif !defined __ASSEMBLER__
+#else
# define SINGLE_THREAD_P (1)
# define NO_CANCELLATION 1
#endif
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
+#define RTLD_SINGLE_THREAD_P \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
-#endif