CVS: src/si/patches glibc-2.2.5.ppc32.patch,1.1,1.2

Marvin Heffler <[email protected]> Tue, 08 Jul 2003 10:30:25 -0700
Newsgroups gmane.linux.lsb.implementation
Message-ID <[email protected]>
Update of /cvsroot/lsb/src/si/patches
In directory sc8-pr-cvs1:/tmp/cvs-serv17790

Modified Files:
	glibc-2.2.5.ppc32.patch 
Log Message:
Adding context switching code support for ppc32

Index: glibc-2.2.5.ppc32.patch
===================================================================
RCS file: /cvsroot/lsb/src/si/patches/glibc-2.2.5.ppc32.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** glibc-2.2.5.ppc32.patch	30 Aug 2002 20:05:13 -0000	1.1
--- glibc-2.2.5.ppc32.patch	8 Jul 2003 17:30:23 -0000	1.2
***************
*** 1,3 ****
! This patch adds an ldconfig.h to the powerpc build
  
  diff -Naurw glibc-2.2.5.lsb/sysdeps/unix/sysv/linux/powerpc/ldconfig.h glibc-2.2.5.ppc32/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
--- 1,15 ----
! This patchset addresses ppc32 issues with glibc 2.2.5. The changes are to
! add files to support ppc32. 
! 
! These files are added:
!     sysdeps/unix/sysv/linux/powerpc/ldconfig.h
! - add an ldconfig.h to the powerpc build
! 
!     sysdeps/unix/sysv/linux/powerpc/getcontext.S
!     sysdeps/unix/sysv/linux/powerpc/makecontext.S
!     sysdeps/unix/sysv/linux/powerpc/setcontext.S
!     sysdeps/unix/sysv/linux/powerpc/swapcontext.S
!     sysdeps/unix/sysv/linux/powerpc/ucontext_i.h
! - add context switching support for ppc32 build
  
  diff -Naurw glibc-2.2.5.lsb/sysdeps/unix/sysv/linux/powerpc/ldconfig.h glibc-2.2.5.ppc32/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
***************
*** 30,31 ****
--- 42,706 ----
  +  { "libc.so.5", FLAG_ELF_LIBC5 },	\
  +  { "libm.so.5", FLAG_ELF_LIBC5 },
+ diff -Naurw glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/getcontext.S glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/getcontext.S
+ --- glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/getcontext.S	1969-12-31 18:00:00.000000000 -0600
+ +++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/getcontext.S	2003-06-20 19:27:38.000000000 -0500
+ @@ -0,0 +1,126 @@
+ +/* Save current context.
+ +   Copyright (C) 2002 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>
+ +
+ +#define __ASSEMBLY__
+ +#include <asm/ptrace.h>
+ +#include "ucontext_i.h"
+ +
+ +ENTRY(__getcontext)
+ +	stw	r0,_UC_GREGS+(PT_R0*4)(r3)
+ +	stw	r1,_UC_GREGS+(PT_R1*4)(r3)
+ +	mflr	r0
+ +	stwu	r1,-16(r1)
+ +	stw	r0,20(r1)
+ +	stw	r0,_UC_GREGS+(PT_LNK*4)(r3)
+ +	stw	r0,_UC_GREGS+(PT_NIP*4)(r3)
+ +	stw	r2,_UC_GREGS+(PT_R2*4)(r3)
+ +	stw	r4,_UC_GREGS+(PT_R4*4)(r3)
+ +	stw	r5,_UC_GREGS+(PT_R5*4)(r3)
+ +	stw	r6,_UC_GREGS+(PT_R6*4)(r3)
+ +	stw	r7,_UC_GREGS+(PT_R7*4)(r3)
+ +	stw	r8,_UC_GREGS+(PT_R8*4)(r3)
+ +	stw	r9,_UC_GREGS+(PT_R9*4)(r3)
+ +	stw	r10,_UC_GREGS+(PT_R10*4)(r3)
+ +	stw	r11,_UC_GREGS+(PT_R11*4)(r3)
+ +	stw	r12,_UC_GREGS+(PT_R12*4)(r3)
+ +	stw	r13,_UC_GREGS+(PT_R13*4)(r3)
+ +	stw	r14,_UC_GREGS+(PT_R14*4)(r3)
+ +	stw	r15,_UC_GREGS+(PT_R15*4)(r3)
+ +	stw	r16,_UC_GREGS+(PT_R16*4)(r3)
+ +	stw	r17,_UC_GREGS+(PT_R17*4)(r3)
+ +	stw	r18,_UC_GREGS+(PT_R18*4)(r3)
+ +	stw	r19,_UC_GREGS+(PT_R19*4)(r3)
+ +	stw	r20,_UC_GREGS+(PT_R20*4)(r3)
+ +	stw	r21,_UC_GREGS+(PT_R21*4)(r3)
+ +	stw	r22,_UC_GREGS+(PT_R22*4)(r3)
+ +	stw	r23,_UC_GREGS+(PT_R23*4)(r3)
+ +	stw	r24,_UC_GREGS+(PT_R24*4)(r3)
+ +	stw	r25,_UC_GREGS+(PT_R25*4)(r3)
+ +	stw	r26,_UC_GREGS+(PT_R26*4)(r3)
+ +	stw	r27,_UC_GREGS+(PT_R27*4)(r3)
+ +	stw	r28,_UC_GREGS+(PT_R28*4)(r3)
+ +	stw	r29,_UC_GREGS+(PT_R29*4)(r3)
+ +	stw	r30,_UC_GREGS+(PT_R30*4)(r3)
+ +	stw	r31,_UC_GREGS+(PT_R31*4)(r3)
+ +	mfctr	r0
+ +	stw	r0,_UC_GREGS+(PT_CTR*4)(r3)
+ +	mfxer	r0
+ +	stw	r0,_UC_GREGS+(PT_XER*4)(r3)
+ +	mfcr	r0
+ +	stw	r0,_UC_GREGS+(PT_CCR*4)(r3)
+ +
+ +	/* Set the return value of getcontext to "success".  R3 is the only 
+ +	   register whose value is not preserved in the saved context.  */
+ +	li	r0,0
+ +	stw	r0,_UC_GREGS+(PT_R3*4)(r3)
+ +
+ +	/* Zero fill fields that can't be set in user state. */
+ +	stw	r0,_UC_GREGS+(PT_MSR*4)(r3)
+ +	stw	r0,_UC_GREGS+(PT_MQ*4)(r3)
+ +
+ +	/* Save the floating-point registers */
+ +	stfd	fp0,_UC_FREGS+(0*8)(r3)
+ +	stfd	fp1,_UC_FREGS+(1*8)(r3)
+ +	stfd	fp2,_UC_FREGS+(2*8)(r3)
+ +	stfd	fp3,_UC_FREGS+(3*8)(r3)
+ +	stfd	fp4,_UC_FREGS+(4*8)(r3)
+ +	stfd	fp5,_UC_FREGS+(5*8)(r3)
+ +	stfd	fp6,_UC_FREGS+(6*8)(r3)
+ +	stfd	fp7,_UC_FREGS+(7*8)(r3)
+ +	stfd	fp8,_UC_FREGS+(8*8)(r3)
+ +	stfd	fp9,_UC_FREGS+(9*8)(r3)
+ +	stfd	fp10,_UC_FREGS+(10*8)(r3)
+ +	stfd	fp11,_UC_FREGS+(11*8)(r3)
+ +	stfd	fp12,_UC_FREGS+(12*8)(r3)
+ +	stfd	fp13,_UC_FREGS+(13*8)(r3)
+ +	stfd	fp14,_UC_FREGS+(14*8)(r3)
+ +	stfd	fp15,_UC_FREGS+(15*8)(r3)
+ +	stfd	fp16,_UC_FREGS+(16*8)(r3)
+ +	stfd	fp17,_UC_FREGS+(17*8)(r3)
+ +	stfd	fp18,_UC_FREGS+(18*8)(r3)
+ +	stfd	fp19,_UC_FREGS+(19*8)(r3)
+ +	stfd	fp20,_UC_FREGS+(20*8)(r3)
+ +	stfd	fp21,_UC_FREGS+(21*8)(r3)
+ +	stfd	fp22,_UC_FREGS+(22*8)(r3)
+ +	stfd	fp23,_UC_FREGS+(23*8)(r3)
+ +	stfd	fp24,_UC_FREGS+(24*8)(r3)
+ +	stfd	fp25,_UC_FREGS+(25*8)(r3)
+ +	stfd	fp26,_UC_FREGS+(26*8)(r3)
+ +	stfd	fp27,_UC_FREGS+(27*8)(r3)
+ +	stfd	fp28,_UC_FREGS+(28*8)(r3)
+ +	stfd	fp29,_UC_FREGS+(29*8)(r3)
+ +	mffs	fp0
+ +	stfd	fp30,_UC_FREGS+(30*8)(r3)
+ +	stfd	fp31,_UC_FREGS+(31*8)(r3)
+ +	stfd	fp0,_UC_FREGS+(32*8)(r3)
+ +
+ +	addi	r5,r3,_UC_SIGMASK
+ +	li	r4,0
+ +	li	r3,SIG_BLOCK
+ +	bl	JUMPTARGET(sigprocmask)
+ +
+ +	lwz	r0,20(r1)
+ +	addi	r1,r1,16
+ +	mtlr	r0
+ +	blr
+ +PSEUDO_END(__getcontext)
+ +
+ +weak_alias(__getcontext, getcontext)
+ diff -Naurw glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/makecontext.S glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/makecontext.S
+ --- glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/makecontext.S	1969-12-31 18:00:00.000000000 -0600
+ +++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/makecontext.S	2003-06-20 19:27:38.000000000 -0500
+ @@ -0,0 +1,105 @@
+ +/* Set up a context to call a function.
+ +   Copyright (C) 2002 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>
+ +
+ +#define __ASSEMBLY__
+ +#include <asm/ptrace.h>
+ +#include "ucontext_i.h"
+ +
+ +ENTRY(__makecontext)
+ +	/* Set up the first 7 args to the function in its registers */
+ +	stw	r6,_UC_GREGS+(PT_R3*4)(r3)
+ +	stw	r7,_UC_GREGS+(PT_R4*4)(r3)
+ +	stw	r8,_UC_GREGS+(PT_R5*4)(r3)
+ +	stw	r9,_UC_GREGS+(PT_R6*4)(r3)
+ +	stw	r10,_UC_GREGS+(PT_R7*4)(r3)
+ +	lwz	r8,8(r1)
+ +	lwz	r9,12(r1)
+ +	stw	r8,_UC_GREGS+(PT_R8*4)(r3)
+ +	stw	r9,_UC_GREGS+(PT_R9*4)(r3)
+ +
+ +	/* Set the NIP to the start of the function */
+ +	stw	r4,_UC_GREGS+(PT_NIP*4)(r3)
+ +
+ +	/* Set the function's r31 to ucp->uc_link for the exitcode below. */
+ +	lwz	r7,_UC_LINK(r3)
+ +	stw	r7,_UC_GREGS+(PT_R31*4)(r3)
+ +
+ +	/* Set the function's LR to point to the exitcode below. */
+ +#ifdef PIC
+ +	mflr	r0
+ +	bl	1f
+ +1:	mflr	r6
+ +	addi	r6,r6,L(exitcode)-1b
+ +	mtlr	r0
+ +#else
+ +	lis	r6,L(exitcode)@ha
+ +	addi	r6,r6,L(exitcode)@l
+ +#endif
+ +	stw	r6,_UC_GREGS+(PT_LNK*4)(r3)
+ +
+ +	/*
+ +	 * Set up the stack frame for the function.
+ +	 * If we have more than 5 args to the function (8 args to makecontext),
+ +	 * there will be some arguments on the stack which have to end up
+ +	 * in registers.  If there are more than 8 args to the function,
+ +	 * we have to copy (argc - 8) args from our stack to the functions'
+ +	 * stack (and allow space for them in the frame).
+ +	 */
+ +	lwz	r4,_UC_STACK_SP(r3)
+ +	lwz	r8,_UC_STACK_SIZE(r3)
+ +	add	r4,r4,r8
+ +	rlwinm	r4,r4,0,0,27	/* round down to 16-byte boundary */
+ +	addi	r7,r4,-16	/* stack frame for fn's caller */
+ +	cmpwi	r5,8
+ +	blt	2f		/* less than 8 args is easy */
+ +	lwz	r10,16(r1)
+ +	stw	r10,_UC_GREGS+(PT_R10*4)(r3)
+ +	beq	2f		/* if exactly 8 args */
+ +	subi	r9,r5,3
+ +	subi	r5,r5,8
+ +	rlwinm	r9,r9,2,0,27
+ +	subf	r7,r9,r4
+ +	mtctr	r5		/* copy the 9th and following args */
+ +	addi	r6,r1,16
+ +	addi	r8,r7,4
+ +3:	lwzu	r10,4(r6)
+ +	stwu	r10,4(r8)
+ +	bdnz	3b
+ +2:	stw	r7,_UC_GREGS+(PT_R1*4)(r3)
+ +	li	r6,0
+ +	stw	r6,0(r7)
+ +
+ +	blr
+ +
+ +/*
+ + * If the function returns, it comes here.  We put ucp->uc_link in
+ + * r31, which is a callee-saved register.  We have to continue with
+ + * the context that r31 points to, or exit if it is 0.
+ + */
+ +L(exitcode):
+ +	mr.	r3,r31
+ +	beq	4f
+ +	bl	JUMPTARGET(__setcontext)
+ +4:	bl	JUMPTARGET(exit)
+ +	b	4b
+ +
+ +END(__makecontext)
+ +weak_alias(__makecontext, makecontext)
+ diff -Naurw glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/setcontext.S glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/setcontext.S
+ --- glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/setcontext.S	1969-12-31 18:00:00.000000000 -0600
+ +++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/setcontext.S	2003-06-20 19:27:38.000000000 -0500
+ @@ -0,0 +1,149 @@
+ +/* Jump to a new context.
+ +   Copyright (C) 2002 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>
+ +
+ +#define __ASSEMBLY__
+ +#include <asm/ptrace.h>
+ +#include "ucontext_i.h"
+ +
+ +ENTRY(__setcontext)
+ +	mflr	r0
+ +	stwu	r1,-16(r1)
+ +	stw	r0,20(r1)
+ +	stw	r31,12(r1)
+ +	mr	r31,r3
+ +
+ +	/*
+ +	 * If this ucontext refers to the point where we were interrupted
+ +	 * by a signal, we have to use the rt_sigreturn system call to
+ +	 * return to the context so we get both LR and CTR restored.
+ +	 *
+ +	 * Otherwise, the context we are restoring is either just after
+ +	 * a procedure call (getcontext/swapcontext) or at the beginning
+ +	 * of a procedure call (makecontext), so we don't need to restore
+ +	 * r0, xer, ctr.  We don't restore r2 since it will be used as
+ +	 * the TLS pointer.
+ +	 */
+ +	lwz	r0,_UC_GREGS+(PT_MSR*4)(r31)
+ +	cmpwi	r0,0
+ +	bne	L(do_sigret)
+ +
+ +	/* Restore the signal mask */
+ +	li	r5,0
+ +	addi	r4,r3,_UC_SIGMASK
+ +	li	r3,SIG_SETMASK
+ +	bl	JUMPTARGET(sigprocmask)
+ +	cmpwi	r3,0
+ +	bne	L(error_exit)
+ +
+ +	/* Restore the floating-point registers */
+ +	lfd	fp31,_UC_FREGS+(32*8)(r31)
+ +	lfd	fp0,_UC_FREGS+(0*8)(r31)
+ +	mtfsf	0xff,fp31
+ +	lfd	fp1,_UC_FREGS+(1*8)(r31)
+ +	lfd	fp2,_UC_FREGS+(2*8)(r31)
+ +	lfd	fp3,_UC_FREGS+(3*8)(r31)
+ +	lfd	fp4,_UC_FREGS+(4*8)(r31)
+ +	lfd	fp5,_UC_FREGS+(5*8)(r31)
+ +	lfd	fp6,_UC_FREGS+(6*8)(r31)
+ +	lfd	fp7,_UC_FREGS+(7*8)(r31)
+ +	lfd	fp8,_UC_FREGS+(8*8)(r31)
+ +	lfd	fp9,_UC_FREGS+(9*8)(r31)
+ +	lfd	fp10,_UC_FREGS+(10*8)(r31)
+ +	lfd	fp11,_UC_FREGS+(11*8)(r31)
+ +	lfd	fp12,_UC_FREGS+(12*8)(r31)
+ +	lfd	fp13,_UC_FREGS+(13*8)(r31)
+ +	lfd	fp14,_UC_FREGS+(14*8)(r31)
+ +	lfd	fp15,_UC_FREGS+(15*8)(r31)
+ +	lfd	fp16,_UC_FREGS+(16*8)(r31)
+ +	lfd	fp17,_UC_FREGS+(17*8)(r31)
+ +	lfd	fp18,_UC_FREGS+(18*8)(r31)
+ +	lfd	fp19,_UC_FREGS+(19*8)(r31)
+ +	lfd	fp20,_UC_FREGS+(20*8)(r31)
+ +	lfd	fp21,_UC_FREGS+(21*8)(r31)
+ +	lfd	fp22,_UC_FREGS+(22*8)(r31)
+ +	lfd	fp23,_UC_FREGS+(23*8)(r31)
+ +	lfd	fp24,_UC_FREGS+(24*8)(r31)
+ +	lfd	fp25,_UC_FREGS+(25*8)(r31)
+ +	lfd	fp26,_UC_FREGS+(26*8)(r31)
+ +	lfd	fp27,_UC_FREGS+(27*8)(r31)
+ +	lfd	fp28,_UC_FREGS+(28*8)(r31)
+ +	lfd	fp29,_UC_FREGS+(29*8)(r31)
+ +	lfd	fp30,_UC_FREGS+(30*8)(r31)
+ +	lfd	fp31,_UC_FREGS+(31*8)(r31)
+ +
+ +	/* Restore LR and CCR, and set CTR to the NIP value */
+ +	lwz	r3,_UC_GREGS+(PT_LNK*4)(r31)
+ +	lwz	r4,_UC_GREGS+(PT_NIP*4)(r31)
+ +	lwz	r5,_UC_GREGS+(PT_CCR*4)(r31)
+ +	mtlr	r3
+ +	mtctr	r4
+ +	mtcr	r5
+ +
+ +	/* Restore the general registers */
+ +	lwz	r1,_UC_GREGS+(PT_R1*4)(r31)
+ +	lwz	r3,_UC_GREGS+(PT_R3*4)(r31)
+ +	lwz	r4,_UC_GREGS+(PT_R4*4)(r31)
+ +	lwz	r5,_UC_GREGS+(PT_R5*4)(r31)
+ +	lwz	r6,_UC_GREGS+(PT_R6*4)(r31)
+ +	lwz	r7,_UC_GREGS+(PT_R7*4)(r31)
+ +	lwz	r8,_UC_GREGS+(PT_R8*4)(r31)
+ +	lwz	r9,_UC_GREGS+(PT_R9*4)(r31)
+ +	lwz	r10,_UC_GREGS+(PT_R10*4)(r31)
+ +	lwz	r11,_UC_GREGS+(PT_R11*4)(r31)
+ +	lwz	r12,_UC_GREGS+(PT_R12*4)(r31)
+ +	lwz	r13,_UC_GREGS+(PT_R13*4)(r31)
+ +	lwz	r14,_UC_GREGS+(PT_R14*4)(r31)
+ +	lwz	r15,_UC_GREGS+(PT_R15*4)(r31)
+ +	lwz	r16,_UC_GREGS+(PT_R16*4)(r31)
+ +	lwz	r17,_UC_GREGS+(PT_R17*4)(r31)
+ +	lwz	r18,_UC_GREGS+(PT_R18*4)(r31)
+ +	lwz	r19,_UC_GREGS+(PT_R19*4)(r31)
+ +	lwz	r20,_UC_GREGS+(PT_R20*4)(r31)
+ +	lwz	r21,_UC_GREGS+(PT_R21*4)(r31)
+ +	lwz	r22,_UC_GREGS+(PT_R22*4)(r31)
+ +	lwz	r23,_UC_GREGS+(PT_R23*4)(r31)
+ +	lwz	r24,_UC_GREGS+(PT_R24*4)(r31)
+ +	lwz	r25,_UC_GREGS+(PT_R25*4)(r31)
+ +	lwz	r26,_UC_GREGS+(PT_R26*4)(r31)
+ +	lwz	r27,_UC_GREGS+(PT_R27*4)(r31)
+ +	lwz	r28,_UC_GREGS+(PT_R28*4)(r31)
+ +	lwz	r29,_UC_GREGS+(PT_R29*4)(r31)
+ +	lwz	r30,_UC_GREGS+(PT_R30*4)(r31)
+ +	lwz	r31,_UC_GREGS+(PT_R31*4)(r31)
+ +
+ +	bctr
+ +
+ +L(error_exit):
+ +	lwz	r31,12(r1)
+ +	lwz	r0,20(r1)
+ +	addi	r1,r1,16
+ +	mtlr	r0
+ +	blr
+ +	
+ +L(do_sigret):
+ +	addi	r1,r3,-0xd0
+ +	li	r0,SYS_ify(rt_sigreturn)
+ +	sc
+ +	/* NOTREACHED */
+ +
+ +PSEUDO_END(__setcontext)
+ +
+ +weak_alias(__setcontext, setcontext)
+ diff -Naurw glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/swapcontext.S glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/swapcontext.S
+ --- glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/swapcontext.S	1969-12-31 18:00:00.000000000 -0600
+ +++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/swapcontext.S	2003-06-20 19:27:38.000000000 -0500
+ @@ -0,0 +1,233 @@
+ +/* Save current context and jump to a new context.
+ +   Copyright (C) 2002 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>
+ +
+ +#define __ASSEMBLY__
+ +#include <asm/ptrace.h>
+ +#include "ucontext_i.h"
+ +
+ +ENTRY(__swapcontext)
+ +	/* Save the current context */
+ +	stw	r0,_UC_GREGS+(PT_R0*4)(r3)
+ +	stw	r1,_UC_GREGS+(PT_R1*4)(r3)
+ +	mflr	r0
+ +	stwu	r1,-16(r1)
+ +	stw	r0,20(r1)
+ +	stw	r31,12(r1)
+ +	stw	r31,_UC_GREGS+(PT_R31*4)(r3)
+ +	mr	r31,r4			/* new context pointer */
+ +	stw	r0,_UC_GREGS+(PT_LNK*4)(r3)
+ +	stw	r0,_UC_GREGS+(PT_NIP*4)(r3)
+ +	stw	r2,_UC_GREGS+(PT_R2*4)(r3)
+ +	stw	r4,_UC_GREGS+(PT_R4*4)(r3)
+ +	stw	r5,_UC_GREGS+(PT_R5*4)(r3)
+ +	stw	r6,_UC_GREGS+(PT_R6*4)(r3)
+ +	stw	r7,_UC_GREGS+(PT_R7*4)(r3)
+ +	stw	r8,_UC_GREGS+(PT_R8*4)(r3)
+ +	stw	r9,_UC_GREGS+(PT_R9*4)(r3)
+ +	stw	r10,_UC_GREGS+(PT_R10*4)(r3)
+ +	stw	r11,_UC_GREGS+(PT_R11*4)(r3)
+ +	stw	r12,_UC_GREGS+(PT_R12*4)(r3)
+ +	stw	r13,_UC_GREGS+(PT_R13*4)(r3)
+ +	stw	r14,_UC_GREGS+(PT_R14*4)(r3)
+ +	stw	r15,_UC_GREGS+(PT_R15*4)(r3)
+ +	stw	r16,_UC_GREGS+(PT_R16*4)(r3)
+ +	stw	r17,_UC_GREGS+(PT_R17*4)(r3)
+ +	stw	r18,_UC_GREGS+(PT_R18*4)(r3)
+ +	stw	r19,_UC_GREGS+(PT_R19*4)(r3)
+ +	stw	r20,_UC_GREGS+(PT_R20*4)(r3)
+ +	stw	r21,_UC_GREGS+(PT_R21*4)(r3)
+ +	stw	r22,_UC_GREGS+(PT_R22*4)(r3)
+ +	stw	r23,_UC_GREGS+(PT_R23*4)(r3)
+ +	stw	r24,_UC_GREGS+(PT_R24*4)(r3)
+ +	stw	r25,_UC_GREGS+(PT_R25*4)(r3)
+ +	stw	r26,_UC_GREGS+(PT_R26*4)(r3)
+ +	stw	r27,_UC_GREGS+(PT_R27*4)(r3)
+ +	stw	r28,_UC_GREGS+(PT_R28*4)(r3)
+ +	stw	r29,_UC_GREGS+(PT_R29*4)(r3)
+ +	stw	r30,_UC_GREGS+(PT_R30*4)(r3)
+ +	mfctr	r0
+ +	stw	r0,_UC_GREGS+(PT_CTR*4)(r3)
+ +	mfxer	r0
+ +	stw	r0,_UC_GREGS+(PT_XER*4)(r3)
+ +	mfcr	r0
+ +	stw	r0,_UC_GREGS+(PT_CCR*4)(r3)
+ +
+ +	/* Set the return value of swapcontext to "success".  R3 is the only 
+ +	   register whose value is not preserved in the saved context.  */
+ +	li	r0,0
+ +	stw	r0,_UC_GREGS+(PT_R3*4)(r3)
+ +
+ +	/* Zero fill fields that can't be set in user state. */
+ +	stw	r0,_UC_GREGS+(PT_MSR*4)(r3)
+ +	stw	r0,_UC_GREGS+(PT_MQ*4)(r3)
+ +
+ +	/* Save the floating-point registers */
+ +	stfd	fp0,_UC_FREGS+(0*8)(r3)
+ +	stfd	fp1,_UC_FREGS+(1*8)(r3)
+ +	stfd	fp2,_UC_FREGS+(2*8)(r3)
+ +	stfd	fp3,_UC_FREGS+(3*8)(r3)
+ +	stfd	fp4,_UC_FREGS+(4*8)(r3)
+ +	stfd	fp5,_UC_FREGS+(5*8)(r3)
+ +	stfd	fp6,_UC_FREGS+(6*8)(r3)
+ +	stfd	fp7,_UC_FREGS+(7*8)(r3)
+ +	stfd	fp8,_UC_FREGS+(8*8)(r3)
+ +	stfd	fp9,_UC_FREGS+(9*8)(r3)
+ +	stfd	fp10,_UC_FREGS+(10*8)(r3)
+ +	stfd	fp11,_UC_FREGS+(11*8)(r3)
+ +	stfd	fp12,_UC_FREGS+(12*8)(r3)
+ +	stfd	fp13,_UC_FREGS+(13*8)(r3)
+ +	stfd	fp14,_UC_FREGS+(14*8)(r3)
+ +	stfd	fp15,_UC_FREGS+(15*8)(r3)
+ +	stfd	fp16,_UC_FREGS+(16*8)(r3)
+ +	stfd	fp17,_UC_FREGS+(17*8)(r3)
+ +	stfd	fp18,_UC_FREGS+(18*8)(r3)
+ +	stfd	fp19,_UC_FREGS+(19*8)(r3)
+ +	stfd	fp20,_UC_FREGS+(20*8)(r3)
+ +	stfd	fp21,_UC_FREGS+(21*8)(r3)
+ +	stfd	fp22,_UC_FREGS+(22*8)(r3)
+ +	stfd	fp23,_UC_FREGS+(23*8)(r3)
+ +	stfd	fp24,_UC_FREGS+(24*8)(r3)
+ +	stfd	fp25,_UC_FREGS+(25*8)(r3)
+ +	stfd	fp26,_UC_FREGS+(26*8)(r3)
+ +	stfd	fp27,_UC_FREGS+(27*8)(r3)
+ +	stfd	fp28,_UC_FREGS+(28*8)(r3)
+ +	stfd	fp29,_UC_FREGS+(29*8)(r3)
+ +	mffs	fp0
+ +	stfd	fp30,_UC_FREGS+(30*8)(r3)
+ +	stfd	fp31,_UC_FREGS+(31*8)(r3)
+ +	stfd	fp0,_UC_FREGS+(32*8)(r3)
+ +
+ +	addi	r5,r3,_UC_SIGMASK
+ +	addi	r4,r4,_UC_SIGMASK
+ +	li	r3,SIG_SETMASK
+ +	bl	JUMPTARGET(sigprocmask)
+ +	cmpwi	r3,0
+ +	bne	L(error_exit)
+ +
+ +	/*
+ +	 * If the new ucontext refers to the point where we were interrupted
+ +	 * by a signal, we have to use the rt_sigreturn system call to
+ +	 * return to the context so we get both LR and CTR restored.
+ +	 *
+ +	 * Otherwise, the context we are restoring is either just after
+ +	 * a procedure call (getcontext/swapcontext) or at the beginning
+ +	 * of a procedure call (makecontext), so we don't need to restore
+ +	 * r0, xer, ctr.  We don't restore r2 since it will be used as
+ +	 * the TLS pointer.
+ +	 */
+ +	lwz	r0,_UC_GREGS+(PT_MSR*4)(r31)
+ +	cmpwi	r0,0
+ +	bne	L(do_sigret)
+ +
+ +	/* Restore the floating-point registers */
+ +	lfd	fp31,_UC_FREGS+(32*8)(r31)
+ +	lfd	fp0,_UC_FREGS+(0*8)(r31)
+ +	mtfsf	0xff,fp31
+ +	lfd	fp1,_UC_FREGS+(1*8)(r31)
+ +	lfd	fp2,_UC_FREGS+(2*8)(r31)
+ +	lfd	fp3,_UC_FREGS+(3*8)(r31)
+ +	lfd	fp4,_UC_FREGS+(4*8)(r31)
+ +	lfd	fp5,_UC_FREGS+(5*8)(r31)
+ +	lfd	fp6,_UC_FREGS+(6*8)(r31)
+ +	lfd	fp7,_UC_FREGS+(7*8)(r31)
+ +	lfd	fp8,_UC_FREGS+(8*8)(r31)
+ +	lfd	fp9,_UC_FREGS+(9*8)(r31)
+ +	lfd	fp10,_UC_FREGS+(10*8)(r31)
+ +	lfd	fp11,_UC_FREGS+(11*8)(r31)
+ +	lfd	fp12,_UC_FREGS+(12*8)(r31)
+ +	lfd	fp13,_UC_FREGS+(13*8)(r31)
+ +	lfd	fp14,_UC_FREGS+(14*8)(r31)
+ +	lfd	fp15,_UC_FREGS+(15*8)(r31)
+ +	lfd	fp16,_UC_FREGS+(16*8)(r31)
+ +	lfd	fp17,_UC_FREGS+(17*8)(r31)
+ +	lfd	fp18,_UC_FREGS+(18*8)(r31)
+ +	lfd	fp19,_UC_FREGS+(19*8)(r31)
+ +	lfd	fp20,_UC_FREGS+(20*8)(r31)
+ +	lfd	fp21,_UC_FREGS+(21*8)(r31)
+ +	lfd	fp22,_UC_FREGS+(22*8)(r31)
+ +	lfd	fp23,_UC_FREGS+(23*8)(r31)
+ +	lfd	fp24,_UC_FREGS+(24*8)(r31)
+ +	lfd	fp25,_UC_FREGS+(25*8)(r31)
+ +	lfd	fp26,_UC_FREGS+(26*8)(r31)
+ +	lfd	fp27,_UC_FREGS+(27*8)(r31)
+ +	lfd	fp28,_UC_FREGS+(28*8)(r31)
+ +	lfd	fp29,_UC_FREGS+(29*8)(r31)
+ +	lfd	fp30,_UC_FREGS+(30*8)(r31)
+ +	lfd	fp31,_UC_FREGS+(31*8)(r31)
+ +
+ +	/* Restore LR and CCR, and set CTR to the NIP value */
+ +	lwz	r3,_UC_GREGS+(PT_LNK*4)(r31)
+ +	lwz	r4,_UC_GREGS+(PT_NIP*4)(r31)
+ +	lwz	r5,_UC_GREGS+(PT_CCR*4)(r31)
+ +	mtlr	r3
+ +	mtctr	r4
+ +	mtcr	r5
+ +
+ +	/* Restore the general registers */
+ +	lwz	r1,_UC_GREGS+(PT_R1*4)(r31)
+ +	lwz	r3,_UC_GREGS+(PT_R3*4)(r31)
+ +	lwz	r4,_UC_GREGS+(PT_R4*4)(r31)
+ +	lwz	r5,_UC_GREGS+(PT_R5*4)(r31)
+ +	lwz	r6,_UC_GREGS+(PT_R6*4)(r31)
+ +	lwz	r7,_UC_GREGS+(PT_R7*4)(r31)
+ +	lwz	r8,_UC_GREGS+(PT_R8*4)(r31)
+ +	lwz	r9,_UC_GREGS+(PT_R9*4)(r31)
+ +	lwz	r10,_UC_GREGS+(PT_R10*4)(r31)
+ +	lwz	r11,_UC_GREGS+(PT_R11*4)(r31)
+ +	lwz	r12,_UC_GREGS+(PT_R12*4)(r31)
+ +	lwz	r13,_UC_GREGS+(PT_R13*4)(r31)
+ +	lwz	r14,_UC_GREGS+(PT_R14*4)(r31)
+ +	lwz	r15,_UC_GREGS+(PT_R15*4)(r31)
+ +	lwz	r16,_UC_GREGS+(PT_R16*4)(r31)
+ +	lwz	r17,_UC_GREGS+(PT_R17*4)(r31)
+ +	lwz	r18,_UC_GREGS+(PT_R18*4)(r31)
+ +	lwz	r19,_UC_GREGS+(PT_R19*4)(r31)
+ +	lwz	r20,_UC_GREGS+(PT_R20*4)(r31)
+ +	lwz	r21,_UC_GREGS+(PT_R21*4)(r31)
+ +	lwz	r22,_UC_GREGS+(PT_R22*4)(r31)
+ +	lwz	r23,_UC_GREGS+(PT_R23*4)(r31)
+ +	lwz	r24,_UC_GREGS+(PT_R24*4)(r31)
+ +	lwz	r25,_UC_GREGS+(PT_R25*4)(r31)
+ +	lwz	r26,_UC_GREGS+(PT_R26*4)(r31)
+ +	lwz	r27,_UC_GREGS+(PT_R27*4)(r31)
+ +	lwz	r28,_UC_GREGS+(PT_R28*4)(r31)
+ +	lwz	r29,_UC_GREGS+(PT_R29*4)(r31)
+ +	lwz	r30,_UC_GREGS+(PT_R30*4)(r31)
+ +	lwz	r31,_UC_GREGS+(PT_R31*4)(r31)
+ +
+ +	bctr
+ +
+ +L(error_exit):
+ +	lwz	r31,12(r1)
+ +	lwz	r0,20(r1)
+ +	addi	r1,r1,16
+ +	mtlr	r0
+ +	blr
+ +
+ +L(do_sigret):
+ +	addi	r1,r31,-0xd0
+ +	li	r0,SYS_ify(rt_sigreturn)
+ +	sc
+ +	/* NOTREACHED */
+ +
+ +PSEUDO_END(__swapcontext)
+ +
+ +weak_alias(__swapcontext, swapcontext)
+ diff -Naurw glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/ucontext_i.h glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/ucontext_i.h
+ --- glibc-2.2.5.orig/sysdeps/unix/sysv/linux/powerpc/ucontext_i.h	1969-12-31 18:00:00.000000000 -0600
+ +++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/ucontext_i.h	2003-06-20 19:27:38.000000000 -0500
+ @@ -0,0 +1,30 @@
+ +/* Offsets and other constants needed in the *context() function
+ +   implementation.
+ +   Copyright (C) 2002 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.  */
+ +
+ +#define SIG_BLOCK	0
+ +#define SIG_SETMASK	2
+ +
+ +#define _UC_LINK	4
+ +#define _UC_STACK_SP	8
+ +#define _UC_STACK_SIZE	16
+ +#define _UC_SIGMASK	64
+ +#define _UC_GREGS	192
+ +#define _UC_FREGS	384
+ +#define _UC_VREGS	656