From add13dc21720eff1a37fdea34c0fef190e2ad37d Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Wed, 5 Jul 2006 04:17:04 +0000 Subject: DebugLib: Fix a bug in PeiDxeDebugLibReportStatusCode: it should use gReportStatusCodeDebugType so that report status code infrastructure can correctly extract debug info. Fix functional and coding style issues in the three instances in EdkModulePkg, namely: EdkDxeDebugLibReportStatusCode, EdkUefiDebugLibStderr, EdkUefiDebugLibConout. DevicePathLib: Sync with MWG 0.57 and add new interface of CreateDevicePathNode(). All the function headers have been updated. PeiServicesLib: Adjust coding style and fix a minor comment error. PciLib: Adjust assert() condition to sync with MWG 0.57 BaseMemoryLib: Adjust assert() for ScanMemXX (), ScanGuid() Rename UefiMemoryLib to DxeMemoryLib PrintLib: Change the return value of all print services to exclude the NULL-terminator. Misc: Slightly adjust the coding style in hob.c in PeiCore module. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@757 6f19259b-4bc3-4df7-8a09-765794883524 --- .../EdkDxeDebugLibReportStatusCode/DebugLib.c | 344 +++++++++++---------- .../EdkDxeDebugLibReportStatusCode.msa | 12 +- .../Library/EdkUefiDebugLibConOut/DebugLib.c | 265 +++++++++------- .../EdkUefiDebugLibConOut.msa | 10 + .../Library/EdkUefiDebugLibStdErr/DebugLib.c | 265 +++++++++------- .../EdkUefiDebugLibStdErr.msa | 12 +- 6 files changed, 525 insertions(+), 383 deletions(-) (limited to 'EdkModulePkg/Library') diff --git a/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c b/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c index 51ea6bd9ba..fed9ba4d66 100644 --- a/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c +++ b/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c @@ -1,176 +1,99 @@ -/*++ +/** @file + EFI Debug Library that installs Debug Level Protocol. -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php -Module Name: + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - DebugLib.c - -Abstract: +**/ - EFI Debug Library +STATIC BOOLEAN mDebugLevelInstalled = FALSE; +STATIC EFI_DEBUG_LEVEL_PROTOCOL mDebugLevel = { 0 }; ---*/ +/** + Installs Debug Level Protocol. + + The constructor function installs Debug Level Protocol on the ImageHandle. + It will ASSERT() if the installation fails and will always return EFI_SUCCESS. -static BOOLEAN mDebugLevelInstalled = FALSE; -static EFI_DEBUG_LEVEL_PROTOCOL mDebugLevel = { 0 }; + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. +**/ EFI_STATUS +EFIAPI DebugLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) -/*++ - -Routine Description: - -Arguments: - -Returns: - ---*/ { - EFI_STATUS Status; + EFI_STATUS Status; // - // Initialize Debug Level Protocol + // Initialize Debug Level Protocol. // mDebugLevel.DebugLevel = PcdGet32(PcdDebugPrintErrorLevel); // - // Install Debug Level Protocol + // Install Debug Level Protocol. // Status = gBS->InstallMultipleProtocolInterfaces ( &ImageHandle, - &gEfiDebugLevelProtocolGuid, &mDebugLevel, + &gEfiDebugLevelProtocolGuid, + &mDebugLevel, NULL ); ASSERT_EFI_ERROR (Status); // - // Set flag to show that the Debug Level Protocol has been installed + // Set flag to show that the Debug Level Protocol has been installed. // mDebugLevelInstalled = TRUE; - return EFI_SUCCESS; + return Status; } -VOID -EFIAPI -DebugAssert ( - IN CHAR8 *FileName, - IN UINTN LineNumber, - IN CHAR8 *Description - ) -/*++ - -Routine Description: - - Worker function for ASSERT(). If Error Logging hub is loaded log ASSERT - information. If Error Logging hub is not loaded CpuBreakpoint (). - - We use UINT64 buffers due to IPF alignment concerns. - -Arguments: - - FileName - File name of failing routine. - - LineNumber - Line number of failing ASSERT(). - - Description - Descritption, usally the assertion, - -Returns: - - None - ---*/ -{ - UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof(UINT64)]; - EFI_DEBUG_ASSERT_DATA *AssertData; - UINTN TotalSize; - CHAR8 *Temp; - - if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) == 0) { - return; - } - - // - // Make sure it will all fit in the passed in buffer - // - TotalSize = sizeof (EFI_DEBUG_ASSERT_DATA) + AsciiStrLen (FileName) + 1 + AsciiStrLen (Description) + 1; - if (TotalSize <= EFI_STATUS_CODE_DATA_MAX_SIZE) { - // - // Fill in EFI_DEBUG_ASSERT_DATA - // - AssertData = (EFI_DEBUG_ASSERT_DATA *)Buffer; - AssertData->LineNumber = (UINT32)LineNumber; +/** - // - // Copy Ascii FileName including NULL. - // - Temp = AsciiStrCpy ((CHAR8 *)(AssertData + 1), FileName); + Prints a debug message to the debug output device if the specified error level is enabled. - // - // Copy Ascii Description - // - AsciiStrCpy (Temp + AsciiStrLen(FileName) + 1, Description); + If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print + the message specified by Format and the associated variable argument list to + the debug output device. - REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( - (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), - (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), - AssertData, - TotalSize - ); - } + If Format is NULL, then ASSERT(). - // - // Put break point in module that contained the error. - // - CpuBreakpoint (); -} + @param ErrorLevel The error level of the debug message. + @param Format Format string for the debug message to print. +**/ VOID -DebugVPrint ( - IN UINTN ErrorLevel, - IN CHAR8 *Format, - IN VA_LIST Marker +EFIAPI +DebugPrint ( + IN UINTN ErrorLevel, + IN CONST CHAR8 *Format, + ... ) -/*++ - -Routine Description: - - Worker function for DEBUG(). If Error Logging hub is loaded log ASSERT - information. If Error Logging hub is not loaded do nothing. - - We use UINT64 buffers due to IPF alignment concerns. - -Arguments: - - ErrorLevel - If error level is set do the debug print. - - Format - String to use for the print, followed by Print arguments. - - Marker - VarArgs - -Returns: - - None - ---*/ { UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)]; EFI_DEBUG_INFO *DebugInfo; UINTN TotalSize; UINTN Index; + VA_LIST Marker; UINT64 *ArgumentPointer; + // + // If Format is NULL, then ASSERT(). + // + ASSERT (Format != NULL); + // // Check driver Debug Level value and global debug level // @@ -184,7 +107,7 @@ Returns: } } - TotalSize = sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64 *) + AsciiStrLen (Format) + 1; + TotalSize = sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrLen (Format) + 1; if (TotalSize > EFI_STATUS_CODE_DATA_MAX_SIZE) { return; } @@ -198,57 +121,103 @@ Returns: // // 256 byte mini Var Arg stack. That is followed by the format string. // + VA_START (Marker, Format); for (Index = 0, ArgumentPointer = (UINT64 *)(DebugInfo + 1); Index < 12; Index++, ArgumentPointer++) { *ArgumentPointer = VA_ARG (Marker, UINT64); } + VA_END (Marker); AsciiStrCpy ((CHAR8 *)ArgumentPointer, Format); - // - // - // - REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( + REPORT_STATUS_CODE_EX ( EFI_DEBUG_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_DC_UNSPECIFIED), + 0, + NULL, + &gEfiStatusCodeDataTypeDebugGuid, DebugInfo, TotalSize ); } -VOID -EFIAPI -DebugPrint ( - IN UINTN ErrorLevel, - IN CHAR8 *Format, - ... - ) -/*++ -Routine Description: +/** - Wrapper for DebugVPrint () - -Arguments: + Prints an assert message containing a filename, line number, and description. + This may be followed by a breakpoint or a dead loop. - ErrorLevel - If error level is set do the debug print. + Print a message of the form "ASSERT (): \n" + to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of + PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + CpuDeadLoop() is called. If neither of these bits are set, then this function + returns immediately after the message is printed to the debug output device. + DebugAssert() must actively prevent recusrsion. If DebugAssert() is called while + processing another DebugAssert(), then DebugAssert() must return immediately. - Format - String to use for the print, followed by Print arguments. + If FileName is NULL, then a string of "(NULL) Filename" is printed. - ... - Print arguments. + If Description is NULL, then a string of "(NULL) Description" is printed. -Returns: - - None + @param FileName Pointer to the name of the source file that generated the assert condition. + @param LineNumber The line number in the source file that generated the assert condition + @param Description Pointer to the description of the assert condition. ---*/ +**/ +VOID +EFIAPI +DebugAssert ( + IN CONST CHAR8 *FileName, + IN UINTN LineNumber, + IN CONST CHAR8 *Description + ) { - VA_LIST Marker; + UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof(UINT64)]; + EFI_DEBUG_ASSERT_DATA *AssertData; + UINTN TotalSize; + CHAR8 *Temp; - VA_START (Marker, Format); - DebugVPrint (ErrorLevel, Format, Marker); - VA_END (Marker); + // + // Make sure it will all fit in the passed in buffer. + // + TotalSize = sizeof (EFI_DEBUG_ASSERT_DATA) + AsciiStrLen (FileName) + 1 + AsciiStrLen (Description) + 1; + if (TotalSize <= EFI_STATUS_CODE_DATA_MAX_SIZE) { + // + // Fill in EFI_DEBUG_ASSERT_DATA + // + AssertData = (EFI_DEBUG_ASSERT_DATA *)Buffer; + AssertData->LineNumber = (UINT32)LineNumber; + + // + // Copy Ascii FileName including NULL. + // + Temp = AsciiStrCpy ((CHAR8 *)(AssertData + 1), FileName); + + // + // Copy Ascii Description. + // + AsciiStrCpy (Temp + AsciiStrLen (FileName) + 1, Description); + + REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( + (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), + AssertData, + TotalSize + ); + } + + // + // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings + // + if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) { + CpuBreakpoint (); + } else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) { + CpuDeadLoop (); + } } + /** + Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer. This function fills Length bytes of Buffer with the value specified by @@ -258,8 +227,8 @@ Returns: If Length is greater than (MAX_ADDRESS – Buffer + 1), then ASSERT(). - @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue. - @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. + @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue. + @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. @return Buffer @@ -271,11 +240,29 @@ DebugClearMemory ( IN UINTN Length ) { -// SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue)); - SetMem (Buffer, Length, 0xAF); - return Buffer; + // + // If Buffer is NULL, then ASSERT(). + // + ASSERT (Buffer != NULL); + + // + // SetMem() checks for the the ASSERT() condition on Length and returns Buffer + // + return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue)); } + +/** + + Returns TRUE if ASSERT() macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugAssertEnabled ( @@ -285,6 +272,18 @@ DebugAssertEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG()macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugPrintEnabled ( @@ -294,6 +293,18 @@ DebugPrintEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG_CODE()macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugCodeEnabled ( @@ -303,6 +314,18 @@ DebugCodeEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG_CLEAR_MEMORY()macro is enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugClearMemoryEnabled ( @@ -311,4 +334,3 @@ DebugClearMemoryEnabled ( { return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0); } - diff --git a/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/EdkDxeDebugLibReportStatusCode.msa b/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/EdkDxeDebugLibReportStatusCode.msa index 3de21286b0..752bc570a4 100644 --- a/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/EdkDxeDebugLibReportStatusCode.msa +++ b/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/EdkDxeDebugLibReportStatusCode.msa @@ -49,10 +49,15 @@ - + DebugLevel + + + StatusCodeDataTypeDebug + + EFI_SPECIFICATION_VERSION 0x00020000 EDK_RELEASE_VERSION 0x00090000 @@ -66,6 +71,11 @@ gEfiMdePkgTokenSpaceGuid + + PcdDebugClearMemoryValue + FIX_ME_PcdDebugClearMemoryValue + + PcdDebugPrintErrorLevel gEfiMdePkgTokenSpaceGuid diff --git a/EdkModulePkg/Library/EdkUefiDebugLibConOut/DebugLib.c b/EdkModulePkg/Library/EdkUefiDebugLibConOut/DebugLib.c index 9945143dc4..5f5f2c56ca 100644 --- a/EdkModulePkg/Library/EdkUefiDebugLibConOut/DebugLib.c +++ b/EdkModulePkg/Library/EdkUefiDebugLibConOut/DebugLib.c @@ -1,105 +1,99 @@ -/*++ +/** @file + UEFI Debug Library that uses PrintLib to send messages to CONOUT. -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php -Module Name: + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - DebugLib.c +**/ -Abstract: +// +// Define the maximum debug and assert message length that this library supports. +// +#define MAX_DEBUG_MESSAGE_LENGTH 0x100 - UEFI Debug Library that uses PrintLib to send messages to CONOUT +STATIC BOOLEAN mDebugLevelInstalled = FALSE; +STATIC EFI_DEBUG_LEVEL_PROTOCOL mDebugLevel = { 0 }; ---*/ +/** + Installs Debug Level Protocol. + + The constructor function installs Debug Level Protocol on the ImageHandle. + It will ASSERT() if the installation fails and will always return EFI_SUCCESS. -static BOOLEAN mDebugLevelInstalled = FALSE; -static EFI_DEBUG_LEVEL_PROTOCOL mDebugLevel = { 0 }; + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. +**/ EFI_STATUS +EFIAPI DebugLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) -/*++ - -Routine Description: - -Arguments: - -Returns: - ---*/ { - EFI_STATUS Status; + EFI_STATUS Status; // - // Initialize Debug Level Protocol + // Initialize Debug Level Protocol. // mDebugLevel.DebugLevel = PcdGet32(PcdDebugPrintErrorLevel); // - // Install Debug Level Protocol + // Install Debug Level Protocol. // Status = gBS->InstallMultipleProtocolInterfaces ( &ImageHandle, - &gEfiDebugLevelProtocolGuid, &mDebugLevel, + &gEfiDebugLevelProtocolGuid, + &mDebugLevel, NULL ); ASSERT_EFI_ERROR (Status); // - // Set flag to show that the Debug Level Protocol has been installed + // Set flag to show that the Debug Level Protocol has been installed. // mDebugLevelInstalled = TRUE; - return EFI_SUCCESS; + return Status; } -VOID -EFIAPI -DebugPrint ( - IN UINTN ErrorLevel, - IN CHAR8 *Format, - ... - ) -/*++ - -Routine Description: - - Wrapper for DebugVPrint () - -Arguments: +/** - ErrorLevel - If error level is set do the debug print. + Prints a debug message to the debug output device if the specified error level is enabled. - Format - String to use for the print, followed by Print arguments. + If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print + the message specified by Format and the associated variable argument list to + the debug output device. - ... - Print arguments. + If Format is NULL, then ASSERT(). -Returns: - - None + @param ErrorLevel The error level of the debug message. + @param Format Format string for the debug message to print. ---*/ +**/ +VOID +EFIAPI +DebugPrint ( + IN UINTN ErrorLevel, + IN CONST CHAR8 *Format, + ... + ) { - CHAR16 Buffer[0x100]; - CHAR16 UnicodeBuffer[0x100]; - UINT32 Index; + CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // - // Check to see if CONOUT is avilable + // If Format is NULL, then ASSERT(). // - if (gST->ConOut == NULL) { - return; - } + ASSERT (Format != NULL); // // Check driver Debug Level value and global debug level @@ -114,83 +108,80 @@ Returns: } } - // - // BUGBUG: Need print that take CHAR8 Format and returns CHAR16 Buffer - // - for (Index = 0; Format[Index] != 0; Index++) { - UnicodeBuffer[Index] = Format[Index]; - } - UnicodeBuffer[Index] = Format[Index]; - // // Convert the DEBUG() message to a Unicode String // VA_START (Marker, Format); - UnicodeVSPrint (Buffer, sizeof (Buffer), UnicodeBuffer, Marker); + UnicodeVSPrintAsciiFormat (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // - // Send the print string to the Standard Error device + // Send the print string to the Console Output device if CONOUT is available. // - gST->ConOut->OutputString (gST->ConOut, Buffer); + if (gST->ConOut != NULL) { + gST->ConOut->OutputString (gST->ConOut, Buffer); + } } -VOID -EFIAPI -DebugAssert ( - IN CHAR8 *FileName, - IN UINTN LineNumber, - IN CHAR8 *Description - ) -/*++ -Routine Description: - - Worker function for ASSERT(). If Error Logging hub is loaded log ASSERT - information. If Error Logging hub is not loaded CpuBreakpoint (). +/** - We use UINT64 buffers due to IPF alignment concerns. + Prints an assert message containing a filename, line number, and description. + This may be followed by a breakpoint or a dead loop. -Arguments: + Print a message of the form "ASSERT (): \n" + to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of + PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + CpuDeadLoop() is called. If neither of these bits are set, then this function + returns immediately after the message is printed to the debug output device. + DebugAssert() must actively prevent recusrsion. If DebugAssert() is called while + processing another DebugAssert(), then DebugAssert() must return immediately. - FileName - File name of failing routine. + If FileName is NULL, then a string of "(NULL) Filename" is printed. - LineNumber - Line number of failing ASSERT(). + If Description is NULL, then a string of "(NULL) Description" is printed. - Description - Descritption, usally the assertion, - -Returns: - - None + @param FileName Pointer to the name of the source file that generated the assert condition. + @param LineNumber The line number in the source file that generated the assert condition + @param Description Pointer to the description of the assert condition. ---*/ +**/ +VOID +EFIAPI +DebugAssert ( + IN CONST CHAR8 *FileName, + IN UINTN LineNumber, + IN CONST CHAR8 *Description + ) { - CHAR16 Buffer[0x100]; - - // - // Check to see if CONOUT is avilable - // - if (gST->ConOut == NULL) { - return; - } + CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; // // Generate the ASSERT() message in Unicode format // - UnicodeSPrint (Buffer, sizeof (Buffer), (CHAR16 *)L"ASSERT %s(%d): %s\n", FileName, LineNumber, Description); + UnicodeSPrintAsciiFormat (Buffer, sizeof (Buffer), "ASSERT %s(%d): %s\n", FileName, LineNumber, Description); // - // Send the print string to the Standard Error device + // Send the print string to the Console Output device if CONOUT is available. // - gST->ConOut->OutputString (gST->ConOut, Buffer); + if (gST->ConOut != NULL) { + gST->ConOut->OutputString (gST->ConOut, Buffer); + } // - // Put break point in module that contained the error. + // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings // - CpuBreakpoint (); + if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) { + CpuBreakpoint (); + } else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) { + CpuDeadLoop (); + } } + /** + Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer. This function fills Length bytes of Buffer with the value specified by @@ -200,8 +191,8 @@ Returns: If Length is greater than (MAX_ADDRESS – Buffer + 1), then ASSERT(). - @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue. - @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. + @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue. + @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. @return Buffer @@ -213,11 +204,29 @@ DebugClearMemory ( IN UINTN Length ) { -// SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue)); - SetMem (Buffer, Length, 0xAF); - return Buffer; + // + // If Buffer is NULL, then ASSERT(). + // + ASSERT (Buffer != NULL); + + // + // SetMem() checks for the the ASSERT() condition on Length and returns Buffer + // + return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue)); } + +/** + + Returns TRUE if ASSERT() macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugAssertEnabled ( @@ -227,6 +236,18 @@ DebugAssertEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG()macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugPrintEnabled ( @@ -236,6 +257,18 @@ DebugPrintEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG_CODE()macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugCodeEnabled ( @@ -245,6 +278,18 @@ DebugCodeEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG_CLEAR_MEMORY()macro is enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugClearMemoryEnabled ( diff --git a/EdkModulePkg/Library/EdkUefiDebugLibConOut/EdkUefiDebugLibConOut.msa b/EdkModulePkg/Library/EdkUefiDebugLibConOut/EdkUefiDebugLibConOut.msa index 915dad137a..6f7db31d7f 100644 --- a/EdkModulePkg/Library/EdkUefiDebugLibConOut/EdkUefiDebugLibConOut.msa +++ b/EdkModulePkg/Library/EdkUefiDebugLibConOut/EdkUefiDebugLibConOut.msa @@ -53,6 +53,11 @@ DebugLevel + + + StatusCodeDataTypeDebug + + EFI_SPECIFICATION_VERSION 0x00020000 EDK_RELEASE_VERSION 0x00090000 @@ -66,6 +71,11 @@ gEfiMdePkgTokenSpaceGuid
+ + PcdDebugClearMemoryValue + FIX_ME_PcdDebugClearMemoryValue + + PcdDebugPrintErrorLevel gEfiMdePkgTokenSpaceGuid diff --git a/EdkModulePkg/Library/EdkUefiDebugLibStdErr/DebugLib.c b/EdkModulePkg/Library/EdkUefiDebugLibStdErr/DebugLib.c index dc0c3ab497..2016701284 100644 --- a/EdkModulePkg/Library/EdkUefiDebugLibStdErr/DebugLib.c +++ b/EdkModulePkg/Library/EdkUefiDebugLibStdErr/DebugLib.c @@ -1,105 +1,99 @@ -/*++ +/** @file + UEFI Debug Library that uses PrintLib to send messages to STDERR. -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php -Module Name: + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - DebugLib.c +**/ -Abstract: +// +// Define the maximum debug and assert message length that this library supports. +// +#define MAX_DEBUG_MESSAGE_LENGTH 0x100 - UEFI Debug Library that uses PrintLib to send messages to STDERR +STATIC BOOLEAN mDebugLevelInstalled = FALSE; +STATIC EFI_DEBUG_LEVEL_PROTOCOL mDebugLevel = { 0 }; ---*/ +/** + Installs Debug Level Protocol. + + The constructor function installs Debug Level Protocol on the ImageHandle. + It will ASSERT() if the installation fails and will always return EFI_SUCCESS. -static BOOLEAN mDebugLevelInstalled = FALSE; -static EFI_DEBUG_LEVEL_PROTOCOL mDebugLevel = { 0 }; + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. +**/ EFI_STATUS +EFIAPI DebugLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) -/*++ - -Routine Description: - -Arguments: - -Returns: - ---*/ { - EFI_STATUS Status; + EFI_STATUS Status; // - // Initialize Debug Level Protocol + // Initialize Debug Level Protocol. // mDebugLevel.DebugLevel = PcdGet32(PcdDebugPrintErrorLevel); // - // Install Debug Level Protocol + // Install Debug Level Protocol. // Status = gBS->InstallMultipleProtocolInterfaces ( &ImageHandle, - &gEfiDebugLevelProtocolGuid, &mDebugLevel, + &gEfiDebugLevelProtocolGuid, + &mDebugLevel, NULL ); ASSERT_EFI_ERROR (Status); // - // Set flag to show that the Debug Level Protocol has been installed + // Set flag to show that the Debug Level Protocol has been installed. // mDebugLevelInstalled = TRUE; - return EFI_SUCCESS; + return Status; } -VOID -EFIAPI -DebugPrint ( - IN UINTN ErrorLevel, - IN CHAR8 *Format, - ... - ) -/*++ - -Routine Description: - - Wrapper for DebugVPrint () - -Arguments: +/** - ErrorLevel - If error level is set do the debug print. + Prints a debug message to the debug output device if the specified error level is enabled. - Format - String to use for the print, followed by Print arguments. + If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print + the message specified by Format and the associated variable argument list to + the debug output device. - ... - Print arguments. + If Format is NULL, then ASSERT(). -Returns: - - None + @param ErrorLevel The error level of the debug message. + @param Format Format string for the debug message to print. ---*/ +**/ +VOID +EFIAPI +DebugPrint ( + IN UINTN ErrorLevel, + IN CONST CHAR8 *Format, + ... + ) { - CHAR16 Buffer[0x100]; - CHAR16 UnicodeBuffer[0x100]; - UINT32 Index; + CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // - // Check to see if STDERR is avilable + // If Format is NULL, then ASSERT(). // - if (gST->StdErr == NULL) { - return; - } + ASSERT (Format != NULL); // // Check driver Debug Level value and global debug level @@ -114,83 +108,80 @@ Returns: } } - // - // BUGBUG: Need print that take CHAR8 Format and returns CHAR16 Buffer - // - for (Index = 0; Format[Index] != 0; Index++) { - UnicodeBuffer[Index] = Format[Index]; - } - UnicodeBuffer[Index] = Format[Index]; - // // Convert the DEBUG() message to a Unicode String // VA_START (Marker, Format); - UnicodeVSPrint (Buffer, sizeof (Buffer), UnicodeBuffer, Marker); + UnicodeVSPrintAsciiFormat (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // - // Send the print string to the Standard Error device + // Send the print string to the Standard Error device if STDERR is available. // - gST->StdErr->OutputString (gST->StdErr, Buffer); + if (gST->StdErr != NULL) { + gST->StdErr->OutputString (gST->StdErr, Buffer); + } } -VOID -EFIAPI -DebugAssert ( - IN CHAR8 *FileName, - IN UINTN LineNumber, - IN CHAR8 *Description - ) -/*++ -Routine Description: - - Worker function for ASSERT(). If Error Logging hub is loaded log ASSERT - information. If Error Logging hub is not loaded CpuBreakpoint (). +/** - We use UINT64 buffers due to IPF alignment concerns. + Prints an assert message containing a filename, line number, and description. + This may be followed by a breakpoint or a dead loop. -Arguments: + Print a message of the form "ASSERT (): \n" + to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of + PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + CpuDeadLoop() is called. If neither of these bits are set, then this function + returns immediately after the message is printed to the debug output device. + DebugAssert() must actively prevent recusrsion. If DebugAssert() is called while + processing another DebugAssert(), then DebugAssert() must return immediately. - FileName - File name of failing routine. + If FileName is NULL, then a string of "(NULL) Filename" is printed. - LineNumber - Line number of failing ASSERT(). + If Description is NULL, then a string of "(NULL) Description" is printed. - Description - Descritption, usally the assertion, - -Returns: - - None + @param FileName Pointer to the name of the source file that generated the assert condition. + @param LineNumber The line number in the source file that generated the assert condition + @param Description Pointer to the description of the assert condition. ---*/ +**/ +VOID +EFIAPI +DebugAssert ( + IN CONST CHAR8 *FileName, + IN UINTN LineNumber, + IN CONST CHAR8 *Description + ) { - CHAR16 Buffer[0x100]; - - // - // Check to see if STDERR is avilable - // - if (gST->StdErr == NULL) { - return; - } + CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; // // Generate the ASSERT() message in Unicode format // - UnicodeSPrint (Buffer, sizeof (Buffer), (CHAR16 *)L"ASSERT %s(%d): %s\n", FileName, LineNumber, Description); + UnicodeSPrintAsciiFormat (Buffer, sizeof (Buffer), "ASSERT %s(%d): %s\n", FileName, LineNumber, Description); // - // Send the print string to the Standard Error device + // Send the print string to the Standard Error device if STDERR is available. // - gST->StdErr->OutputString (gST->StdErr, Buffer); + if (gST->StdErr != NULL) { + gST->StdErr->OutputString (gST->StdErr, Buffer); + } // - // Put break point in module that contained the error. + // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings // - CpuBreakpoint (); + if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) { + CpuBreakpoint (); + } else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) { + CpuDeadLoop (); + } } + /** + Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer. This function fills Length bytes of Buffer with the value specified by @@ -200,8 +191,8 @@ Returns: If Length is greater than (MAX_ADDRESS – Buffer + 1), then ASSERT(). - @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue. - @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. + @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue. + @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. @return Buffer @@ -213,11 +204,29 @@ DebugClearMemory ( IN UINTN Length ) { -// SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue)); - SetMem (Buffer, Length, 0xAF); - return Buffer; + // + // If Buffer is NULL, then ASSERT(). + // + ASSERT (Buffer != NULL); + + // + // SetMem() checks for the the ASSERT() condition on Length and returns Buffer + // + return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue)); } + +/** + + Returns TRUE if ASSERT() macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugAssertEnabled ( @@ -227,6 +236,18 @@ DebugAssertEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG()macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugPrintEnabled ( @@ -236,6 +257,18 @@ DebugPrintEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG_CODE()macros are enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugCodeEnabled ( @@ -245,6 +278,18 @@ DebugCodeEnabled ( return ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0); } + +/** + + Returns TRUE if DEBUG_CLEAR_MEMORY()macro is enabled. + + This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of + PcdDebugProperyMask is set. Otherwise FALSE is returned. + + @retval TRUE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + +**/ BOOLEAN EFIAPI DebugClearMemoryEnabled ( diff --git a/EdkModulePkg/Library/EdkUefiDebugLibStdErr/EdkUefiDebugLibStdErr.msa b/EdkModulePkg/Library/EdkUefiDebugLibStdErr/EdkUefiDebugLibStdErr.msa index 327e12621f..2ab58bbbd9 100644 --- a/EdkModulePkg/Library/EdkUefiDebugLibStdErr/EdkUefiDebugLibStdErr.msa +++ b/EdkModulePkg/Library/EdkUefiDebugLibStdErr/EdkUefiDebugLibStdErr.msa @@ -19,7 +19,7 @@ IA32 X64 IPF EBC false - EdkUefiDebugLibStdErr + EdkUefiDebugLibConOut @@ -53,6 +53,11 @@ DebugLevel + + + StatusCodeDataTypeDebug + + EFI_SPECIFICATION_VERSION 0x00020000 EDK_RELEASE_VERSION 0x00090000 @@ -66,6 +71,11 @@ gEfiMdePkgTokenSpaceGuid
+ + PcdDebugClearMemoryValue + FIX_ME_PcdDebugClearMemoryValue + + PcdDebugPrintErrorLevel gEfiMdePkgTokenSpaceGuid -- cgit v1.2.3