Rework: %r9 is destroyed by functions so don't use it as
authorAndreas Jaeger <aj@suse.de>
Mon, 10 Feb 2003 08:25:44 +0000 (08:25 +0000)
committerAndreas Jaeger <aj@suse.de>
Mon, 10 Feb 2003 08:25:44 +0000 (08:25 +0000)
temporary, align stack correctly, fix parameter for CDISABLE.
2003-02-09  Andreas Jaeger  <aj@suse.de>

* sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h:
Rework: %r9 is destroyed by functions so don't use it as
temporary, align stack correctly, fix parameter for CDISABLE.

linuxthreads/ChangeLog
linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h

index fe06a45..3d21ec4 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-09  Andreas Jaeger  <aj@suse.de>
+
+       * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h:
+       Rework: %r9 is destroyed by functions so don't use it as
+       temporary, align stack correctly, fix parameter for CDISABLE.
+
 2003-02-07  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
 
        * sysdeps/sh/Makefile: New file.
index ca8183f..bc3b867 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
 
     jae SYSCALL_ERROR_LABEL;                                                 \
     ret;                                                                     \
   L(pseudo_cancel):                                                          \
+    /* Save registers that might get destroyed.  */                          \
     SAVESTK_##args                                                           \
     PUSHARGS_##args                                                          \
     CENABLE                                                                  \
+    /* Restore registers.  */                                                \
     POPARGS_##args                                                           \
-    movq %rax, OLDTYPE_##args;                                               \
+    /* The return value from CENABLE is argument for CDISABLE.  */           \
+    movq %rax, (%rsp);                                                       \
     movq $SYS_ify (syscall_name), %rax;                                              \
     syscall;                                                                 \
-    xchgq %rax, OLDTYPE_##args;                                                      \
+    movq (%rsp), %rdi;                                                       \
+    /* Save %rax since it's the error code from the syscall.  */             \
+    movq %rax, 8(%rsp);                                                              \
     CDISABLE                                                                 \
-    movq OLDTYPE_##args, %rax;                                               \
+    movq 8(%rsp), %rax;                                                              \
     RESTSTK_##args                                                           \
     cmpq $-4095, %rax;                                                       \
     jae SYSCALL_ERROR_LABEL;                                                 \
   L(pseudo_end):
 
 # define PUSHARGS_0    /* Nothing.  */
-# define PUSHARGS_1    PUSHARGS_0 movq %rdi, (%rsp);
-# define PUSHARGS_2    PUSHARGS_1 movq %rsi, 8(%rsp);
-# define PUSHARGS_3    PUSHARGS_2 movq %rdx, 16(%rsp);
-# define PUSHARGS_4    PUSHARGS_3 movq %rcx, 24(%rsp);
-# define PUSHARGS_5    PUSHARGS_4 movq %r8, 32(%rsp);
-# define PUSHARGS_6    PUSHARGS_5 movq %r9, 40(%rsp);
+# 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 (%rsp), %rdi;
-# define POPARGS_2     POPARGS_1 movq 8(%rsp), %rsi;
-# define POPARGS_3     POPARGS_2 movq 16(%rsp), %rdx;
-# define POPARGS_4     POPARGS_3 movq 24(%rsp), %r10;
-# define POPARGS_5     POPARGS_4 movq 32(%rsp), %r8;
-# define POPARGS_6     POPARGS_5 movq 40(%rsp), %r9;
-
-# define SAVESTK_0     /* Nothing.  */
-# define SAVESTK_1     subq $16, %rsp;
-# define SAVESTK_2     SAVESTK_1;
-# define SAVESTK_3     subq $32, %rsp;
-# define SAVESTK_4     SAVESTK_3;
-# define SAVESTK_5     subq $48, %rsp;
-# define SAVESTK_6     subq $64, %rsp;
-
-# define RESTSTK_0     /* Nothing.  */
-# define RESTSTK_1     addq $16, %rsp;
-# define RESTSTK_2     RESTSTK_1;
-# define RESTSTK_3     addq $32, %rsp;
-# define RESTSTK_4     RESTSTK_3;
-# define RESTSTK_5     addq $48, %rsp;
-# define RESTSTK_6     addq $64, %rsp;
-
-# define OLDTYPE_0     %r9
-# define OLDTYPE_1     OLDTYPE_0
-# define OLDTYPE_2     OLDTYPE_0
-# define OLDTYPE_3     OLDTYPE_0
-# define OLDTYPE_4     OLDTYPE_0
-# define OLDTYPE_5     OLDTYPE_0
-# define OLDTYPE_6     48(%rsp)
+# 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;
+# define SAVESTK_1     SAVESTK_0
+# define SAVESTK_2     SAVESTK_1
+# define SAVESTK_3     subq $40, %rsp;
+# define SAVESTK_4     SAVESTK_3
+# define SAVESTK_5     subq $56, %rsp;
+# define SAVESTK_6     SAVESTK_5
+
+# define RESTSTK_0     addq $24,%rsp;
+# define RESTSTK_1     RESTSTK_0
+# define RESTSTK_2     RESTSTK_1
+# define RESTSTK_3     addq $40, %rsp;
+# define RESTSTK_4     RESTSTK_3
+# define RESTSTK_5     addq $56, %rsp;
+# define RESTSTK_6     RESTSTK_5
 
 # ifdef IS_IN_libpthread
 #  define CENABLE      call __pthread_enable_asynccancel;