mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
5.4 KiB
220 lines
5.4 KiB
// TITLE("Jump to Unwind")
|
|
//++
|
|
//
|
|
// Copyright (c) 1992 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// jmpuwind.s
|
|
//
|
|
// Abstract:
|
|
//
|
|
// This module implements the MIPS specific routine to jump to the runtime
|
|
// time library unwind routine.
|
|
//
|
|
// Author:
|
|
//
|
|
// David N. Cutler (davec) 12-Sep-1990
|
|
//
|
|
// Environment:
|
|
//
|
|
// Any mode.
|
|
//
|
|
// Revision History:
|
|
//
|
|
// TGL - 4/24/95 Added NLG_Notify()
|
|
//--
|
|
|
|
#include "ksmips.h"
|
|
#ifdef _MT
|
|
#include "mtdll.h"
|
|
#endif
|
|
SBTTL("Execute Exception Filter")
|
|
//++
|
|
//
|
|
// ULONG
|
|
// __C_ExecuteExceptionFilter (
|
|
// PEXCEPTION_POINTERS ExceptionPointers,
|
|
// EXCEPTION_FILTER ExceptionFilter,
|
|
// ULONG EstablisherFrame
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function sets the static link and transfers control to the specified
|
|
// exception filter routine.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// ExceptionPointers (a0) - Supplies a pointer to the exception pointers
|
|
// structure.
|
|
//
|
|
// ExceptionFilter (a1) - Supplies the address of the exception filter
|
|
// routine.
|
|
//
|
|
// EstablisherFrame (a2) - Supplies the establisher frame pointer.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// The value returned by the exception filter routine.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(__C_ExecuteExceptionFilter)
|
|
|
|
move v0,a2 // set static link
|
|
j a1 // transfer control to exception filter
|
|
|
|
.end __C_ExecuteExceptionFilter
|
|
|
|
SBTTL("Execute Termination Handler")
|
|
//++
|
|
//
|
|
// VOID
|
|
// __C_ExecuteTerminationHandler (
|
|
// BOOLEAN AbnormalTermination,
|
|
// TERMINATION_HANDLER TerminationHandler,
|
|
// ULONG EstablisherFrame
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function sets the static link and transfers control to the specified
|
|
// termination handler routine.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// AbnormalTermination (a0) - Supplies a boolean value that determines
|
|
// whether the termination is abnormal.
|
|
//
|
|
// TerminationHandler (a1) - Supplies the address of the termination handler
|
|
// routine.
|
|
//
|
|
// EstablisherFrame (a2) - Supplies the establisher frame pointer.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(__C_ExecuteTerminationHandler)
|
|
|
|
move v0,a2 // set static link
|
|
j a1 // transfer control to termination handler
|
|
|
|
.end __C_ExecuteTerminationHandler
|
|
|
|
SBTTL("Jump to Unwind")
|
|
//++
|
|
//
|
|
// VOID
|
|
// __jump_unwind (
|
|
// IN PVOID EstablishFrame,
|
|
// IN PVOID TargetPc
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function transfer control to unwind. It is used by the MIPS
|
|
// compiler when a goto out of the body or a try statement occurs.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// EstablishFrame (a0) - Supplies the establisher frame point of the
|
|
// target of the unwind.
|
|
//
|
|
// TargetPc (a1) - Supplies the target instruction address where control
|
|
// is to be transfered to after the unwind operation is complete.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(__jump_unwind)
|
|
|
|
move a2,zero // set NULL exception record address
|
|
move a3,zero // set destination return value
|
|
j RtlUnwind // unwind to specified target
|
|
|
|
.end __jump_unwind
|
|
|
|
//++
|
|
// VOID _NLG_Notify(void* pFunclet, void* EstablisherFrame, int flag)
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// Provides the handler/longjmp addresses to the debugger
|
|
//
|
|
// IMPORTANT!!! This routine must preserve ALL registers except v0
|
|
//
|
|
// Arguments:
|
|
//
|
|
// pFunclet (a0) - Supplies the target address of non-local goto
|
|
// EstablisherFrame (a1) - Supplies a pointer to frame of the establisher function
|
|
// flag (a2) - Supplies a integer value to be stored in the 'code' field
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
.globl _NLG_Dispatch
|
|
.globl _NLG_Destination
|
|
.data
|
|
_NLG_Destination:
|
|
.word 0x19930520 // signature
|
|
.word 0 // handler address
|
|
.word 0 // code
|
|
.word 0 // frame pointer
|
|
|
|
.globl _NLG_Notify
|
|
LEAF_ENTRY(_NLG_Notify)
|
|
.prologue 0;
|
|
|
|
sw a0,_NLG_Destination + 4 // save target address for the debugger
|
|
sw a1,_NLG_Destination + 12
|
|
sw a2,_NLG_Destination + 8
|
|
_NLG_Dispatch:
|
|
move v0, a0
|
|
j ra // jump to return address
|
|
|
|
.end _NLG_Notify
|
|
|
|
//++
|
|
// VOID _NLG_ExecuteTerminationHandler(ULONG Flag, PVOID pFunclet, PVOID EstablisherFrame)
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// NLG_Return2 for the debugger
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Flag (a0) - boolean value passed to the termination handler
|
|
// pFunclet (a1) - Supplies the target address of non-local goto
|
|
// EstablisherFrame (a2) - Supplies a pointer to frame of the establisher function
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Whatever the handler returns.
|
|
//
|
|
//--
|
|
|
|
.globl _NLG_Return2
|
|
|
|
NESTED_ENTRY(_NLG_ExecuteTerminationHandler, 24, ra)
|
|
|
|
subu sp,24 // bump stack pointer
|
|
sw ra,20(sp) // save return address
|
|
.prologue 0;
|
|
|
|
move v0,a2 // pass EstablisherFrame in v0
|
|
jal a1 // call the handler
|
|
_NLG_Return2:
|
|
lw ra,20(sp) // load return address
|
|
addu sp,24 // restore stack pointer
|
|
j ra // jump to return address
|
|
|
|
.end _NLG_ExecuteTerminationHandler
|