[PATCH] PPC64 Add ucontext.h and *context functions
Steven Munroe
sjmunroe@us.ibm.com
Fri Jan 17 01:04:00 GMT 2003
For PPC64 we want to support the context functions and include the FPU
registers in
sigcontext. Plus we want to prepare for extentions to the
sigcontext/ucontext for new hardware features. The attached patch
defines a common ucontext.h for PPC32/PPC64 and implements the context
functions for PPC64. Finally full function of set/swapcontext depends
on the 2.4.21 kernel.
The PPC64 (or PPC32) ISA can't restore (set/swapcontext) the context
without using the link (lr) or count (ctr) register to transfer control
the target context. Clobbering ctr is no problem when the context is
created by getcontext as the ctr is volatile and not preserved across
function calls anyway. While lr must be preserved to enable
makecontext.
However if the [u]context is the result of a signal (sigalarm), ctr may
contain valid data (a loop counter). Paul Mackerras suggested using
rt_sigreturn to restore the context in the case the context is generated
by a signal. This requires a wink and nod between glibc and the kernel
since normally only the signal trampoline (built by the kernel) uses the
rt-sigreturn syscall. To use rt_sigreturn we must convert a ucontext
address parameter (r3) into a "sigframe" stack entry (r1).
To minimize glibc/kernel dependencies, the 2.4.21 PPC64 kernel changes
the signal trampoline to first pop the dummy frame (via addi) before the
rt-sigreturn syscall. This means that when rt_sigreturn gets control R1
points directly at the sigframe. The layout of the sigframe was also
adjusted so the ucontext struct is now at offset 0. So the ucontext
address (R3) is also the "sigframe" address. Copy R3 to R1 and syscall
rt_sigreturn.
2003-01-16 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S: New
file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S: New
file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S: New
file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S: New
file.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h: New
file.
* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: New file.
* sysdeps/unix/sysv/linux/configure.in: Minimum kernel is 2.4.21.
--
Steven Munroe
sjmunroe@us.ibm.com
Linux on PowerPC-64 Development
GLIBC for PowerPC-64 Development
-------------- next part --------------
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/configure.in libc23/sysdeps/unix/sysv/linux/configure.in
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/configure.in 2002-11-19 00:41:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/configure.in 2003-01-16 14:40:01.000000000 -0600
@@ -65,7 +65,7 @@ case "$machine" in
;;
hppa*)
libc_cv_gcc_unwind_find_fde=yes
- arch_minimum_kernel=2.4.19
+ arch_minimum_kernel=2.4.21
;;
m68k*)
arch_minimum_kernel=2.0.10
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S 1969-12-31 18:00:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S 2003-01-16 14:09:10.000000000 -0600
@@ -0,0 +1,138 @@
+/* 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)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
+ std r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
+ mflr r0
+ std r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
+ std r0,FRAME_LR_SAVE(r1)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
+ stdu r1,-128(r1)
+ std r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r3)
+ std r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r3)
+ std r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r3)
+ std r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r3)
+ std r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r3)
+ std r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r3)
+ std r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r3)
+ std r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r3)
+ std r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r3)
+ std r13,(SIGCONTEXT_GP_REGS+(PT_R13*8))(r3)
+ std r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r3)
+ std r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r3)
+ std r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r3)
+ std r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r3)
+ std r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r3)
+ std r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r3)
+ std r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r3)
+ std r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r3)
+ std r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r3)
+ std r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r3)
+ std r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r3)
+ std r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r3)
+ std r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r3)
+ std r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r3)
+ std r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r3)
+ std r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
+ std r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r3)
+ std r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r3)
+ mfctr r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_CTR*8))(r3)
+ mfxer r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
+ mfcr r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(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
+ std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
+
+ /* Zero fill fields that can't be set in user state or are unused. */
+ std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_SOFTE*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(40*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
+
+ /* Set the PT_REGS pointer to the address of sigcontext's gp_regs
+ field. Struct pt_regs and elf_gregset_t are the same thing.
+ We kept the regs field for backwards compatibility with
+ libraries built before we extended sigcontext. */
+ addi r0,r3,SIGCONTEXT_GP_REGS
+ std r0,SIGCONTEXT_PT_REGS(r3)
+
+ stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
+ stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
+ stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
+ stfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r3)
+ stfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r3)
+ stfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r3)
+ stfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r3)
+ stfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r3)
+ stfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r3)
+ stfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r3)
+ stfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r3)
+ stfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r3)
+ stfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r3)
+ stfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r3)
+ stfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r3)
+ stfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r3)
+ stfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r3)
+ stfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r3)
+ stfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r3)
+ stfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r3)
+ stfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r3)
+ stfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r3)
+ stfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r3)
+ stfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r3)
+ stfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r3)
+ stfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r3)
+ stfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r3)
+ stfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r3)
+ stfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r3)
+ stfd fp29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
+ mffs fp0
+ stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
+ stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
+ stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
+
+ addi r5,r3,UCONTEXT_SIGMASK
+ li r4,0
+ li r3,SIG_BLOCK
+ bl .sigprocmask
+ nop
+
+ ld r0,128+FRAME_LR_SAVE(r1)
+ addi r1,r1,128
+ mtlr r0
+ blr
+PSEUDO_END(__getcontext)
+
+weak_alias(__getcontext, getcontext)
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 1969-12-31 18:00:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S 2003-01-16 14:09:10.000000000 -0600
@@ -0,0 +1,161 @@
+/* Create 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(__makecontext)
+ /* Save parameters into the parameter save area of callers frame. */
+ std r3,FRAME_PARM1_SAVE(r1) /* ucontext_t *ucp */
+ std r4,FRAME_PARM2_SAVE(r1) /* void (*func)(void) */
+ std r5,FRAME_PARM3_SAVE(r1) /* int argc */
+ std r6,FRAME_PARM4_SAVE(r1) /* ... */
+ std r7,FRAME_PARM5_SAVE(r1)
+ std r8,FRAME_PARM6_SAVE(r1)
+ std r9,FRAME_PARM7_SAVE(r1)
+ std r10,FRAME_PARM8_SAVE(r1)
+ mflr r0
+ /* Get the address of the target functions first parameter. */
+ addi r6,r1,FRAME_PARM4_SAVE
+ std r0,FRAME_LR_SAVE(r1)
+ stdu r1,-128(r1)
+
+ /* Get the ucontexts stack pointer and size. Compute the top of stack
+ and round down to a quadword boundary. Then stack a dummy frame
+ with a null back chain. We store the context pointer in the frames
+ "compiler double word" field so we can recover if is the function
+ returns. Finally save the callers link register and TOC pointer
+ into this frame so the debugger can display a backtrace.
+ */
+ ld r7,UCONTEXT_STACK_SP(r3)
+ ld r0,UCONTEXT_STACK_SIZE(r3)
+ add r7,r7,r0
+ clrrdi r7,r7,4
+ li r0,0
+ stdu r0,-48(r7)
+ std r3,24(r7)
+ mflr r0
+ std r2,FRAME_TOC_SAVE(r7) /* Store the TOC pointer for later. */
+ std r0,FRAME_LR_SAVE(r7)
+
+ /* Now we need to stack another frame to hold the parameter save area
+ for the function. We need to allocate a frame with the minimum 48
+ byte header and 8 parameter register. However if there are more
+ than 8 parameters addition space is need to hold all the parameters.
+ The total size it rounded up to a quadword multiple then a frame is
+ stacked. This address is stored in the ucontext as GPR 1. */
+
+ cmpdi cr1,r5,8
+ sldi r8,r5,3
+ bgt cr1,L(gt8)
+ li r8,64
+L(gt8):
+ addi r8,r8,FRAME_PARM_SAVE+8 /* Add header plus rounding factor. */
+ clrrdi r8,r8,4 /* Round down to quadword. */
+
+ subf r8,r8,r7
+ std r7,0(r8) /* Stack the frame. */
+ std r8,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
+
+ /* Now we need to copy the target functions parameters. The functions
+ parameters are saved in the parameter save area. We skip over the
+ first three parameters and copy up to 8 double word into the
+ SIGCONTEXT_GP_REGS starting with R3. If there are more than 8
+ parameters then doublewords 8-N are copied into the parameter
+ save area of the context frame. */
+ cmpdi r5,0
+ beq L(noparms)
+ mr r0,r5
+ ble cr1,L(le8)
+ li r0,8
+L(le8):
+ mtctr r0
+ addi r7,r6,-8
+ addi r9,r3,(SIGCONTEXT_GP_REGS+(PT_R3*8)-8)
+L(parmloop2):
+ ldu r0,8(r7)
+ stdu r0,8(r9)
+ bdnz L(parmloop2)
+
+ addi r0,r5,-8
+ ble cr1,L(noparms)
+ mtctr r0
+ addi r9,r8,FRAME_PARM9_SAVE-8
+L(parmloop):
+ ldu r0,8(r7)
+ stdu r0,8(r9)
+ bdnz L(parmloop)
+
+L(noparms):
+
+ /* Load the function address and TOC from the function descriptor
+ and store them in the ucontext as NIP and r2. Store the 3rd
+ field of the function descriptor into the ucontext as r11 in case
+ the calling language needs the "environment pointer". */
+ ld r0,0(r4)
+ ld r10,8(r4);
+ ld r9,16(r4);
+ std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
+ std r10,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
+ std r9,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r3)
+
+ /* If the target function returns we need to do some cleanup. We use a
+ code trick to get the address of our cleanup function into the link
+ register. Do not add any code between here and L(exitcode). */
+ bl L(gotexitcodeaddr);
+
+ /* This is the helper code which gets called if a function which
+ is registered with 'makecontext' returns. In this case we
+ have to install the context listed in the uc_link element of
+ the context 'makecontext' manipulated at the time of the
+ 'makecontext' call. If the pointer is NULL the process must
+ terminate. */
+L(exitcode):
+ /* Recover the ucontext and TOC from the dummy frame. */
+ ld r1,FRAME_BACKCHAIN(r1) /* Unstack the parameter save area frame. */
+ ld r3,FRAME_COMPILER_DW(r1)
+ ld r2,FRAME_TOC_SAVE(r1)
+ ld r3,UCONTEXT_LINK(r3) /* Load the resume context. */
+ cmpdi r3,0
+ beq L(BADSTATUS)
+ bl JUMPTARGET(__setcontext)
+ nop
+
+L(BADSTATUS):
+/* If setcontext returns (which can happen if the syscall fails) we will
+ exit the program with error status (-1). */
+ li r3,-1
+ b JUMPTARGET(exit);
+
+ /* The address of the exit code is in the link register. Store the lr
+ in the ucontext as LNK so the target function will return to our
+ exit code. */
+L(gotexitcodeaddr):
+ mflr r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
+ ld r0,128+FRAME_LR_SAVE(r1)
+ addi r1,r1,128
+ mtlr r0
+ blr
+END(__makecontext)
+
+weak_alias(__makecontext, makecontext)
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S 1969-12-31 18:00:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S 2003-01-16 14:09:10.000000000 -0600
@@ -0,0 +1,162 @@
+/* Switch to 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
+ std r31,-8(1)
+ std r0,FRAME_LR_SAVE(r1)
+ stdu r1,-128(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
+ * msr and ctr. We don't restore r13 since it will be used as
+ * the TLS pointer. */
+ lwz r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
+ cmpdi r0,0
+ bne L(do_sigret)
+
+ li r5,0
+ addi r4,r3,UCONTEXT_SIGMASK
+ li r3,SIG_SETMASK
+ bl .sigprocmask
+ nop
+ cmpdi r3,0
+ bne L(error_exit)
+
+ lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
+ lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
+ lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
+ mtfsf 0xff,fp0
+ lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
+ lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
+ lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
+ lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
+ lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
+ lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
+ lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
+ lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
+ lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
+ lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
+ lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
+ lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
+ lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
+ lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
+ lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
+ lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
+ lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
+ lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
+ lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
+ lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
+ lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
+ lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
+ lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
+ lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
+ lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
+ lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
+ lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
+ lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
+ lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
+ lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
+
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
+ ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
+ mtlr r0
+ ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r31)
+ ld r3,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r31)
+ mtxer r0
+ ld r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r31)
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r31)
+ ld r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r31)
+ mfcr r0
+ ld r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r31)
+ ld r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r31)
+ ld r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r31)
+ ld r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r31)
+ ld r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r31)
+ ld r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r31)
+ ld r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r31)
+ /* Don't reload the thread ID or TLS pointer (r13). */
+ ld r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r31)
+ ld r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r31)
+ ld r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r31)
+ ld r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r31)
+ ld r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r31)
+ ld r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r31)
+ ld r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r31)
+ ld r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r31)
+ ld r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r31)
+ ld r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r31)
+ ld r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r31)
+ ld r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r31)
+ ld r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r31)
+ ld r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r31)
+ ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
+ ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
+ ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
+
+ /* Now we branch to the "Next Instruction Pointer" from the saved
+ context. With the powerpc64 instruction set there is no good way to
+ do this (from user state) without clobbering either the LR or CTR.
+ The makecontext and swapcontext functions depend on the callers
+ LR being preserved so we use the CTR. */
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
+ mtctr r0
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
+ ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
+ bctr
+
+L(error_exit):
+ ld r0,128+FRAME_LR_SAVE(r1)
+ addi r1,r1,128
+ mtlr r0
+ ld r31,-8(r1)
+ blr
+
+ /* At this point we assume that the ucontext was created by a
+ rt_signal and we should use rt_sigreturn to restore the original
+ state. As of the 2.4.21 kernel the ucontext is the first thing
+ (offset 0) in the rt_signal frame and rt_sigreturn expects the
+ ucontext address in R1. Normally the rt-signal trampoline handles
+ this by popping dummy frame before the rt_signal syscall. In our
+ case the stack may not be in its original (signal handler return with
+ R1 pointing at the dummy frame) state. We do have the ucontext
+ address in R3, so simply copy R3 to R1 before the syscall. */
+L(do_sigret):
+ mr r1,r3,
+ li r0,SYS_ify(rt_sigreturn)
+ sc
+ /* No return. */
+
+PSEUDO_END(__setcontext)
+
+weak_alias(__setcontext, setcontext)
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S 1969-12-31 18:00:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S 2003-01-16 14:09:10.000000000 -0600
@@ -0,0 +1,257 @@
+/* Save current context and install the given one.
+ 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)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
+ std r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
+ mflr r0
+ std r31,-8(1)
+ std r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
+ std r0,FRAME_LR_SAVE(r1)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
+ stdu r1,-128(r1)
+ std r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r3)
+ std r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r3)
+ std r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r3)
+ std r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r3)
+ std r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r3)
+ std r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r3)
+ std r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r3)
+ std r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r3)
+ std r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r3)
+ std r13,(SIGCONTEXT_GP_REGS+(PT_R13*8))(r3)
+ std r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r3)
+ std r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r3)
+ std r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r3)
+ std r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r3)
+ std r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r3)
+ std r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r3)
+ std r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r3)
+ std r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r3)
+ std r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r3)
+ std r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r3)
+ std r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r3)
+ std r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r3)
+ std r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r3)
+ std r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r3)
+ std r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r3)
+ std r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
+ std r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r3)
+ std r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r3)
+ mfctr r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_CTR*8))(r3)
+ mfxer r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
+ mfcr r0
+ std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(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
+ std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
+
+ /* Zero fill fields that can't be set in user state or are unused. */
+ std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_SOFTE*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(40*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
+ std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
+
+ /* Set the PT_REGS pointer to the address of sigcontext gp_regs
+ field. Struct pt_regs and elf_gregset_t are the same thing.
+ We kept the regs field for backwards compatibility with
+ libraries built before we extended sigcontext. */
+ addi r0,r3,SIGCONTEXT_GP_REGS
+ std r0,SIGCONTEXT_PT_REGS(r3)
+
+ stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
+ stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
+ stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
+ stfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r3)
+ stfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r3)
+ stfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r3)
+ stfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r3)
+ stfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r3)
+ stfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r3)
+ stfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r3)
+ stfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r3)
+ stfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r3)
+ stfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r3)
+ stfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r3)
+ stfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r3)
+ stfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r3)
+ stfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r3)
+ stfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r3)
+ stfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r3)
+ stfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r3)
+ stfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r3)
+ stfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r3)
+ stfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r3)
+ stfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r3)
+ stfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r3)
+ stfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r3)
+ stfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r3)
+ stfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r3)
+ stfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r3)
+ stfd fp29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
+ mffs fp0
+ stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
+ stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
+ stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
+
+ mr r31,r4
+ addi r5,r3,UCONTEXT_SIGMASK
+ addi r4,r4,UCONTEXT_SIGMASK
+ li r3,SIG_SETMASK
+ bl .sigprocmask
+ nop
+ cmpdi r3,0
+ bne L(error_exit)
+
+/*
+ * If this 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
+ * msr and ctr. We don't restore r13 since it will be used as
+ * the TLS pointer. */
+ lwz r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
+ cmpdi r0,0
+ bne L(do_sigret)
+
+ lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
+ lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
+ lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
+ mtfsf 0xff,fp0
+ lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
+ lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
+ lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
+ lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
+ lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
+ lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
+ lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
+ lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
+ lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
+ lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
+ lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
+ lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
+ lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
+ lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
+ lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
+ lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
+ lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
+ lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
+ lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
+ lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
+ lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
+ lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
+ lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
+ lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
+ lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
+ lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
+ lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
+ lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
+ lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
+ lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
+
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
+ ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
+ mtlr r0
+ ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r31)
+ ld r3,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r31)
+ mtxer r0
+ ld r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r31)
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r31)
+ ld r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r31)
+ mfcr r0
+ ld r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r31)
+ ld r7,(SIGCONTEXT_GP_REGS+(PT_R7*8))(r31)
+ ld r8,(SIGCONTEXT_GP_REGS+(PT_R8*8))(r31)
+ ld r9,(SIGCONTEXT_GP_REGS+(PT_R9*8))(r31)
+ ld r10,(SIGCONTEXT_GP_REGS+(PT_R10*8))(r31)
+ ld r11,(SIGCONTEXT_GP_REGS+(PT_R11*8))(r31)
+ ld r12,(SIGCONTEXT_GP_REGS+(PT_R12*8))(r31)
+ /* Don't reload the thread ID or TLS pointer (r13). */
+ ld r14,(SIGCONTEXT_GP_REGS+(PT_R14*8))(r31)
+ ld r15,(SIGCONTEXT_GP_REGS+(PT_R15*8))(r31)
+ ld r16,(SIGCONTEXT_GP_REGS+(PT_R16*8))(r31)
+ ld r17,(SIGCONTEXT_GP_REGS+(PT_R17*8))(r31)
+ ld r18,(SIGCONTEXT_GP_REGS+(PT_R18*8))(r31)
+ ld r19,(SIGCONTEXT_GP_REGS+(PT_R19*8))(r31)
+ ld r20,(SIGCONTEXT_GP_REGS+(PT_R20*8))(r31)
+ ld r21,(SIGCONTEXT_GP_REGS+(PT_R21*8))(r31)
+ ld r22,(SIGCONTEXT_GP_REGS+(PT_R22*8))(r31)
+ ld r23,(SIGCONTEXT_GP_REGS+(PT_R23*8))(r31)
+ ld r24,(SIGCONTEXT_GP_REGS+(PT_R24*8))(r31)
+ ld r25,(SIGCONTEXT_GP_REGS+(PT_R25*8))(r31)
+ ld r26,(SIGCONTEXT_GP_REGS+(PT_R26*8))(r31)
+ ld r27,(SIGCONTEXT_GP_REGS+(PT_R27*8))(r31)
+ ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
+ ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
+ ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
+
+ /* Now we branch to the "Next Instruction Pointer" from the saved
+ context. With the powerpc64 instruction set there is no good way to
+ do this (from user state) without clobbering either the LR or CTR.
+ The makecontext and swapcontext functions depend on the callers
+ LR being preserved so we use the CTR. */
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
+ mtctr r0
+ ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
+ ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
+ bctr
+
+L(error_exit):
+ ld r0,128+FRAME_LR_SAVE(r1)
+ addi r1,r1,128
+ mtlr r0
+ ld r31,-8(r1)
+ blr
+
+ /* At this point we assume that the ucontext was created by a
+ rt_signal and we should use rt_sigreturn to restore the original
+ state. As of the 2.4.21 kernel the ucontext is the first thing
+ (offset 0) in the rt_signal frame and rt_sigreturn expects the
+ ucontext address in R1. Normally the rt-signal trampoline handles
+ this by popping dummy frame before the rt_signal syscall. In our
+ case the stack may not be in its original (signal handler return with
+ R1 pointing at the dummy frame) state. We do have the ucontext
+ address in R3, so simply copy R3 to R1 before the syscall. */
+L(do_sigret):
+ mr r1,r3,
+ li r0,SYS_ify(rt_sigreturn)
+ sc
+ /* No return. */
+
+PSEUDO_END(__swapcontext)
+
+weak_alias(__swapcontext, swapcontext)
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h 1969-12-31 18:00:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h 2003-01-16 14:09:10.000000000 -0600
@@ -0,0 +1,58 @@
+/* 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
+
+/* Offsets of the fields in the powerpc64 ABI stack frame. */
+
+#define FRAME_BACKCHAIN 0
+#define FRAME_CR_SAVE 8
+#define FRAME_LR_SAVE 16
+#define FRAME_COMPILER_DW 24
+#define FRAME_LINKER_DW 32
+#define FRAME_TOC_SAVE 40
+#define FRAME_PARM_SAVE 48
+#define FRAME_PARM1_SAVE 48
+#define FRAME_PARM2_SAVE 56
+#define FRAME_PARM3_SAVE 64
+#define FRAME_PARM4_SAVE 72
+#define FRAME_PARM5_SAVE 80
+#define FRAME_PARM6_SAVE 88
+#define FRAME_PARM7_SAVE 96
+#define FRAME_PARM8_SAVE 104
+#define FRAME_PARM9_SAVE 112
+
+
+/* Offsets of the fields in the ucontext_t structure. */
+
+#define UCONTEXT_LINK 8
+#define UCONTEXT_STACK 16
+#define UCONTEXT_STACK_SP 16
+#define UCONTEXT_STACK_FLAGS 24
+#define UCONTEXT_STACK_SIZE 32
+#define UCONTEXT_SIGMASK 40
+#define UCONTEXT_MCONTEXT 168
+#define SIGCONTEXT_SIGNAL 200
+#define SIGCONTEXT_HANDLER 208
+#define SIGCONTEXT_OLDMASK 216
+#define SIGCONTEXT_PT_REGS 224
+#define SIGCONTEXT_GP_REGS 232
+#define SIGCONTEXT_FP_REGS 616
diff -rupPN -x CVS libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h libc23/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
--- libc23-cvstip-20030116/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h 1969-12-31 18:00:00.000000000 -0600
+++ libc23/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h 2003-01-16 14:09:10.000000000 -0600
@@ -0,0 +1,47 @@
+/* Copyright (C) 1998, 1999, 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. */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+/* We need the signal context definitions even if they are not used
+ included in <signal.h>. */
+#include <bits/sigcontext.h>
+
+/* A machine context is exactly a sigcontext. */
+typedef struct sigcontext mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+#if __WORDSIZE == 32
+ mcontext_t uc_mcontext;
+ __sigset_t uc_sigmask;
+#else
+ sigset_t uc_sigmask;
+ mcontext_t uc_mcontext; /* last for extensibility */
+#endif
+ } ucontext_t;
+
+#endif /* sys/ucontext.h */
More information about the Libc-alpha
mailing list