windows-nt/Source/XPSP1/NT/base/boot/kdcom/kdcom.c
2020-09-26 16:20:57 +08:00

255 lines
4.5 KiB
C
Raw 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.

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
kdcom.c
Abstract:
Kernel Debugger HW Extension DLL com port debugger support module
Author:
Eric F. Nelson (enelson) 7-Jan-99
Revision History:
--*/
#include "kdcomp.h"
#define BAUD_OPTION "BAUDRATE"
#define PORT_OPTION "DEBUGPORT"
DEBUG_PARAMETERS KdCompDbgParams = {0, 0};
VOID
SleepResetKd(
VOID
);
NTSTATUS
KdD0Transition(
VOID
)
/*++
Routine Description:
The PCI driver (or relevant bus driver) will call this API after it
processes a D0 IRP for this device
Arguments:
None
Return Value:
STATUS_SUCCESS, or appropriate error status
--*/
{
return STATUS_SUCCESS;
}
NTSTATUS
KdD3Transition(
VOID
)
/*++
Routine Description:
The PCI driver (or relevant bus driver) will call this API before it
processes a D3 IRP for this device
Arguments:
None
Return Value:
STATUS_SUCCESS, or appropriate error status
--*/
{
return STATUS_SUCCESS;
}
NTSTATUS
KdDebuggerInitialize0(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
)
/*++
Routine Description:
This API allows the debugger DLL to parse the boot.ini strings and
perform any initialization. It cannot be assumed that the entire NT
kernel has been initialized at this time. Memory management services,
for example, will not be available. After this call has returned, the
debugger DLL may receive requests to send and receive packets.
Arguments:
LoaderBlock - Supplies a pointer to the loader parameter block
Return Value:
STATUS_SUCCESS, or error
--*/
{
PCHAR Options;
NTSTATUS Status;
PCHAR BaudOption;
PCHAR PortOption;
if (LoaderBlock != NULL) {
if (LoaderBlock->LoadOptions != NULL) {
Options = LoaderBlock->LoadOptions;
_strupr(Options);
PortOption = strstr(Options, PORT_OPTION);
BaudOption = strstr(Options, BAUD_OPTION);
if (PortOption) {
PortOption = strstr(PortOption, "COM");
if (PortOption) {
KdCompDbgParams.CommunicationPort = atol(PortOption + 3);
}
}
if (BaudOption) {
BaudOption += strlen(BAUD_OPTION);
while (*BaudOption == ' ') {
BaudOption++;
}
if (*BaudOption != '\0') {
KdCompDbgParams.BaudRate = atol(BaudOption + 1);
}
}
}
}
Status = KdCompInitialize(&KdCompDbgParams, LoaderBlock);
//
// Initialize ID for NEXT packet to send and Expect ID of next incoming
// packet.
//
if (NT_SUCCESS(Status)) {
KdCompNextPacketIdToSend = INITIAL_PACKET_ID | SYNC_PACKET_ID;
KdCompPacketIdExpected = INITIAL_PACKET_ID;
}
return Status;
}
NTSTATUS
KdDebuggerInitialize1(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
)
/*++
Routine Description:
This API allows the debugger DLL to do any initialization that it needs
to do after the NT kernel services are available. Mm and registry APIs
will be guaranteed to be available at this time. If the specific
debugger DLL implementation uses a PCI device, it will set a registry
key (discussed later) that notifies the PCI driver that a specific PCI
device is being used for debugging.
Arguments:
LoaderBlock - Supplies a pointer to the loader parameter block
Return Value:
STATUS_SUCCESS, or appropriate error status
--*/
{
KdCompInitialize1();
return STATUS_SUCCESS;
}
NTSTATUS
KdSave(
IN BOOLEAN KdSleepTransition
)
/*++
Routine Description:
The HAL calls this function as late as possible before putting the
machine to sleep.
Arguments:
KdSleepTransition - TRUE when transitioning to/from sleep state
Return Value:
STATUS_SUCCESS, or appropriate error status
--*/
{
KdCompSave();
return STATUS_SUCCESS;
}
NTSTATUS
KdRestore(
IN BOOLEAN KdSleepTransition
)
/*++
Routine Description:
The HAL calls this function as early as possible after resuming from a
sleep state.
Arguments:
KdSleepTransition - TRUE when transitioning to/from sleep state
Return Value:
STATUS_SUCCESS, or appropriate error status
--*/
{
//
// Force resync when transitioning to/from sleep state
//
if (KdSleepTransition) {
#ifdef ALPHA
SleepResetKd();
#else
KdCompDbgPortsPresent = FALSE;
#endif
} else {
KdCompRestore();
}
return STATUS_SUCCESS;
}