]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / nptl / sysdeps / unix / sysv / linux / x86_64 / sysdep-cancel.h
index 3e741da7948de492249e469628133e9b7f4954db..83cd25fe8d6057138e6103b705755d674911fb60 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
 
@@ -13,9 +13,8 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
 #include <tls.h>
 
 #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined 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;                                                                     \
     ret;                                                                     \
   .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;           \
   L(pseudo_cancel):                                                          \
-    /* Save registers that might get destroyed.  */                          \
-    SAVESTK_##args                                                           \
-    PUSHARGS_##args                                                          \
+    /* We always have to align the stack before calling a function.  */              \
+    subq $8, %rsp; cfi_adjust_cfa_offset (8);                                \
     CENABLE                                                                  \
-    /* Restore registers.  */                                                \
-    POPARGS_##args                                                           \
     /* The return value from CENABLE is argument for CDISABLE.  */           \
     movq %rax, (%rsp);                                                       \
-    movl $SYS_ify (syscall_name), %eax;                                              \
-    syscall;                                                                 \
+    DO_CALL (syscall_name, args);                                            \
     movq (%rsp), %rdi;                                                       \
     /* Save %rax since it's the error code from the syscall.  */             \
-    movq %rax, 8(%rsp);                                                              \
+    movq %rax, %rdx;                                                         \
     CDISABLE                                                                 \
-    movq 8(%rsp), %rax;                                                              \
-    RESTSTK_##args                                                           \
+    movq %rdx, %rax;                                                         \
+    addq $8,%rsp; cfi_adjust_cfa_offset (-8);                                \
     cmpq $-4095, %rax;                                                       \
-    jae SYSCALL_ERROR_LABEL;                                                 \
-  L(pseudo_end):
-
-
-# define PUSHARGS_0    /* Nothing.  */
-# define PUSHARGS_1    PUSHARGS_0 movq %rdi, 8(%rsp);
-# define PUSHARGS_2    PUSHARGS_1 movq %rsi, 16(%rsp);
-# define PUSHARGS_3    PUSHARGS_2 movq %rdx, 24(%rsp);
-# define PUSHARGS_4    PUSHARGS_3 movq %rcx, 32(%rsp);
-# define PUSHARGS_5    PUSHARGS_4 movq %r8, 40(%rsp);
-# define PUSHARGS_6    PUSHARGS_5 movq %r9, 48(%rsp);
-
-# define POPARGS_0     /* Nothing.  */
-# define POPARGS_1     POPARGS_0 movq 8(%rsp), %rdi;
-# define POPARGS_2     POPARGS_1 movq 16(%rsp), %rsi;
-# define POPARGS_3     POPARGS_2 movq 24(%rsp), %rdx;
-# define POPARGS_4     POPARGS_3 movq 32(%rsp), %r10;
-# define POPARGS_5     POPARGS_4 movq 40(%rsp), %r8;
-# define POPARGS_6     POPARGS_5 movq 48(%rsp), %r9;
-
-/* We always have to align the stack before calling a function.  */
-# define SAVESTK_0     subq $24, %rsp; cfi_adjust_cfa_offset (24);
-# define SAVESTK_1     SAVESTK_0
-# define SAVESTK_2     SAVESTK_1
-# define SAVESTK_3     subq $40, %rsp; cfi_adjust_cfa_offset (40);
-# define SAVESTK_4     SAVESTK_3
-# define SAVESTK_5     subq $56, %rsp; cfi_adjust_cfa_offset (56);
-# define SAVESTK_6     SAVESTK_5
-
-# define RESTSTK_0     addq $24,%rsp; cfi_adjust_cfa_offset (-24);
-# define RESTSTK_1     RESTSTK_0
-# define RESTSTK_2     RESTSTK_1
-# define RESTSTK_3     addq $40, %rsp; cfi_adjust_cfa_offset (-40);
-# define RESTSTK_4     RESTSTK_3
-# define RESTSTK_5     addq $56, %rsp; cfi_adjust_cfa_offset (-56);
-# define RESTSTK_6     RESTSTK_5
+    jae SYSCALL_ERROR_LABEL
+
 
 # ifdef IS_IN_libpthread
 #  define CENABLE      call __pthread_enable_asynccancel;