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 <afs/param.h>
13 #include <afsconfig.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 */
33 #if defined(AFS_SGI64_ENV)
39 #elif defined(AFS_HPUX_ENV)
41 #elif defined(AFS_LINUX20_ENV)
42 #if defined(AFS_PPC_LINUX20_ENV)
44 #elif defined(AFS_I386_LINUX20_ENV)
46 #elif defined(AFS_S390_LINUX20_ENV)
49 #elif defined(AFS_SPARC_LINUX20_ENV)
52 #elif defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV)
55 #elif defined(AFS_ALPHA_LINUX20_ENV)
59 #error Unsupported linux LWP system type.
61 #elif defined(AFS_X86_FBSD_ENV)
63 #elif defined(AFS_DARWIN_ENV)
66 Need offset to SP in jmp_buf for this platform.
70 * On SGIs the type of the elements of the array passed to setjmp
71 * differs based on the ISA chosen. It is int for mips1 and mips2 and
72 * __uint64_t for mips3 and mips4
76 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4)
77 typedef __uint64_t jmp_buf_type;
80 #ifdef AFS_ALPHA_LINUX20_ENV
81 typedef long jmp_buf_type;
83 typedef int jmp_buf_type;
84 #endif /*AFS_ALPHA_LINUX20_ENV*/
87 static jmp_buf jmp_tmp;
90 static jmp_buf_type *jmpBuffer;
92 afs_int32 savecontext(ep, savearea, sp)
94 struct lwp_context *savearea;
102 code = setjmp(savearea->setjmp_buffer);
103 jmpBuffer = (jmp_buf_type *)savearea->setjmp_buffer;
104 savearea->topstack = (char*)jmpBuffer[LWP_SP];
108 int i, *ptr = (int*)savearea->setjmp_buffer;
109 printf("savecontext\n");
110 for ( i=0; i < 5; i++)
111 printf("(%d) 0x%x ",i, ptr[i]);
113 for ( i=5; i < 10; i++)
114 printf("(%d) 0x%x ",i, ptr[i]);
124 rc = setjmp(jmp_tmp);
127 case 0: jmpBuffer = (jmp_buf_type *)jmp_tmp;
128 jmpBuffer[LWP_SP] = (jmp_buf_type)sp;
129 #if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV))
130 jmpBuffer[LWP_FP] = (jmp_buf_type)sp;
135 assert(0); /* never returns */
138 perror("Error in setjmp1\n");
143 case 2: /* restoring frame */
147 perror("Error in setjmp2 : restoring\n");
153 afs_int32 returnto(savearea)
154 struct lwp_context *savearea;
157 int i, *ptr = savearea->setjmp_buffer;
159 printf("Returning to \n");
160 for ( i=0; i < 5; i++)
161 printf("(%d) 0x%x ",i, ptr[i]);
163 for ( i=5; i < 10; i++)
164 printf("(%d) 0x%x ",i, ptr[i]);
168 longjmp(savearea->setjmp_buffer, 2);