|
Lines 142-147
Link Here
|
| 142 |
static int rc; |
142 |
static int rc; |
| 143 |
static jmp_buf_type *jmpBuffer; |
143 |
static jmp_buf_type *jmpBuffer; |
| 144 |
|
144 |
|
|
|
145 |
/** Starting with Glibc 2.4 pointers in jmp_buf are mangled (XOR) for "protection". |
| 146 |
* On Sparc ucontext functions are not implemented. |
| 147 |
*/ |
| 148 |
#ifdef AFS_LINUX20_ENV |
| 149 |
|
| 150 |
#ifdef __GLIBC__ |
| 151 |
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3) |
| 152 |
|
| 153 |
#ifdef AFS_SPARC64_LINUX24_ENV |
| 154 |
static int ptr_mangle(int p) |
| 155 |
{ |
| 156 |
register char *tls_ptr __asm__("%g7"); |
| 157 |
return p ^ *(int*)(tls_ptr + 0x18); |
| 158 |
} |
| 159 |
#else |
| 160 |
#error need ptr_demangle support or use UCONTEXT |
| 161 |
#endif |
| 162 |
|
| 163 |
#endif |
| 164 |
#endif |
| 165 |
|
| 166 |
#else |
| 167 |
#define ptr_mangle(x) (x) |
| 168 |
#endif |
| 169 |
|
| 170 |
|
| 145 |
afs_int32 |
171 |
afs_int32 |
| 146 |
savecontext(ep, savearea, sp) |
172 |
savecontext(ep, savearea, sp) |
| 147 |
char (*ep) (); |
173 |
char (*ep) (); |
|
Lines 155-161
Link Here
|
| 155 |
|
181 |
|
| 156 |
code = setjmp(savearea->setjmp_buffer); |
182 |
code = setjmp(savearea->setjmp_buffer); |
| 157 |
jmpBuffer = (jmp_buf_type *) savearea->setjmp_buffer; |
183 |
jmpBuffer = (jmp_buf_type *) savearea->setjmp_buffer; |
| 158 |
savearea->topstack = (char *)jmpBuffer[LWP_SP]; |
184 |
savearea->topstack = (char *) ptr_mangle(jmpBuffer[LWP_SP]); |
| 159 |
|
185 |
|
| 160 |
#if defined(DEBUG) |
186 |
#if defined(DEBUG) |
| 161 |
{ |
187 |
{ |
|
Lines 178-186
Link Here
|
| 178 |
switch (rc) { |
204 |
switch (rc) { |
| 179 |
case 0: |
205 |
case 0: |
| 180 |
jmpBuffer = (jmp_buf_type *) jmp_tmp; |
206 |
jmpBuffer = (jmp_buf_type *) jmp_tmp; |
| 181 |
jmpBuffer[LWP_SP] = (jmp_buf_type) sp; |
207 |
jmpBuffer[LWP_SP] = ptr_mangle((jmp_buf_type) sp); |
| 182 |
#if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV)) |
208 |
#if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV)) |
| 183 |
jmpBuffer[LWP_FP] = (jmp_buf_type) sp; |
209 |
jmpBuffer[LWP_FP] = ptr_mangle((jmp_buf_type) sp); |
| 184 |
#endif |
210 |
#endif |
| 185 |
longjmp(jmp_tmp, 1); |
211 |
longjmp(jmp_tmp, 1); |
| 186 |
break; |
212 |
break; |