windows-nt/Source/XPSP1/NT/base/boot/bd/init.c

190 lines
4.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
init.c
Abstract:
This module implements the initialization for the boot debgger.
Author:
David N. Cutler (davec) 27-Nov-1996
Revision History:
--*/
#include "bd.h"
#if defined(EFI)
#include "bootefi.h"
#endif
//
// Define local data.
//
#define BAUD_OPTION "BAUDRATE"
#define PORT_OPTION "DEBUGPORT"
ULONG BdFileId;
VOID
BdInitDebugger (
IN PCHAR LoaderName,
IN PVOID LoaderBase,
IN PCHAR Options
)
/*++
Routine Description:
This routine initializes the boot kernel debugger.
Arguments:
Options - Supplies a pointer to the the boot options.
Stop - Supplies a logical value that determines whether a debug message
and breakpoint are generated.
Return Value:
None.
--*/
{
PCHAR BaudOption;
ULONG BaudRate;
ULONG Index;
ULONG PortNumber;
PCHAR PortOption;
STRING String;
//
// If the boot debugger is not already initialized, then attempt to
// initialize the debugger.
//
if (BdDebuggerEnabled == FALSE) {
//
// Set the address of the debug routine to the stub function and parse
// any options if specified.
//
BdDebugRoutine = BdStub;
if (Options != NULL) {
_strupr(Options);
//
// If nodebug is not explicitly specified, then check if the baud
// rate, com port, or debug is explicitly specified.
//
if (strstr(Options, "NODEBUG") == NULL) {
PortNumber = 0;
PortOption = strstr(Options, PORT_OPTION);
BaudOption = strstr(Options, BAUD_OPTION);
BaudRate = 0;
if ((PortOption == NULL) && (BaudOption == NULL)) {
if (strstr(Options, "DEBUG") == NULL) {
return;
}
} else {
if (PortOption != NULL) {
PortOption = strstr(PortOption, "COM");
if (PortOption != NULL) {
PortNumber = atol(PortOption + 3);
}
}
if (BaudOption != NULL) {
BaudOption += strlen(BAUD_OPTION);
while (*BaudOption == ' ') {
BaudOption++;
}
if (*BaudOption != '\0') {
BaudRate = atol(BaudOption + 1);
}
}
}
//
// Attempt to initialize the debug port.
//
if (BdPortInitialize(BaudRate, PortNumber, &BdFileId) == FALSE) {
return;
}
//
// Set the value of a break point instruction, set the address
// of the debug routine to the trap function, set the debugger
// enabled and initialize the breakpoint table.
//
BdBreakpointInstruction = BD_BREAKPOINT_VALUE;
BdDebugRoutine = BdTrap;
BdDebuggerEnabled = TRUE;
for (Index = 0; Index < BREAKPOINT_TABLE_SIZE; Index += 1) {
BdBreakpointTable[Index].Flags = 0;
BdBreakpointTable[Index].Address = 0;
}
//
// Initialize the ID for the NEXT packet to send and the Expect
// ID of next incoming packet.
//
BdNextPacketIdToSend = INITIAL_PACKET_ID | SYNC_PACKET_ID;
BdPacketIdExpected = INITIAL_PACKET_ID;
//
// Announce debugger initialized.
//
DbgPrint("BD: Boot Debugger Initialized\n");
//
// Notify the kernel debugger to load symbols for the loader.
//
String.Buffer = LoaderName;
String.Length = (USHORT) strlen(LoaderName);
DbgPrint("BD: %s base address %p\n", LoaderName, LoaderBase);
DbgLoadImageSymbols(&String, LoaderBase, (ULONG_PTR)-1);
if (strstr(Options, "DEBUGSTOP") != NULL) {
//
// Treat this like a request for initial breakpoint.
//
DbgBreakPoint();
}
#if defined(EFI)
//
// if running under the debugger disable the watchdog so we
// don't get reset
//
DisableEFIWatchDog();
#endif
}
}
}
return;
}