Windows2000/private/ntos/dll/ppc/ldrthunk.s
2020-09-30 17:12:32 +02:00

109 lines
3.0 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.

// TITLE("LdrInitializeThunk")
//++
//
// Copyright (c) 1989 Microsoft Corporation
//
// Module Name:
//
// ldrthunk.s
//
// Abstract:
//
// This module implements the thunk for the LdrpInitialize APC routine.
//
// Author:
//
// Chuck Bauman 20-Mar-1993
//
// Environment:
//
// Any mode.
//
// Revision History:
//
// Port NT product1 source to PowerPC 12-Aug-1993
// Changed to nested function and added conversion of function
// descriptor. Peter Johnston (plj@vnet.ibm.com) 18-Aug-1994
//
//--
#include "ksppc.h"
//++
//
// VOID
// LdrInitializeThunk(
// IN PVOID NormalContext,
// IN PVOID SystemArgument1,
// IN PVOID SystemArgument2
// )
//
// Routine Description:
//
// This routine is called via APC and is the first code executed in
// user mode for every user mode thread.
//
// On entry to this routine, the current stack frame is immediately
// preceeded by a context record containing the initial state of the
// new thread.
//
// This function computes a pointer to the context record on the stack
// and calls LdrpInitialize with that pointer as its parameter.
//
// On return from LdrpInitialize, we convert the function descriptor
// whose address is in the Context record Iar field from a pointer to
// a function descriptor to the actual TOC and entry point values for
// the thread.
//
// Arguments:
//
// NormalContext (r.3) - User Mode APC context parameter (ignored).
//
// SystemArgument1 (r.4) - User Mode APC system argument 1 (ignored).
//
// SystemArgument2 (r.5) - User Mode APC system argument 2 (ignored).
//
// Return Value:
//
// None.
//
//--
.extern ..LdrpInitialize
.struct 0
.space STK_MIN_FRAME
LitLr: .space 4
.align 3
LitFr1: .space STK_MIN_FRAME
LitCx: .space ContextFrameLength
.align 3
LitFrameLen:
SPECIAL_ENTRY(LdrInitializeThunk)
mflr r.0
stwu r.sp, -LitFr1(r.sp) // buy stack frame
addi r.3, r.sp, LitCx // compute context record addr
stw r.0, LitLr(r.sp) // save return address
PROLOGUE_END(LdrInitializeThunk)
bl ..LdrpInitialize // Jump to LdrpInitialize
lwz r.11, LitCx + CxGpr2(r.sp) // TOC set
cmpwi r.11, 0 // jif true context passed
// (e.g: fork)
lwz r.11, LitCx + CxIar(r.sp) // read fn descr from Cr Iar
lwz r.0, LitLr(r.sp) // get return address
bne truectx
lwz r.12, 4(r.11) // get toc
lwz r.11, 0(r.11) // get fn entry
stw r.12, LitCx + CxGpr2(r.sp) // set initial toc
stw r.11, LitCx + CxIar(r.sp) // set entry point
truectx:
mtlr r.0 // restore return address
addi r.sp, r.sp, LitFr1 // free out stack frame
SPECIAL_EXIT(LdrInitializeThunk)