getcontext() on ppc32 destroys saved parameter 1 in caller's frame
Jakub Bogusz
qboosh@pld-linux.org
Sun Aug 29 17:23:00 GMT 2004
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/
More information about the Libc-alpha
mailing list