//++ // // 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: // // Tom Wood (twood) 1-Nov-1993 // Added __C_ExecuteExceptionFilter and __C_ExecuteTerminationHandler // previously deleted from the MIPS version. //-- //list(off) #include "ksppc.h" //list(on) .extern ..RtlUnwind // // Define the call frame for calling the exception filter and termination // handler. // .struct 0 CfBackChain: .space 4 // chain to previous call frame CfSavedR31: .space 4 // glue-saved register CfSavedRtoc: .space 4 // glue-saved register .space 3*4 // remaining part of the frame header //++ // // ULONG // __C_ExecuteExceptionFilter ( // PEXCEPTION_POINTERS ExceptionPointers, // EXCEPTION_FILTER ExceptionFilter, // ULONG EstablisherFrame // ) // // Routine Description: // // This function calls the specified exception filter routine with the // establisher environment passed in the TOC register. // // Arguments: // // ExceptionPointers (r.3) - Supplies a pointer to the exception pointers // structure. // // ExceptionFilter (r.4) - Supplies the address of the exception filter // routine. // // EstablisherFrame (r.5) - Supplies the establisher frame pointer. // // Return Value: // // The value returned by the exception filter routine. // //-- SPECIAL_ENTRY(__C_ExecuteExceptionFilter) stw r.31, CfSavedR31 (r.sp) // save r.31 before using it. mtctr r.4 // get ready to call the filter. mflr r.31 // save the link register in r.31. stw r.toc, CfSavedRtoc (r.sp) // save r.toc PROLOGUE_END(__C_ExecuteExceptionFilter) or r.toc,r.5,r.5 // pass the establisher environment in r.toc bctrl // branch and link to the filter. mtlr r.31 // get ready to return lwz r.31, CfSavedR31 (r.sp) // restore r.31 lwz r.toc, CfSavedRtoc (r.sp) // restore r.toc SPECIAL_EXIT(__C_ExecuteExceptionFilter) //++ // // VOID // __C_ExecuteTerminationHandler ( // BOOLEAN AbnormalTermination, // TERMINATION_HANDLER TerminationHandler, // ULONG EstablisherFrame // ) // // Routine Description: // // This function calls the specified termination handler routine with the // establisher environment passed in the TOC register. // // Arguments: // // AbnormalTermination (r.3) - Supplies a boolean value that determines // whether the termination is abnormal. // // TerminationHandler (r.4) - Supplies the address of the termination // handler routine. // // EstablisherFrame (r.5) - Supplies the establisher frame pointer. // // Return Value: // // None. // //-- SPECIAL_ENTRY(__C_ExecuteTerminationHandler) stw r.31, CfSavedR31 (r.sp) // save r.31 before using it. mtctr r.4 // get ready to call the filter. mflr r.31 // save the link register in r.31. stw r.toc, CfSavedRtoc (r.sp) // save r.toc PROLOGUE_END(__C_ExecuteTerminationHandler) or r.toc,r.5,r.5 // pass the establisher environment in r.toc bctrl // branch and link to the filter. mtlr r.31 // get ready to return lwz r.31, CfSavedR31 (r.sp) // restore r.31 lwz r.toc, CfSavedRtoc (r.sp) // restore r.toc SPECIAL_EXIT(__C_ExecuteTerminationHandler) //++ // // 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 (r.3) - Supplies the establisher frame pointer of the // target of the unwind. // // TargetPc (r.4) - Supplies the target instruction address where control // is to be transfered to after the unwind operation is complete. // // Return Value: // // None. // //-- NESTED_ENTRY (__jump_unwind, STK_MIN_FRAME+8, 0, 0) PROLOGUE_END(__jump_unwind) li r.5, 0 // set NULL exception record address li r.6, 0 // set destination return value bl ..RtlUnwind // unwind to specified target .znop ..RtlUnwind NESTED_EXIT (__jump_unwind, STK_MIN_FRAME+8, 0, 0)