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_X86_FBSD_ENV)
55 #elif defined(AFS_DARWIN_ENV)
58 Need offset to SP in jmp_buf for this platform.
62 * On SGIs the type of the elements of the array passed to setjmp
63 * differs based on the ISA chosen. It is int for mips1 and mips2 and
64 * __uint64_t for mips3 and mips4
68 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4)
69 typedef __uint64_t jmp_buf_type;
72 #ifdef AFS_ALPHA_LINUX20_ENV
73 typedef long jmp_buf_type;
75 typedef int jmp_buf_type;
76 #endif /*AFS_ALPHA_LINUX20_ENV*/
79 static jmp_buf jmp_tmp;
82 static jmp_buf_type *jmpBuffer;
85 savecontext(ep, savearea, sp)
87 struct lwp_context *savearea;
95 code = setjmp(savearea->setjmp_buffer);
96 jmpBuffer = (jmp_buf_type *)savearea->setjmp_buffer;
97 savearea->topstack = (char*)jmpBuffer[LWP_SP];
101 int i, *ptr = (int*)savearea->setjmp_buffer;
102 printf("savecontext\n");
103 for ( i=0; i < 5; i++)
104 printf("(%d) 0x%x ",i, ptr[i]);
106 for ( i=5; i < 10; i++)
107 printf("(%d) 0x%x ",i, ptr[i]);
117 rc = setjmp(jmp_tmp);
120 case 0: jmpBuffer = (jmp_buf_type *)jmp_tmp;
121 jmpBuffer[LWP_SP] = (jmp_buf_type)sp;
122 #if defined(AFS_S390_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || (defined(AFS_SPARC64_LINUX20_ENV) && defined(AFS_32BIT_USR_ENV))
123 jmpBuffer[LWP_FP] = (jmp_buf_type)sp;
128 assert(0); /* never returns */
131 perror("Error in setjmp1\n");
136 case 2: /* restoring frame */
140 perror("Error in setjmp2 : restoring\n");
146 struct lwp_context *savearea;
149 int i, *ptr = savearea->setjmp_buffer;
151 printf("Returning to \n");
152 for ( i=0; i < 5; i++)
153 printf("(%d) 0x%x ",i, ptr[i]);
155 for ( i=5; i < 10; i++)
156 printf("(%d) 0x%x ",i, ptr[i]);
160 longjmp(savearea->setjmp_buffer, 2);