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