--- src/lwp/process.c~ 2007-04-28 01:52:00.000000000 +0300 +++ src/lwp/process.c 2007-04-28 01:58:57.000000000 +0300 @@ -142,6 +142,32 @@ static int rc; static jmp_buf_type *jmpBuffer; +/** Starting with Glibc 2.4 pointers in jmp_buf are mangled (XOR) for "protection". + * On Sparc ucontext functions are not implemented. + */ +#ifdef AFS_LINUX20_ENV + +#ifdef __GLIBC__ +#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3) + +#ifdef AFS_SPARC64_LINUX24_ENV +static int ptr_mangle(int p) +{ + register char *tls_ptr __asm__("%g7"); + return p ^ *(int*)(tls_ptr + 0x18); +} +#else +#error need ptr_demangle support or use UCONTEXT +#endif + +#endif +#endif + +#else +#define ptr_mangle(x) (x) +#endif + + afs_int32 savecontext(ep, savearea, sp) char (*ep) (); @@ -155,7 +181,7 @@ code = setjmp(savearea->setjmp_buffer); jmpBuffer = (jmp_buf_type *) savearea->setjmp_buffer; - savearea->topstack = (char *)jmpBuffer[LWP_SP]; + savearea->topstack = (char *) ptr_mangle(jmpBuffer[LWP_SP]); #if defined(DEBUG) { @@ -178,9 +204,9 @@ switch (rc) { case 0: jmpBuffer = (jmp_buf_type *) jmp_tmp; - jmpBuffer[LWP_SP] = (jmp_buf_type) sp; + jmpBuffer[LWP_SP] = ptr_mangle((jmp_buf_type) sp); #if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV)) - jmpBuffer[LWP_FP] = (jmp_buf_type) sp; + jmpBuffer[LWP_FP] = ptr_mangle((jmp_buf_type) sp); #endif longjmp(jmp_tmp, 1); break;