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.
53 #elif defined(AFS_DARWIN_ENV)
56 Need offset to SP in jmp_buf for this platform.
60 * On SGIs the type of the elements of the array passed to setjmp
61 * differs based on the ISA chosen. It is int for mips1 and mips2 and
62 * __uint64_t for mips3 and mips4
66 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4)
67 typedef __uint64_t jmp_buf_type;
70 #ifdef AFS_ALPHA_LINUX20_ENV
71 typedef long jmp_buf_type;
73 typedef int jmp_buf_type;
74 #endif /*AFS_ALPHA_LINUX20_ENV*/
77 static jmp_buf jmp_tmp;
80 static jmp_buf_type *jmpBuffer;
83 savecontext(ep, savearea, sp)
85 struct lwp_context *savearea;
93 code = setjmp(savearea->setjmp_buffer);
94 jmpBuffer = (jmp_buf_type *)savearea->setjmp_buffer;
95 savearea->topstack = (char*)jmpBuffer[LWP_SP];
99 int i, *ptr = (int*)savearea->setjmp_buffer;
100 printf("savecontext\n");
101 for ( i=0; i < 5; i++)
102 printf("(%d) 0x%x ",i, ptr[i]);
104 for ( i=5; i < 10; i++)
105 printf("(%d) 0x%x ",i, ptr[i]);
115 rc = setjmp(jmp_tmp);
118 case 0: jmpBuffer = (jmp_buf_type *)jmp_tmp;
119 jmpBuffer[LWP_SP] = (jmp_buf_type)sp;
120 #if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV))
121 jmpBuffer[LWP_FP] = (jmp_buf_type)sp;
126 assert(0); /* never returns */
129 perror("Error in setjmp1\n");
134 case 2: /* restoring frame */
138 perror("Error in setjmp2 : restoring\n");
144 struct lwp_context *savearea;
147 int i, *ptr = savearea->setjmp_buffer;
149 printf("Returning to \n");
150 for ( i=0; i < 5; i++)
151 printf("(%d) 0x%x ",i, ptr[i]);
153 for ( i=5; i < 10; i++)
154 printf("(%d) 0x%x ",i, ptr[i]);
158 longjmp(savearea->setjmp_buffer, 2);