[Linux-ia64] setjmp/longjmp redux

chas williams
2001-06-14T19:15:09Z

hi, new to the list but i did a little reading of the archives and it seems
that setjmp/longjmp cant do what i need -- switch the stack.

why do i want to do this? i am working on porting openafs which provides
its own thread library (called lwp) that is implemented with setjmp/longjmp.
what needs to be done in order to make this work? based on my reading
it seems that ar.rnat (???) need to be saved between the context switches?
i dont know much about the ia64 architecture so if someone could give me
some pointers i would be grateful.

the following code works, but only under cc -g. using cc -O fails. i assume
that i am getting 'lucky' using -g.

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

static int rc;
static jmp_buf env;

dump_jmp_buf(jmp_buf a)
{
int i;
long *ptr = (long *)a;
for ( i=0; i < 70; i++)
if (ptr[i] != 0) printf("(%d) 0x%lx\n",i, ptr[i]);
}

main()
{
char *altstack;
unsigned long *patcher;
int stacksize = 16*1024;

altstack = malloc(192*1024);

printf("altstack = %p\n", altstack);
printf("&rc = %p\n", &rc);

rc = setjmp(env);
printf("rc = %d\n", rc);
if (rc = 1)
{
printf("return from longjmp\n");
exit(0);
}

((unsigned long *)env)[0] = (unsigned long *)(altstack + stacksize - 32);

dump_jmp_buf(env);

printf("about to longjmp()...\n");
longjmp(env, 1);
}