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. */
12 #include <afsconfig.h>
13 #include <afs/param.h>
24 #if defined(AFS_OSF_ENV) || defined(AFS_S390_LINUX20_ENV)
25 extern int PRE_Block; /* used in lwp.c and process.s */
27 extern char PRE_Block; /* used in lwp.c and process.s */
30 #if defined(USE_UCONTEXT) && defined(HAVE_UCONTEXT_H)
33 savecontext(ep, savearea, newsp)
35 struct lwp_context *savearea;
38 #if defined(AFS_IA64_LINUX20_ENV)
39 register unsigned long sp __asm__("r12");
41 #error "You need to update stack pointer register for this platform"
47 getcontext(&savearea->ucontext);
48 savearea->topstack = sp;
49 switch (savearea->state)
57 thread.uc_stack.ss_sp = newsp - AFS_LWP_MINSTACKSIZE + sizeof(void *) + sizeof(void *);
58 thread.uc_stack.ss_size = AFS_LWP_MINSTACKSIZE - sizeof(void *);
59 makecontext(&thread, ep, 0);
73 struct lwp_context *savearea;
78 setcontext(&savearea->ucontext);
86 #if defined(AFS_SGI64_ENV)
92 #elif defined(AFS_HPUX_ENV)
94 #elif defined(AFS_LINUX20_ENV)
95 #if defined(AFS_PPC_LINUX20_ENV)
97 #elif defined(AFS_I386_LINUX20_ENV)
99 #elif defined(AFS_S390_LINUX20_ENV)
102 #elif defined(AFS_SPARC_LINUX20_ENV)
105 #elif defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV)
108 #elif defined(AFS_ALPHA_LINUX20_ENV)
111 #elif defined(AFS_PARISC_LINUX24_ENV)
113 /* really 19 when structure is double, but requires too many changes
114 below to make a double work */
116 #error Unsupported linux LWP system type.
118 #elif defined(AFS_X86_FBSD_ENV)
120 #elif defined(AFS_DARWIN_ENV)
123 Need offset to SP in jmp_buf for this platform.
127 * On SGIs the type of the elements of the array passed to setjmp
128 * differs based on the ISA chosen. It is int for mips1 and mips2 and
129 * __uint64_t for mips3 and mips4
133 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4)
134 typedef __uint64_t jmp_buf_type;
137 #ifdef AFS_ALPHA_LINUX20_ENV
138 typedef long jmp_buf_type;
140 typedef int jmp_buf_type;
141 #endif /*AFS_ALPHA_LINUX20_ENV*/
144 static jmp_buf jmp_tmp;
147 static jmp_buf_type *jmpBuffer;
149 afs_int32 savecontext(ep, savearea, sp)
151 struct lwp_context *savearea;
159 code = setjmp(savearea->setjmp_buffer);
160 jmpBuffer = (jmp_buf_type *)savearea->setjmp_buffer;
161 savearea->topstack = (char*)jmpBuffer[LWP_SP];
165 int i, *ptr = (int*)savearea->setjmp_buffer;
166 printf("savecontext\n");
167 for ( i=0; i < 5; i++)
168 printf("(%d) 0x%x ",i, ptr[i]);
170 for ( i=5; i < 10; i++)
171 printf("(%d) 0x%x ",i, ptr[i]);
181 rc = setjmp(jmp_tmp);
184 case 0: jmpBuffer = (jmp_buf_type *)jmp_tmp;
185 jmpBuffer[LWP_SP] = (jmp_buf_type)sp;
186 #if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV))
187 jmpBuffer[LWP_FP] = (jmp_buf_type)sp;
192 assert(0); /* never returns */
195 perror("Error in setjmp1\n");
200 case 2: /* restoring frame */
204 perror("Error in setjmp2 : restoring\n");
210 afs_int32 returnto(savearea)
211 struct lwp_context *savearea;
214 int i, *ptr = savearea->setjmp_buffer;
216 printf("Returning to \n");
217 for ( i=0; i < 5; i++)
218 printf("(%d) 0x%x ",i, ptr[i]);
220 for ( i=5; i < 10; i++)
221 printf("(%d) 0x%x ",i, ptr[i]);
225 longjmp(savearea->setjmp_buffer, 2);