|
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 |
#define ptr_mangle(x) (x) |
| 149 |
#ifdef AFS_LINUX20_ENV |
| 150 |
|
| 151 |
#ifdef __GLIBC__ |
| 152 |
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3) |
| 153 |
|
| 154 |
#ifdef AFS_SPARC64_LINUX24_ENV |
| 155 |
#undef ptr_mangle |
| 156 |
static int ptr_mangle(int p) |
| 157 |
{ |
| 158 |
register char *tls_ptr __asm__("%g7"); |
| 159 |
return p ^ *(int*)(tls_ptr + 0x18); |
| 160 |
} |
| 161 |
#else |
| 162 |
#error need ptr_mangle support or use UCONTEXT |
| 163 |
#endif |
| 164 |
|
| 165 |
#endif |
| 166 |
#endif |
| 167 |
#endif |
| 168 |
|
| 169 |
|
| 145 |
afs_int32 |
170 |
afs_int32 |
| 146 |
savecontext(ep, savearea, sp) |
171 |
savecontext(ep, savearea, sp) |
| 147 |
char (*ep) (); |
172 |
char (*ep) (); |
|
Lines 155-161
Link Here
|
| 155 |
|
180 |
|
| 156 |
code = setjmp(savearea->setjmp_buffer); |
181 |
code = setjmp(savearea->setjmp_buffer); |
| 157 |
jmpBuffer = (jmp_buf_type *) savearea->setjmp_buffer; |
182 |
jmpBuffer = (jmp_buf_type *) savearea->setjmp_buffer; |
| 158 |
savearea->topstack = (char *)jmpBuffer[LWP_SP]; |
183 |
savearea->topstack = (char *) ptr_mangle(jmpBuffer[LWP_SP]); |
| 159 |
|
184 |
|
| 160 |
#if defined(DEBUG) |
185 |
#if defined(DEBUG) |
| 161 |
{ |
186 |
{ |
|
Lines 178-186
Link Here
|
| 178 |
switch (rc) { |
203 |
switch (rc) { |
| 179 |
case 0: |
204 |
case 0: |
| 180 |
jmpBuffer = (jmp_buf_type *) jmp_tmp; |
205 |
jmpBuffer = (jmp_buf_type *) jmp_tmp; |
| 181 |
jmpBuffer[LWP_SP] = (jmp_buf_type) sp; |
206 |
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)) |
207 |
#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; |
208 |
jmpBuffer[LWP_FP] = ptr_mangle((jmp_buf_type) sp); |
| 184 |
#endif |
209 |
#endif |
| 185 |
longjmp(jmp_tmp, 1); |
210 |
longjmp(jmp_tmp, 1); |
| 186 |
break; |
211 |
break; |