This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: getcontext() on ppc32 destroys saved parameter 1 in caller's frame
- From: Steve Munroe <sjmunroe at us dot ibm dot com>
- To: Jakub Bogusz <qboosh at pld-linux dot org>
- Cc: libc-alpha at sources dot redhat dot com
- Date: Mon, 30 Aug 2004 14:01:27 -0500
- Subject: Re: getcontext() on ppc32 destroys saved parameter 1 in caller's frame
Jakub Bogusz <qboosh@pld-linux.org> wrote on 08/29/2004 12:25:25 PM:
> GLIBC_2.3.4 getcontext() on ppc32 changes the value of the first
> parameter passed to caller's function.
> Testcase:
>
> $ cat tst_getcontext.c
> #include <ucontext.h>
>
> void test(volatile int a, volatile int b)
> {
> ucontext_t uc;
> printf("before: %d %d\n", a, b);
> getcontext(&uc);
> printf("after : %d %d\n", a, b);
> }
>
> int main()
> {
> test(1, 2);
> }
> $ ./tst_getcontext
> before: 1 2
> after : 2147478448 2
>
> ("volatile" is not needed when tst_getcontext is compiled without any
> optimization)
>
> It's caused by the first instruction of __getcontext()
> (sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S:29):
>
> ENTRY(__getcontext)
> stw r3,_FRAME_PARM_SAVE1(r1)
>
> __getcontext doesn't have its own stack frame, so it uses caller's
> stack frame, thus destroying it...
>
> The same applies to GLIBC_2.3.4 swapcontext(), but it may be less/not(?)
> harmful as successful swapcontext() never returns.
>
Actually the problem is a little different. The PPC32 ABI is different
from the PPC64 ABI in that it does not allocate space for the first
8-parms on in the stack frame. So the attempt to save r3 into the parm
save area (there is none in this frame) is storing over the variable "a".
So for PPC32 need to use negative offsets before pushing the small frame
that getcontext uses. Also getcontext should be returning 0 (in r3) to
indicate success.
Have you opened a buzilla for this?
Steven J. Munroe
Linux on Power Toolchain Architect
IBM Corporation, Linux Technology Center