377 lines
6.5 KiB
C
377 lines
6.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1990 Microsoft Corporation
|
||
Copyright (c) 1993 Digital Equipment Corporation
|
||
|
||
Module Name:
|
||
|
||
stubs.c
|
||
|
||
Abstract:
|
||
|
||
This module implements stub routines for the firmware, FailSafe
|
||
Booter, and the Alpha AXP/Jensen ROM update tool (JNUPDATE.EXE).
|
||
|
||
Author:
|
||
|
||
Lluia Abello (lluis) 3-Oct-1991
|
||
|
||
Environment:
|
||
|
||
Kernel mode only.
|
||
|
||
Revision History:
|
||
|
||
John DeRosa [DEC] 11-May-1993
|
||
|
||
Made Alpha AXP modification.
|
||
|
||
--*/
|
||
|
||
#include "ntos.h"
|
||
#include "fwp.h"
|
||
#include "fwstring.h"
|
||
|
||
LONG
|
||
DebugPrint(
|
||
IN PSTRING Output
|
||
);
|
||
|
||
|
||
#if defined(MORGAN)
|
||
#include "ex.h"
|
||
|
||
PVOID
|
||
ExAllocatePool(
|
||
IN POOL_TYPE PoolType,
|
||
IN ULONG NumberOfBytes
|
||
)
|
||
{
|
||
return((PVOID)NULL);
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
KeRaiseIrql (
|
||
KIRQL NewIrql,
|
||
PKIRQL OldIrql
|
||
)
|
||
{
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
KeLowerIrql (
|
||
KIRQL NewIrql
|
||
)
|
||
{
|
||
return;
|
||
}
|
||
|
||
|
||
#endif // MORGAN
|
||
|
||
|
||
|
||
#ifndef JNUPDATE
|
||
|
||
VOID
|
||
FwpFreeStub(
|
||
IN PVOID Buffer
|
||
)
|
||
{
|
||
}
|
||
|
||
VOID
|
||
FwpReservedRoutine(
|
||
VOID
|
||
)
|
||
{
|
||
FwPrint(ST_RESERVED_ROUTINE_MSG);
|
||
return;
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
|
||
//
|
||
// This is defined in ntos\rtl\imagedir.c. This is linked in unnecessarily
|
||
// on a normal build, and is needed on a kd build. The problem is that the
|
||
// rtl copy has an try/except block, which causes SEH code to be pulled into
|
||
// the link, which we are not prepared for. So, this copy is identical to
|
||
// the rtl copy except it has no try/except form.
|
||
//
|
||
|
||
PIMAGE_NT_HEADERS
|
||
RtlImageNtHeader (
|
||
IN PVOID Base
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function returns the address of the NT Header.
|
||
|
||
Arguments:
|
||
|
||
Base - Supplies the base of the image.
|
||
|
||
Return Value:
|
||
|
||
Returns the address of the NT Header.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
PIMAGE_NT_HEADERS NtHeaders;
|
||
|
||
if (Base != NULL &&
|
||
Base != (PVOID)-1
|
||
) {
|
||
// try {
|
||
if (((PIMAGE_DOS_HEADER)Base)->e_magic == IMAGE_DOS_SIGNATURE) {
|
||
NtHeaders = (PIMAGE_NT_HEADERS)((PCHAR)Base + ((PIMAGE_DOS_HEADER)Base)->e_lfanew);
|
||
if (NtHeaders->Signature == IMAGE_NT_SIGNATURE) {
|
||
return NtHeaders;
|
||
}
|
||
}
|
||
|
||
// } except(EXCEPTION_EXECUTE_HANDLER) {
|
||
// return NULL;
|
||
// }
|
||
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
|
||
|
||
|
||
#ifndef JNUPDATE
|
||
|
||
#ifndef ALPHA_FW_KDHOOKS
|
||
|
||
//
|
||
// This must not be defined for kd link.
|
||
//
|
||
|
||
LONG
|
||
DebugPrint(
|
||
IN PSTRING Output
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is defined in rtl\alpha\debugstb.s. There, it calls
|
||
BREAK_DEBUG_PRINT, which is defined in public\sdk\inc\kxalpha.h to
|
||
do a call_pal callkd, which in the NT PALcode will invoke the
|
||
AlphaKd link.
|
||
|
||
The normal firmware PALcode has no AlphaKd support, so DebugPrint is
|
||
stubbed off here. There are references to DebugPrint in the bldr
|
||
directory and some fw files.
|
||
|
||
Arguments:
|
||
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
{
|
||
return (0);
|
||
}
|
||
|
||
#endif
|
||
|
||
#endif
|
||
|
||
|
||
#ifndef JNUPDATE
|
||
|
||
VOID
|
||
RtlInitString(
|
||
OUT PSTRING DestinationString,
|
||
IN PCSZ SourceString OPTIONAL
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
The RtlInitString function initializes an NT counted string.
|
||
The DestinationString is initialized to point to the SourceString
|
||
and the Length and MaximumLength fields of DestinationString are
|
||
initialized to the length of the SourceString, which is zero if
|
||
SourceString is not specified.
|
||
|
||
This is a copy of the same function in \nt\private\ntos\rtl\string.c.
|
||
It is here to minimize what the linker drags into the image.
|
||
|
||
Arguments:
|
||
|
||
DestinationString - Pointer to the counted string to initialize
|
||
|
||
SourceString - Optional pointer to a null terminated string that
|
||
the counted string is to point to.
|
||
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
DestinationString->Length = 0;
|
||
DestinationString->Buffer = (PCHAR)SourceString;
|
||
if (ARGUMENT_PRESENT( SourceString )) {
|
||
while (*SourceString++) {
|
||
DestinationString->Length++;
|
||
}
|
||
|
||
DestinationString->MaximumLength = (SHORT)(DestinationString->Length+1);
|
||
}
|
||
else {
|
||
DestinationString->MaximumLength = 0;
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
#if (!defined FAILSAFE_BOOTER) && (!defined JNUPDATE)
|
||
|
||
|
||
//
|
||
// This stub is needed by some function in the rtl library.
|
||
//
|
||
|
||
NTSTATUS
|
||
ZwQuerySystemInformation (
|
||
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
||
OUT PVOID SystemInformation,
|
||
IN ULONG SystemInformationLength,
|
||
OUT PULONG ReturnLength OPTIONAL
|
||
)
|
||
|
||
{
|
||
return;
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
VOID
|
||
FwErrorStackUnderflow (
|
||
IN ULONG Caller,
|
||
IN ULONG CallerOfTheCaller,
|
||
IN ULONG CallerRequestedStackArea
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
A function was called that requested a stack area too large for
|
||
the current Firmware stack. The firmware _RtlCheckStack function
|
||
(see fwchkstk.s) calls this function to print out the fatal error
|
||
message.
|
||
|
||
The 64KB underneath the Firmware stack is used as a panic stack.
|
||
|
||
Arguments:
|
||
|
||
Caller The address of the function that tried to
|
||
allocate the stack space.
|
||
|
||
CallerOfTheCaller The address of the function that called the
|
||
function held in "Caller".
|
||
|
||
CallerRequestedStackArea The amount of stack space requested by
|
||
"Caller".
|
||
|
||
Return Value:
|
||
|
||
This never returns.
|
||
|
||
--*/
|
||
|
||
{
|
||
VenSetScreenColor(ArcColorRed, ArcColorWhite);
|
||
VenPrint(ST_STACK_UNDERFLOW_1_MSG);
|
||
VenPrint2(ST_STACK_UNDERFLOW_2_MSG, Caller, CallerOfTheCaller);
|
||
VenPrint2(ST_STACK_UNDERFLOW_3_MSG,
|
||
CallerRequestedStackArea,
|
||
FW_STACK_LOWER_BOUND);
|
||
|
||
#if (!defined FAILSAFE_BOOTER) && (!defined JNUPDATE)
|
||
|
||
VenPrint(ST_HIT_KEY_FOR_MONITOR_MSG);
|
||
VenSetScreenColor(ArcColorWhite, ArcColorBlue);
|
||
|
||
FwWaitForKeypress(TRUE);
|
||
|
||
FwMonitor(0); // Should never return.
|
||
|
||
#endif
|
||
|
||
while (TRUE) {
|
||
}
|
||
}
|
||
|
||
|
||
#ifndef JNUPDATE
|
||
|
||
VOID
|
||
KeFlushIoBuffers (
|
||
IN PMDL Mdl,
|
||
IN BOOLEAN ReadOperation,
|
||
IN BOOLEAN DmaOperation
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function flushes the I/O buffer specified by the memory descriptor
|
||
list from the data cache on the current processor.
|
||
|
||
Arguments:
|
||
|
||
Mdl - Supplies a pointer to a memory descriptor list that describes the
|
||
I/O buffer location.
|
||
|
||
ReadOperation - Supplies a boolean value that describes whether the I/O
|
||
operation is a read into memory.
|
||
|
||
DmaOperation - Supplies a boolean value that describes whether the I/O
|
||
operation is a DMA operation.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
|
||
//
|
||
// temptemp
|
||
//
|
||
// This function must distribute the flush in an MP system.
|
||
//
|
||
|
||
HalFlushIoBuffers( Mdl, ReadOperation, DmaOperation );
|
||
return;
|
||
}
|
||
|
||
#endif
|