summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/mips/setjmp.s
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/misc/mips/setjmp.s')
-rw-r--r--private/crt32/misc/mips/setjmp.s101
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