NT4/private/crt32/misc/ppc/jmpuwind.s
2020-09-30 17:12:29 +02:00

163 lines
4.9 KiB
ArmAsm
Raw Permalink 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.

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