102 lines
2.6 KiB
ArmAsm
102 lines
2.6 KiB
ArmAsm
// 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
|