Message ID | 1501765874-6201-15-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | None | expand |
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 >>
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