255 lines
4.5 KiB
C
255 lines
4.5 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|