150 lines
4.2 KiB
ArmAsm
150 lines
4.2 KiB
ArmAsm
|
// TITLE("POSIX Thunks")
|
|||
|
//++
|
|||
|
//
|
|||
|
// Copyright (c) 1991 Microsoft Corporation
|
|||
|
// Copyright (c) 1993 Digital Equipment Corporation
|
|||
|
//
|
|||
|
// Module Name:
|
|||
|
//
|
|||
|
// psxthunk.s
|
|||
|
//
|
|||
|
// Abstract:
|
|||
|
//
|
|||
|
// Author:
|
|||
|
//
|
|||
|
// Ellena Aycock-Wright (ellena) 11-Jan-1991
|
|||
|
//
|
|||
|
// Revision History:
|
|||
|
//
|
|||
|
// Thomas Van Baak (tvb) 11-Dec-1992
|
|||
|
//
|
|||
|
// Adapted for Alpha AXP.
|
|||
|
//
|
|||
|
//--
|
|||
|
|
|||
|
#include "ksalpha.h"
|
|||
|
|
|||
|
SBTTL("Call Null Api")
|
|||
|
//++
|
|||
|
//
|
|||
|
// The following code is never executed. Its purpose is to support unwinding
|
|||
|
// through the call to the null API function. The instructions below are read
|
|||
|
// by virtual unwind to restore the context of the calling function.
|
|||
|
//
|
|||
|
//--
|
|||
|
|
|||
|
NESTED_ENTRY(PdxNullApiCall, ContextFrameLength, zero)
|
|||
|
|
|||
|
.set noreorder
|
|||
|
.set noat
|
|||
|
stq sp, CxIntSp(sp) // stack pointer
|
|||
|
stq ra, CxIntRa(sp) // return address
|
|||
|
stq ra, CxFir(sp) // continuation address
|
|||
|
stq gp, CxIntGp(sp) // integer register gp
|
|||
|
|
|||
|
stq s0, CxIntS0(sp) // integer registers s0 - s5
|
|||
|
stq s1, CxIntS1(sp) //
|
|||
|
stq s2, CxIntS2(sp) //
|
|||
|
stq s3, CxIntS3(sp) //
|
|||
|
stq s4, CxIntS4(sp) //
|
|||
|
stq s5, CxIntS5(sp) //
|
|||
|
stq fp, CxIntFp(sp) // integer register fp
|
|||
|
|
|||
|
stt f2, CxFltF2(sp) // floating registers f2 - f9
|
|||
|
stt f3, CxFltF3(sp) //
|
|||
|
stt f4, CxFltF4(sp) //
|
|||
|
stt f5, CxFltF5(sp) //
|
|||
|
stt f6, CxFltF6(sp) //
|
|||
|
stt f7, CxFltF7(sp) //
|
|||
|
stt f8, CxFltF8(sp) //
|
|||
|
stt f9, CxFltF9(sp) //
|
|||
|
.set at
|
|||
|
.set reorder
|
|||
|
|
|||
|
PROLOGUE_END
|
|||
|
|
|||
|
ALTERNATE_ENTRY(_PdxNullApiCaller)
|
|||
|
|
|||
|
|
|||
|
mov sp, a0 // set address of context record
|
|||
|
bsr ra, PdxNullApiCaller // call null api caller
|
|||
|
|
|||
|
.end PdxNullApiCaller
|
|||
|
|
|||
|
SBTTL("Call Signal Deliverer")
|
|||
|
//++
|
|||
|
//
|
|||
|
// The following code is never executed. Its purpose is to support unwinding
|
|||
|
// through the call to the signal deliverer. The instructions below are read
|
|||
|
// by virtual unwind to restore the context of the calling function.
|
|||
|
//
|
|||
|
//--
|
|||
|
|
|||
|
NESTED_ENTRY(PdxSignalDeliver, ContextFrameLength, zero)
|
|||
|
|
|||
|
.set noreorder
|
|||
|
.set noat
|
|||
|
stq sp, CxIntSp(sp) // stack pointer
|
|||
|
stq ra, CxIntRa(sp) // return address
|
|||
|
stq ra, CxFir(sp) // continuation address
|
|||
|
stq gp, CxIntGp(sp) // integer register gp
|
|||
|
|
|||
|
stq s0, CxIntS0(sp) // integer registers s0 - s5
|
|||
|
stq s1, CxIntS1(sp) //
|
|||
|
stq s2, CxIntS2(sp) //
|
|||
|
stq s3, CxIntS3(sp) //
|
|||
|
stq s4, CxIntS4(sp) //
|
|||
|
stq s5, CxIntS5(sp) //
|
|||
|
stq fp, CxIntFp(sp) // integer register fp
|
|||
|
|
|||
|
stt f2, CxFltF2(sp) // floating registers f2 - f9
|
|||
|
stt f3, CxFltF3(sp) //
|
|||
|
stt f4, CxFltF4(sp) //
|
|||
|
stt f5, CxFltF5(sp) //
|
|||
|
stt f6, CxFltF6(sp) //
|
|||
|
stt f7, CxFltF7(sp) //
|
|||
|
stt f8, CxFltF8(sp) //
|
|||
|
stt f9, CxFltF9(sp) //
|
|||
|
.set at
|
|||
|
.set reorder
|
|||
|
|
|||
|
PROLOGUE_END
|
|||
|
|
|||
|
//++
|
|||
|
//
|
|||
|
// VOID
|
|||
|
// _PdxSignalDeliverer (
|
|||
|
// IN PCONTEXT Context,
|
|||
|
// IN sigset_t Mask,
|
|||
|
// IN int Signal,
|
|||
|
// IN _handler Handler
|
|||
|
// )
|
|||
|
//
|
|||
|
// Routine Description:
|
|||
|
//
|
|||
|
// The following routine provides linkage to POSIX client routines to
|
|||
|
// perform signal delivery.
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
//
|
|||
|
// s0 - s5 - Supply parameter values.
|
|||
|
//
|
|||
|
// sp - Supplies the address of a context record.
|
|||
|
//
|
|||
|
// Return Value:
|
|||
|
//
|
|||
|
// There is no return from these routines.
|
|||
|
//
|
|||
|
//--
|
|||
|
|
|||
|
ALTERNATE_ENTRY(_PdxSignalDeliverer)
|
|||
|
|
|||
|
mov sp, a0 // set address of context record
|
|||
|
mov s1, a1 // set previous block mask
|
|||
|
mov s2, a2 // set signal number
|
|||
|
mov s3, a3 // set signal handler
|
|||
|
|
|||
|
bsr ra, PdxSignalDeliverer // deliver signal to POSIX client
|
|||
|
|
|||
|
.end _PsxSignalDeliverer
|