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
|