2020-09-30 17:12:29 +02:00

102 lines
2.6 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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