diff options
Diffstat (limited to 'private/crt32/misc/mips/setjmp.s')
-rw-r--r-- | private/crt32/misc/mips/setjmp.s | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/private/crt32/misc/mips/setjmp.s b/private/crt32/misc/mips/setjmp.s new file mode 100644 index 000000000..245cd4b37 --- /dev/null +++ b/private/crt32/misc/mips/setjmp.s @@ -0,0 +1,101 @@ +// TITLE("Set Jump") +//++ +// +// Copyright (c) 1993 Microsoft Corporation +// +// Module Name: +// +// setjmp.s +// +// Abstract: +// +// This module implements the MIPS 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: +// +// David N. Cutler (davec) 7-Apr-1993 +// +// Environment: +// +// Any mode. +// +// Revision History: +// +//-- + +#include "ksmips.h" + +// +// Define variable that will cause setjmp/longjmp to be safe or unsafe with +// respect to structured exception handling. +// + + .globl _setjmpexused + .comm _setjmpexused , 4 + + SBTTL("Set Jump") +//++ +// +// int +// setjmp ( +// IN jmp_buf JumpBuffer +// ) +// +// Routine Description: +// +// This function saved the current nonvolatile register state in the +// specified jump buffer and returns a function vlaue of zero. +// +// Arguments: +// +// JumpBuffer (a0) - Supplies the address of a jump buffer to store the +// jump information. +// +// Return Value: +// +// A value of zero is returned. +// +//-- + + LEAF_ENTRY(setjmp) + + lw v0,_setjmpexused // get value of switch variable + bne zero,v0,10f // if ne, provide safe setjmp + +// +// Provide unsafe handling of setjmp. +// + + sdc1 f20,JbFltF20(a0) // save floating registers f20 - f31 + sdc1 f22,JbFltF22(a0) // + sdc1 f24,JbFltF24(a0) // + sdc1 f26,JbFltF26(a0) // + sdc1 f28,JbFltF28(a0) // + sdc1 f30,JbFltF30(a0) // + sw s0,JbIntS0(a0) // save integer registers s0 - s8 + sw s1,JbIntS1(a0) // + sw s2,JbIntS2(a0) // + sw s3,JbIntS3(a0) // + sw s4,JbIntS4(a0) // + sw s5,JbIntS5(a0) // + sw s6,JbIntS6(a0) // + sw s7,JbIntS7(a0) // + sw s8,JbIntS8(a0) // + sw ra,JbFir(a0) // get setjmp return address + sw sp,JbIntSp(a0) // save stack pointer + sw zero,JbType(a0) // clean safe setjmp flag + move v0,zero // set return value + j ra // return + +// +// Provide safe handling of setjmp. +// + +10: j v0 // finish in common code + + .end setjmp |