Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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; }
|