diff --git a/ntoskrnl/kd/kdio.c b/ntoskrnl/kd/kdio.c index be47e04c1c7..4ce92e3f076 100644 --- a/ntoskrnl/kd/kdio.c +++ b/ntoskrnl/kd/kdio.c @@ -229,6 +229,7 @@ KdpDebugLogInit( /* Register for later BootPhase 2 reinitialization */ DispatchTable->KdpInitRoutine = KdpDebugLogInit; + /* Announce ourselves */ HalDisplayString(" File log debugging enabled\r\n"); } else if (BootPhase >= 2) @@ -413,6 +414,7 @@ KdpSerialInit( } else if (BootPhase == 1) { + /* Announce ourselves */ HalDisplayString(" Serial debugging enabled\r\n"); } @@ -526,6 +528,7 @@ KdpScreenInit( /* Take control of the display */ KdpScreenAcquire(); + /* Announce ourselves */ HalDisplayString(" Screen debugging enabled\r\n"); } diff --git a/ntoskrnl/kdbg/kdb.h b/ntoskrnl/kdbg/kdb.h index b606d4a5156..2ec084fbb13 100644 --- a/ntoskrnl/kdbg/kdb.h +++ b/ntoskrnl/kdbg/kdb.h @@ -171,7 +171,7 @@ KdbSymProcessSymbols( _Inout_ PLDR_DATA_TABLE_ENTRY LdrEntry, _In_ BOOLEAN Load); -VOID +BOOLEAN KdbSymInit( _In_ ULONG BootPhase); diff --git a/ntoskrnl/kdbg/kdb_cli.c b/ntoskrnl/kdbg/kdb_cli.c index aaebf573cf8..f114a862958 100644 --- a/ntoskrnl/kdbg/kdb_cli.c +++ b/ntoskrnl/kdbg/kdb_cli.c @@ -3964,6 +3964,9 @@ KdbInitialize( _In_ PKD_DISPATCH_TABLE DispatchTable, _In_ ULONG BootPhase) { + /* Saves the different symbol-loading status across boot phases */ + static ULONG LoadSymbols = 0; + if (BootPhase == 0) { /* Write out the functions that we support for now */ @@ -3993,12 +3996,26 @@ KdbInitialize( KeInitializeSpinLock(&KdpDmesgLogSpinLock); } + /* Initialize symbols support in BootPhase 0 and 1 */ if (BootPhase <= 1) { - /* Initialize symbols support */ - KdbSymInit(BootPhase); + LoadSymbols <<= 1; + LoadSymbols |= KdbSymInit(BootPhase); } - else if (BootPhase >= 2) + + if (BootPhase == 1) + { + /* Announce ourselves */ + CHAR buffer[60]; + RtlStringCbPrintfA(buffer, sizeof(buffer), + " KDBG debugger enabled - %s\r\n", + !(LoadSymbols & 0x2) ? "No symbols loaded" : + !(LoadSymbols & 0x1) ? "Kernel symbols loaded" + : "Loading symbols"); + HalDisplayString(buffer); + } + + if (BootPhase >= 2) { /* I/O is now set up for disk access: Read KDB Data */ NTSTATUS Status = KdbpCliInit(); diff --git a/ntoskrnl/kdbg/kdb_symbols.c b/ntoskrnl/kdbg/kdb_symbols.c index 2ac4d29b30f..3222c40ce6d 100644 --- a/ntoskrnl/kdbg/kdb_symbols.c +++ b/ntoskrnl/kdbg/kdb_symbols.c @@ -337,9 +337,10 @@ KdbSymProcessSymbols( * @param[in] BootPhase * Phase of initialization. * - * @return None. + * @return + * TRUE if symbols are to be loaded at this given BootPhase; FALSE if not. **/ -VOID +BOOLEAN KdbSymInit( _In_ ULONG BootPhase) { @@ -347,61 +348,55 @@ KdbSymInit( if (BootPhase == 0) { - PCHAR p1, p2; + PSTR CommandLine; SHORT Found = FALSE; CHAR YesNo; - /* - * Default symbols loading strategy: - * In DBG builds, load symbols only if we have 96MB of RAM or more. - * In REL builds, do not load them by default. - */ + /* By default, load symbols in DBG builds, but not in REL builds */ #if DBG - LoadSymbols = (MmNumberOfPhysicalPages >= 0x6000); + LoadSymbols = TRUE; #else LoadSymbols = FALSE; #endif - /* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS, - * /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */ + /* Check the command line for LOADSYMBOLS, NOLOADSYMBOLS, + * LOADSYMBOLS={YES|NO}, NOLOADSYMBOLS={YES|NO} */ ASSERT(KeLoaderBlock); - p1 = KeLoaderBlock->LoadOptions; - while ('\0' != *p1 && NULL != (p2 = strchr(p1, '/'))) + CommandLine = KeLoaderBlock->LoadOptions; + while (*CommandLine) { - p2++; + /* Skip any whitespace */ + while (isspace(*CommandLine)) + ++CommandLine; + Found = 0; - if (0 == _strnicmp(p2, "LOADSYMBOLS", 11)) + if (_strnicmp(CommandLine, "LOADSYMBOLS", 11) == 0) { Found = +1; - p2 += 11; + CommandLine += 11; } - else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13)) + else if (_strnicmp(CommandLine, "NOLOADSYMBOLS", 13) == 0) { Found = -1; - p2 += 13; + CommandLine += 13; } - if (0 != Found) + if (Found != 0) { - while (isspace(*p2)) + if (*CommandLine == '=') { - p2++; - } - if ('=' == *p2) - { - p2++; - while (isspace(*p2)) - { - p2++; - } - YesNo = toupper(*p2); - if ('N' == YesNo || 'F' == YesNo || '0' == YesNo) + ++CommandLine; + YesNo = toupper(*CommandLine); + if (YesNo == 'N' || YesNo == '0') { Found = -1 * Found; } } LoadSymbols = (0 < Found); } - p1 = p2; + + /* Move on to the next option */ + while (*CommandLine && !isspace(*CommandLine)) + ++CommandLine; } } else if (BootPhase == 1) @@ -411,13 +406,13 @@ KdbSymInit( KIRQL OldIrql; PLIST_ENTRY ListEntry; - /* Do not load symbols if we have less than 96MB of RAM */ - if (MmNumberOfPhysicalPages < 0x6000) + /* Do not continue loading symbols if we have less than 96MB of RAM */ + if (MmNumberOfPhysicalPages < (96 * 1024 * 1024 / PAGE_SIZE)) LoadSymbols = FALSE; /* Continue this phase only if we need to load symbols */ if (!LoadSymbols) - return; + return LoadSymbols; /* Launch our worker thread */ InitializeListHead(&SymbolsToLoad); @@ -433,7 +428,7 @@ KdbSymInit( { DPRINT1("Failed starting symbols loader thread: 0x%08x\n", Status); LoadSymbols = FALSE; - return; + return LoadSymbols; } RosSymInitKernelMode(); @@ -450,6 +445,8 @@ KdbSymInit( KeReleaseSpinLock(&PsLoadedModuleSpinLock, OldIrql); } + + return LoadSymbols; } /* EOF */