This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

alpha vfork update


Just like all the others.  Fortunately, I do have registers that
are preserved across the syscall.


r~


        * sysdeps/alpha/tcb-offsets.sym (PID_OFFSET): New.
        * sysdeps/unix/sysv/linux/alpha/pt-vfork.S: Save/restore PID.
        * sysdeps/unix/sysv/linux/alpha/vfork.S: New file.

Index: sysdeps/alpha/tcb-offsets.sym
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/alpha/tcb-offsets.sym,v
retrieving revision 1.1
diff -c -p -d -r1.1 tcb-offsets.sym
*** sysdeps/alpha/tcb-offsets.sym	13 Jan 2004 09:36:22 -0000	1.1
--- sysdeps/alpha/tcb-offsets.sym	11 Mar 2004 21:32:30 -0000
***************
*** 10,12 ****
--- 10,13 ----
  #if TLS_MULTIPLE_THREADS_IN_TCB
  MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads)
  #endif
+ PID_OFFSET			thread_offsetof (pid)
Index: sysdeps/unix/sysv/linux/alpha/pt-vfork.S
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/unix/sysv/linux/alpha/pt-vfork.S,v
retrieving revision 1.1
diff -c -p -d -r1.1 pt-vfork.S
*** sysdeps/unix/sysv/linux/alpha/pt-vfork.S	1 Jul 2003 20:21:45 -0000	1.1
--- sysdeps/unix/sysv/linux/alpha/pt-vfork.S	11 Mar 2004 21:32:30 -0000
***************
*** 1,4 ****
! /* Copyright (C) 2003 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
--- 1,4 ----
! /* Copyright (C) 2003, 2004 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
***************
*** 16,25 ****
     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     02111-1307 USA.  */
  
! #include <sysdep-cancel.h>
  
- PSEUDO(__vfork, vfork, 0)
- 	ret
  PSEUDO_END (__vfork)
  
  weak_alias (__vfork, vfork)
--- 16,43 ----
     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     02111-1307 USA.  */
  
! #include <sysdep.h>
! #include <tcb-offsets.h>
! 
! #undef PSEUDO_PREPARE_ARGS
! #define PSEUDO_PREPARE_ARGS						\
! 	/* Load the current cached pid value across the vfork.  */	\
! 	rduniq;								\
! 	ldl	a2, PID_OFFSET(v0);					\
! 	mov	v0, a1;							\
! 	/* Write back its negation, to indicate that the pid value is	\
! 	   uninitialized in the the child, and in the window between	\
! 	   here and the point at which we restore the value.  */	\
! 	negl	a2, t0;							\
! 	stl	t0, PID_OFFSET(v0);
! 
! PSEUDO (__vfork, vfork, 0)
! 
! 	/* If we're back in the parent, restore the saved pid.  */
! 	beq	v0, 1f
! 	stl	a2, PID_OFFSET(a1)
! 1:	ret
  
  PSEUDO_END (__vfork)
  
  weak_alias (__vfork, vfork)
Index: sysdeps/unix/sysv/linux/alpha/vfork.S
===================================================================
RCS file: sysdeps/unix/sysv/linux/alpha/vfork.S
diff -N sysdeps/unix/sysv/linux/alpha/vfork.S
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- sysdeps/unix/sysv/linux/alpha/vfork.S	11 Mar 2004 21:32:30 -0000
***************
*** 0 ****
--- 1,46 ----
+ /* Copyright (C) 2004 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, write to the Free
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
+ #include <sysdep.h>
+ #include <tcb-offsets.h>
+ 
+ #undef PSEUDO_PREPARE_ARGS
+ #define PSEUDO_PREPARE_ARGS						\
+ 	/* Load the current cached pid value across the vfork.  */	\
+ 	rduniq;								\
+ 	ldl	a2, PID_OFFSET(v0);					\
+ 	mov	v0, a1;							\
+ 	/* If the cached value is initialized (nonzero), then write	\
+ 	   back its negation, or INT_MIN, to indicate that the pid	\
+ 	   value is uninitialized in the the child, and in the window	\
+ 	   between here and the point at which we restore the value.  */ \
+ 	ldah	t0, -0x8000;						\
+ 	negl	a2, t1;							\
+ 	cmovne	a2, t1, t0;						\
+ 	stl	t0, PID_OFFSET(v0);
+ 
+ PSEUDO (__vfork, vfork, 0)
+ 
+ 	/* If we're back in the parent, restore the saved pid.  */
+ 	beq	v0, 1f
+ 	stl	a2, PID_OFFSET(a1)
+ 1:	ret
+ 
+ PSEUDO_END (__vfork)
+ 
+ weak_alias (__vfork, vfork)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]