This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
getcontext() on ppc32 destroys saved parameter 1 in caller's frame
- From: Jakub Bogusz <qboosh at pld-linux dot org>
- To: libc-alpha at sources dot redhat dot com
- Cc: sjmunroe at us dot ibm dot com
- Date: Sun, 29 Aug 2004 19:25:25 +0200
- Subject: getcontext() on ppc32 destroys saved parameter 1 in caller's frame
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.
--
Jakub Bogusz http://cyber.cs.net.pl/~qboosh/
PLD Team http://www.pld-linux.org/