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; |