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.
147 lines
3.1 KiB
147 lines
3.1 KiB
// TITLE("POSIX Thunks)
|
|
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
psxthunk.s
|
|
|
|
Abstract:
|
|
|
|
|
|
Author:
|
|
|
|
Ellena Aycock-Wright (ellena) 11-Jan-1991
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "ksmips.h"
|
|
|
|
|
|
//++
|
|
//
|
|
// The following code is never executed. Its purpose is to support
|
|
// unwinding through the call to the signal deliverer. (Copied from
|
|
// ntos/rtl/mips/trampoln.s)
|
|
//
|
|
//--
|
|
|
|
#define FrameSize (ContextFrameLength)
|
|
|
|
NESTED_ENTRY(PdxNullApiCall, FrameSize, zero);
|
|
|
|
.set noreorder
|
|
.set noat
|
|
sd sp,CxXIntSp(sp) // save stack pointer
|
|
sd ra,CxXIntRa(sp) // save return address
|
|
sw ra,CxFir(sp) // save return address
|
|
sd s8,CxXIntS8(sp) // save integer register s8
|
|
sd gp,CxXIntGp(sp) // save integer register gp
|
|
sd s0,CxXIntS0(sp) // save integer register s0-s7
|
|
sd s1,CxXIntS1(sp) //
|
|
sd s2,CxXIntS2(sp) //
|
|
sd s3,CxXIntS3(sp) //
|
|
sd s4,CxXIntS4(sp) //
|
|
sd s5,CxXIntS5(sp) //
|
|
sd s6,CxXIntS6(sp) //
|
|
sd s7,CxXIntS7(sp) //
|
|
sdc1 f20,CxFltF20(sp) // store floating registers f20 - f31
|
|
sdc1 f22,CxFltF22(sp) //
|
|
sdc1 f24,CxFltF24(sp) //
|
|
sdc1 f26,CxFltF26(sp) //
|
|
sdc1 f28,CxFltF28(sp) //
|
|
sdc1 f30,CxFltF30(sp) //
|
|
// move s8,sp // set frame pointer
|
|
.set at
|
|
.set reorder
|
|
|
|
PROLOGUE_END
|
|
|
|
ALTERNATE_ENTRY(_PdxNullApiCaller)
|
|
|
|
move a0,sp // set address of context record
|
|
jal PdxNullApiCaller // call null api caller
|
|
|
|
.end PdxNullApiCaller
|
|
|
|
|
|
//++
|
|
//
|
|
// The following code is never executed. Its purpose is to support
|
|
// unwinding through the call to the signal deliverer. (Copied from
|
|
// ntos/rtl/mips/trampoln.s)
|
|
//
|
|
//--
|
|
|
|
NESTED_ENTRY(PdxSignalDeliver, FrameSize, zero);
|
|
|
|
.set noreorder
|
|
.set noat
|
|
sd sp,CxXIntSp(sp) // save stack pointer
|
|
sd ra,CxXIntRa(sp) // save return address
|
|
sw ra,CxFir(sp) // save return address
|
|
sd s8,CxXIntS8(sp) // save integer register s8
|
|
sd gp,CxXIntGp(sp) // save integer register gp
|
|
sd s0,CxXIntS0(sp) // save integer register s0-s7
|
|
sd s1,CxXIntS1(sp) //
|
|
sd s2,CxXIntS2(sp) //
|
|
sd s3,CxXIntS3(sp) //
|
|
sd s4,CxXIntS4(sp) //
|
|
sd s5,CxXIntS5(sp) //
|
|
sd s6,CxXIntS6(sp) //
|
|
sd s7,CxXIntS7(sp) //
|
|
sdc1 f20,CxFltF20(sp) // store floating registers f20 - f31
|
|
sdc1 f22,CxFltF22(sp) //
|
|
sdc1 f24,CxFltF24(sp) //
|
|
sdc1 f26,CxFltF26(sp) //
|
|
sdc1 f28,CxFltF28(sp) //
|
|
sdc1 f30,CxFltF30(sp) //
|
|
// move s8,sp // set frame pointer
|
|
.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 - s7 - Supply parameter values.
|
|
//
|
|
// sp - Supplies the address of a context record.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// There is no return from these routines.
|
|
//
|
|
//--
|
|
|
|
ALTERNATE_ENTRY(_PdxSignalDeliverer)
|
|
|
|
move a0,sp // set address of context record
|
|
|
|
move a1,s1 // set previous block mask
|
|
move a2,s2 // set signal number
|
|
move a3,s3 // set signal handler
|
|
|
|
jal PdxSignalDeliverer // deliver signal to POSIX client
|
|
|
|
//NOTREACHED
|
|
|
|
.end _PdxSignalDeliverer
|