about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Jaeger <aj@suse.de>2003-02-10 08:25:44 +0000
committerAndreas Jaeger <aj@suse.de>2003-02-10 08:25:44 +0000
commitdf037172a710c7ce6bbb6fd1ea0883469e8592a5 (patch)
tree0f6a7a05ac27c9c1df00a084a0f626c4fa241dd0
parent696e556ea9b85beb8e6bad132d3d4dbdb5ab36a6 (diff)
downloadglibc-df037172a710c7ce6bbb6fd1ea0883469e8592a5.tar.gz
glibc-df037172a710c7ce6bbb6fd1ea0883469e8592a5.tar.xz
glibc-df037172a710c7ce6bbb6fd1ea0883469e8592a5.zip
Rework: %r9 is destroyed by functions so don't use it as
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.
-rw-r--r--linuxthreads/ChangeLog6
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h78
2 files changed, 44 insertions, 40 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index fe06a451bd..3d21ec4754 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -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.
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
index ca8183f4e9..bc3b8676fb 100644
--- a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
+++ b/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
@@ -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.
 
@@ -37,60 +37,58 @@
     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;