185 lines
3.5 KiB
C
185 lines
3.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1990 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
stubs.c
|
||
|
||
Abstract:
|
||
|
||
This module implements stub routines for the boot code.
|
||
|
||
Author:
|
||
|
||
David N. Cutler (davec) 7-Nov-1990
|
||
|
||
Environment:
|
||
|
||
Kernel mode only.
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#include "bootia64.h"
|
||
#include "stdio.h"
|
||
#include "stdarg.h"
|
||
|
||
VOID
|
||
KeBugCheck (
|
||
IN ULONG BugCheckCode
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function crashes the system in a controlled manner.
|
||
|
||
Arguments:
|
||
|
||
BugCheckCode - Supplies the reason for the bug check.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
//
|
||
// Print out the bug check code and break.
|
||
//
|
||
|
||
BlPrint(TEXT("\n*** BugCheck (%lx) ***\n\n"), BugCheckCode);
|
||
while(TRUE) {
|
||
};
|
||
}
|
||
|
||
VOID
|
||
RtlAssert(
|
||
IN PVOID FailedAssertion,
|
||
IN PVOID FileName,
|
||
IN ULONG LineNumber,
|
||
IN PCHAR Message OPTIONAL
|
||
)
|
||
{
|
||
|
||
BlPrint( TEXT("\n*** Assertion failed %S in %S line %d\n"),
|
||
FailedAssertion,
|
||
FileName,
|
||
LineNumber );
|
||
if (Message) {
|
||
//bugbug UNICODE
|
||
//BlPrint(Message);
|
||
}
|
||
|
||
while (TRUE) {
|
||
}
|
||
}
|
||
|
||
VOID
|
||
KiCheckForSoftwareInterrupt (
|
||
KIRQL RequestIrql
|
||
)
|
||
{
|
||
BlPrint( TEXT("\n*** Assertion in KiCheckForSoftwareInterrupt\n") );
|
||
}
|
||
|
||
VOID
|
||
KeFlushIoBuffers (
|
||
IN PMDL Mdl,
|
||
IN BOOLEAN ReadOperation,
|
||
IN BOOLEAN DmaOperation
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is similar to the kernel routine with the same name. It is
|
||
very simplified relative to the kernel routine as during the boot process
|
||
the environment is much more restrictive. Specifically, we boot
|
||
as a uniprocessor and we always do DMA. Thus, we can simplify this
|
||
code considerably.
|
||
|
||
In the kernel, KeFlushIoBuffer() is used to flush the I-cache for the
|
||
PIO cases. Architecturally, it is required to perform a flush cache,
|
||
sync.i, and srlz.i to invalidate the I-cache. This sequence should
|
||
supports both UP and MP cases (though booting is a UP case only)
|
||
|
||
Arugements:
|
||
|
||
Mdl - Supplies a pointer to a memory descriptor list that describes the
|
||
I/O buffer location. [unused]
|
||
|
||
ReadOperation - Supplies a boolean value that determines whether the I/O
|
||
operation is a read into memory. [unused]
|
||
|
||
DmaOperation - Supplies a boolean value that deternines whether the I/O
|
||
operation is a DMA operation.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
//
|
||
// If we are doing something besides a DMA operation, we
|
||
// have a problem. This routine is not designed to handle anything
|
||
// except DMA
|
||
//
|
||
|
||
if (!DmaOperation) {
|
||
RtlAssert("!DmaOperation", __FILE__, __LINE__,
|
||
"Boot version of KeFlushIOBuffers can only handle DMA operations");
|
||
// Never returns
|
||
}
|
||
__mf();
|
||
}
|
||
|
||
|
||
NTHALAPI
|
||
VOID
|
||
KeFlushWriteBuffer(
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
|
||
This function is similar to the kernel routine with the same name. It is
|
||
very simplified relative to the kernel routine as during the boot process
|
||
the environment is much more restrictive. Specifically, we boot
|
||
as a uniprocessor.
|
||
|
||
This routine is responsible for flushing all write buffers
|
||
and/or other data storing or reordering
|
||
hardware on the current processor. This ensures that all previous
|
||
writes will occur before any new reads or writes are completed.
|
||
|
||
NOTE: In the simulation environment, there is no write buffer and
|
||
nothing needs to be done.
|
||
|
||
Arguments:
|
||
|
||
None
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
//
|
||
// NOTE: The real hardware may need more than this
|
||
//
|
||
__mf();
|
||
}
|
||
|