|
|
// TITLE("Set Jump") //++ // // Copyright (c) 1993 Digital Equipment Corporation // // Module Name: // // otsjmp.s // // Abstract: // // This module implements the Alpha C8/GEM C compiler specific routine to // perform a setjmp. // // N.B. This module conditionally provides UNSAFE handling of setjmp and // which is NOT integrated with structured exception handling. The // determination is made based on whether an uninitialized variable // has been set to a nonzero value. // // Author: // // Thomas Van Baak (tvb) 22-Apr-1993 // // Environment: // // Any mode. // // Revision History: // //--
#include "ksalpha.h"
// // Define variable that will cause setjmp/longjmp to be safe or unsafe with // respect to structured exception handling. //
.globl _Otssetjmpexused .comm _Otssetjmpexused, 4
SBTTL("Set Jump - GEM version") //++ // // int // _Otssetjmp3 ( // IN OUT jmp_buf JumpBuffer, // IN PVOID RealFramePointer, // IN PVOID SebPointer // ) // // Routine Description: // // This function saves the current nonvolatile register state in the // specified jump buffer and returns a function value of zero. // // N.B. The name `_Otssetjmp3' was chosen to avoid collision with an // earlier implementation named _Otssetjmp. This version has three // arguments. // // Arguments: // // JumpBuffer (a0) - Supplies the address of a jump buffer to store the // jump information. // // RealFramePointer (a1) - Supplies the real frame pointer value. // // SebPointer (a2) - Supplies the pointer to the current SEB or NULL // if the call was made outside of any SEH scope. // // Return Value: // // A value of zero is returned. // //--
LEAF_ENTRY(_Otssetjmp3)
ldl v0, _Otssetjmpexused // get value of switch variable bne v0, 10f // if ne, provide safe setjmp
// // Provide unsafe handling of setjmp. //
stt f2, JbFltF2(a0) // save floating registers f2 - f9 stt f3, JbFltF3(a0) // stt f4, JbFltF4(a0) // stt f5, JbFltF5(a0) // stt f6, JbFltF6(a0) // stt f7, JbFltF7(a0) // stt f8, JbFltF8(a0) // stt f9, JbFltF9(a0) //
stq s0, JbIntS0(a0) // save integer registers s0 - s6/fp stq s1, JbIntS1(a0) // stq s2, JbIntS2(a0) // stq s3, JbIntS3(a0) // stq s4, JbIntS4(a0) // stq s5, JbIntS5(a0) // stq fp, JbIntS6(a0) //
ldil t0, 1 // get unsafe setjmp flag stl t0, JbType(a0) // set jump buffer context type stq sp, JbIntSp(a0) // save stack pointer stq ra, JbFir(a0) // get setjmp return address
mov zero, v0 // set zero return value ret zero, (ra) // return
// // Provide safe handling of setjmp. //
10: jmp zero, (v0) // finish in _setjmpex code
.end _Otssetjmp3
|