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