2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 /* process.c - manage lwp context switches be means of setjmp/longjmp. */
16 #if defined(AFS_OSF_ENV) || defined(AFS_S390_LINUX20_ENV)
17 extern int PRE_Block; /* used in lwp.c and process.s */
19 extern char PRE_Block; /* used in lwp.c and process.s */
25 #if defined(AFS_SGI64_ENV)
31 #elif defined(AFS_HPUX_ENV)
33 #elif defined(AFS_LINUX20_ENV)
34 #if defined(AFS_PPC_LINUX20_ENV)
36 #elif defined(AFS_I386_LINUX20_ENV)
38 #elif defined(AFS_S390_LINUX20_ENV)
41 #elif defined(AFS_SPARC_LINUX20_ENV)
44 #elif defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV)
47 #elif defined(AFS_ALPHA_LINUX20_ENV)
51 #error Unsupported linux LWP system type.
54 Need offset to SP in jmp_buf for this platform.
58 * On SGIs the type of the elements of the array passed to setjmp
59 * differs based on the ISA chosen. It is int for mips1 and mips2 and
60 * __uint64_t for mips3 and mips4
64 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4)
65 typedef __uint64_t jmp_buf_type;
68 #ifdef AFS_ALPHA_LINUX20_ENV
69 typedef long jmp_buf_type;
71 typedef int jmp_buf_type;
72 #endif /*AFS_ALPHA_LINUX20_ENV*/
75 static jmp_buf jmp_tmp;
78 static jmp_buf_type *jmpBuffer;
81 savecontext(ep, savearea, sp)
83 struct lwp_context *savearea;
91 code = setjmp(savearea->setjmp_buffer);
92 jmpBuffer = (jmp_buf_type *)savearea->setjmp_buffer;
93 savearea->topstack = (char*)jmpBuffer[LWP_SP];
97 int i, *ptr = (int*)savearea->setjmp_buffer;
98 printf("savecontext\n");
99 for ( i=0; i < 5; i++)
100 printf("(%d) 0x%x ",i, ptr[i]);
102 for ( i=5; i < 10; i++)
103 printf("(%d) 0x%x ",i, ptr[i]);
113 rc = setjmp(jmp_tmp);
116 case 0: jmpBuffer = (jmp_buf_type *)jmp_tmp;
117 jmpBuffer[LWP_SP] = (jmp_buf_type)sp;
118 #if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV))
119 jmpBuffer[LWP_FP] = (jmp_buf_type)sp;
124 assert(0); /* never returns */
127 perror("Error in setjmp1\n");
132 case 2: /* restoring frame */
136 perror("Error in setjmp2 : restoring\n");
142 struct lwp_context *savearea;
145 int i, *ptr = savearea->setjmp_buffer;
147 printf("Returning to \n");
148 for ( i=0; i < 5; i++)
149 printf("(%d) 0x%x ",i, ptr[i]);
151 for ( i=5; i < 10; i++)
152 printf("(%d) 0x%x ",i, ptr[i]);
156 longjmp(savearea->setjmp_buffer, 2);