]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nptl: Remove x86_64 cancellation assembly implementations [BZ #25765]
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 31 Mar 2020 17:59:28 +0000 (14:59 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 3 Apr 2020 13:47:59 +0000 (10:47 -0300)
All cancellable syscalls are done by C implementations, so there is no
no need to use a specialized implementation to optimize register usage.

It fixes BZ #25765.

Checked on x86_64-linux-gnu.

sysdeps/unix/sysv/linux/x86_64/cancellation.S [deleted file]
sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S [deleted file]
sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S [deleted file]
sysdeps/x86_64/nptl/tcb-offsets.sym

diff --git a/sysdeps/unix/sysv/linux/x86_64/cancellation.S b/sysdeps/unix/sysv/linux/x86_64/cancellation.S
deleted file mode 100644 (file)
index 256529c..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2009.
-
-   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
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-#include <tcb-offsets.h>
-#include <kernel-features.h>
-#include <lowlevellock-futex.h>
-
-#define PTHREAD_UNWIND JUMPTARGET(__pthread_unwind)
-#if IS_IN (libpthread)
-# if defined SHARED && !defined NO_HIDDEN
-#  undef PTHREAD_UNWIND
-#  define PTHREAD_UNWIND __GI___pthread_unwind
-# endif
-#else
-# ifndef SHARED
-       .weak __pthread_unwind
-# endif
-#endif
-
-
-#define LOAD_PRIVATE_FUTEX_WAIT(reg) \
-       movl    $(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg
-
-/* It is crucial that the functions in this file don't modify registers
-   other than %rax and %r11.  The syscall wrapper code depends on this
-   because it doesn't explicitly save the other registers which hold
-   relevant values.  */
-       .text
-
-       .hidden __pthread_enable_asynccancel
-ENTRY(__pthread_enable_asynccancel)
-       movl    %fs:CANCELHANDLING, %eax
-2:     movl    %eax, %r11d
-       orl     $TCB_CANCELTYPE_BITMASK, %r11d
-       cmpl    %eax, %r11d
-       je      1f
-
-       lock
-       cmpxchgl %r11d, %fs:CANCELHANDLING
-       jnz     2b
-
-       andl    $(TCB_CANCELSTATE_BITMASK|TCB_CANCELTYPE_BITMASK|TCB_CANCELED_BITMASK|TCB_EXITING_BITMASK|TCB_CANCEL_RESTMASK|TCB_TERMINATED_BITMASK), %r11d
-       cmpl    $(TCB_CANCELTYPE_BITMASK|TCB_CANCELED_BITMASK), %r11d
-       je      3f
-
-1:     ret
-
-3:     subq    $8, %rsp
-       cfi_adjust_cfa_offset(8)
-       LP_OP(mov) $TCB_PTHREAD_CANCELED, %fs:RESULT
-       lock
-       orl     $TCB_EXITING_BITMASK, %fs:CANCELHANDLING
-       mov     %fs:CLEANUP_JMP_BUF, %RDI_LP
-       call    PTHREAD_UNWIND
-       hlt
-END(__pthread_enable_asynccancel)
-
-
-       .hidden __pthread_disable_asynccancel
-ENTRY(__pthread_disable_asynccancel)
-       testl   $TCB_CANCELTYPE_BITMASK, %edi
-       jnz     1f
-
-       movl    %fs:CANCELHANDLING, %eax
-2:     movl    %eax, %r11d
-       andl    $~TCB_CANCELTYPE_BITMASK, %r11d
-       lock
-       cmpxchgl %r11d, %fs:CANCELHANDLING
-       jnz     2b
-
-       movl    %r11d, %eax
-3:     andl    $(TCB_CANCELING_BITMASK|TCB_CANCELED_BITMASK), %eax
-       cmpl    $TCB_CANCELING_BITMASK, %eax
-       je      4f
-1:     ret
-
-       /* Performance doesn't matter in this loop.  We will
-          delay until the thread is canceled.  And we will unlikely
-          enter the loop twice.  */
-4:     mov     %fs:0, %RDI_LP
-       movl    $__NR_futex, %eax
-       xorq    %r10, %r10
-       addq    $CANCELHANDLING, %rdi
-       LOAD_PRIVATE_FUTEX_WAIT (%esi)
-       syscall
-       movl    %fs:CANCELHANDLING, %eax
-       jmp     3b
-END(__pthread_disable_asynccancel)
diff --git a/sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S b/sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S
deleted file mode 100644 (file)
index 6c6b2a8..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2009.
-
-   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
-   <https://www.gnu.org/licenses/>.  */
-
-#define __pthread_enable_asynccancel __libc_enable_asynccancel
-#define __pthread_disable_asynccancel __libc_disable_asynccancel
-#include "cancellation.S"
diff --git a/sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S b/sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S
deleted file mode 100644 (file)
index 71ff1ca..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2009.
-
-   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
-   <https://www.gnu.org/licenses/>.  */
-
-#define __pthread_enable_asynccancel __librt_enable_asynccancel
-#define __pthread_disable_asynccancel __librt_disable_asynccancel
-#include "cancellation.S"
index ae8034743b4da2a1572546a3364aaf7dec2d4480..037759eb4f1da1cc48f597fa0930c7fd19eb515d 100644 (file)
@@ -16,11 +16,4 @@ FEATURE_1_OFFSET     offsetof (tcbhead_t, feature_1)
 SSP_BASE_OFFSET                offsetof (tcbhead_t, ssp_base)
 
 -- Not strictly offsets, but these values are also used in the TCB.
-TCB_CANCELSTATE_BITMASK         CANCELSTATE_BITMASK
-TCB_CANCELTYPE_BITMASK  CANCELTYPE_BITMASK
-TCB_CANCELING_BITMASK   CANCELING_BITMASK
 TCB_CANCELED_BITMASK    CANCELED_BITMASK
-TCB_EXITING_BITMASK     EXITING_BITMASK
-TCB_CANCEL_RESTMASK     CANCEL_RESTMASK
-TCB_TERMINATED_BITMASK  TERMINATED_BITMASK
-TCB_PTHREAD_CANCELED    PTHREAD_CANCELED