Windows2000/private/ntos/w32/ntuser/server/ia64/thunk.s
2020-09-30 17:12:32 +02:00

105 lines
2.4 KiB
ArmAsm

// Module Name:
// thunk.s
// Abstract:
// This module implements all Win32 thunks. This includes the
/// first level thread starter...
// Author:
// 12-Oct-1995
// Revision History:
#include "ksia64.h"
.file "thunk.s"
// VOID
// SwitchStackThenTerminate(
// IN PVOID StackLimit,
// IN PVOID NewStack,
// IN DWORD ExitCode
// )
// Routine Description:
// This API is called during thread termination to delete a thread's
// stack, switch to a stack in the thread's TEB, and then terminate.
// Arguments:
// StackLimit (a0) - Supplies the address of the stack to be freed.
// NewStack (a1) - Supplies an address within the terminating threads TEB
// that is to be used as its temporary stack while exiting.
// This is also used as the new RseStackBase
// ExitCode (a2) - Supplies the termination status that the thread
// is to exit with.
// Return Value:
// None.
.global FreeStackAndTerminate
.type FreeStackAndTerminate, @function
RseSIZE = 320 // reserve 320 bytes RseStack, RseStack should
// be larger than memory stack
// Input arguments
StackBase = a0
NewStack = a1
ExitCode = a2
NewStackBase = t1
OldStackBase = t2
OldExitCode = t0
SavedRSC = t3
temp = t4
LEAF_ENTRY(SwitchStackThenTerminate)
mov SavedRSC = ar.rsc
mov OldStackBase = StackBase // save the arguments to pass down
mov t0 = 15 // align base to 16 byte boundry
;;
alloc t22 = ar.pfs, 0, 0, 0, 0 // throw Stacked registers away
add NewStackBase = RseSIZE, NewStack
mov OldExitCode = ExitCode
;;
andcm NewStackBase = NewStackBase, t0
;;
dep temp = 0, SavedRSC, RSC_MODE, 2
;;
mov ar.rsc = temp
mov brp = zero // set brp to zero to indicate
mov ar.pfs = zero
;;
loadrs
;;
mov ar.bspstore = NewStackBase
mov sp = NewStackBase // setup new stack
;;
alloc t22 = ar.pfs, 0, 0, 2, 0 // allocate 2 output registers
mov ar.rsc = SavedRSC
mov out0 = OldStackBase // re arrange args
mov out1 = OldExitCode
br FreeStackAndTerminate // end of call chain.
LEAF_EXIT(SwitchStackThenTerminate)