summaryrefslogtreecommitdiff
path: root/EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c
diff options
context:
space:
mode:
Diffstat (limited to 'EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c')
-rw-r--r--EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c344
1 files changed, 183 insertions, 161 deletions
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,177 +1,100 @@
-/*++
+/** @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<BR>
+ 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
//
if (mDebugLevelInstalled) {
@@ -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 <FileName>(<LineNumber>): <Description>\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 <FileName> string of "(NULL) Filename" is printed.
- ... - Print arguments.
+ If Description is NULL, then a <Description> 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);
}
-