X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FInclude%2FLibrary%2FDebugLib.h;h=88b65493597e05becc491cab6ad059cd8e8d5ac3;hb=6e6f5e030b84ee8aff7c2e7d11e6f0ae3657879f;hp=0c07aab5fb58f3ca87a9daf8269779cbc8ea59fd;hpb=3e5c323866e6f424f15ab7f59595d8929846354e;p=mirror_edk2.git diff --git a/MdePkg/Include/Library/DebugLib.h b/MdePkg/Include/Library/DebugLib.h index 0c07aab5fb..88b6549359 100644 --- a/MdePkg/Include/Library/DebugLib.h +++ b/MdePkg/Include/Library/DebugLib.h @@ -3,12 +3,16 @@ The Debug library supports debug print and asserts based on a combination of macros and code. The debug library can be turned on and off so that the debug code does not increase the size of an image. - -Copyright (c) 2006 - 2008, 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 + + Note that a reserved macro named MDEPKG_NDEBUG is introduced for the intention + of size reduction when compiler optimization is disabled. If MDEPKG_NDEBUG is + defined, then debug and assert related macros wrapped by it are the NULL implementations. + +Copyright (c) 2006 - 2015, 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 that 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. @@ -37,8 +41,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define DEBUG_FS 0x00000008 // EFI File system #define DEBUG_POOL 0x00000010 // Alloc & Free's #define DEBUG_PAGE 0x00000020 // Alloc & Free's -#define DEBUG_INFO 0x00000040 // Verbose -#define DEBUG_DISPATCH 0x00000080 // PEI/DXE Dispatchers +#define DEBUG_INFO 0x00000040 // Informational debug messages +#define DEBUG_DISPATCH 0x00000080 // PEI/DXE/SMM Dispatchers #define DEBUG_VARIABLE 0x00000100 // Variable #define DEBUG_BM 0x00000400 // Boot Manager #define DEBUG_BLKIO 0x00001000 // BlkIo Driver @@ -46,6 +50,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define DEBUG_UNDI 0x00010000 // UNDI Driver #define DEBUG_LOADFILE 0x00020000 // UNDI Driver #define DEBUG_EVENT 0x00080000 // Event messages +#define DEBUG_GCD 0x00100000 // Global Coherency Database changes +#define DEBUG_CACHE 0x00200000 // Memory range cachability changes +#define DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may significantly impact boot performance #define DEBUG_ERROR 0x80000000 // Error // @@ -66,20 +73,21 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define EFI_D_UNDI DEBUG_UNDI #define EFI_D_LOADFILE DEBUG_LOADFILE #define EFI_D_EVENT DEBUG_EVENT +#define EFI_D_VERBOSE DEBUG_VERBOSE #define EFI_D_ERROR DEBUG_ERROR /** Prints a debug message to the debug output device if the specified error level is enabled. - 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. + If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function + GetDebugPrintErrorLevel (), then print the message specified by Format and the + associated variable argument list to the debug output device. If Format is NULL, then ASSERT(). @param ErrorLevel The error level of the debug message. - @param Format Format string for the debug message to print. - @param ... Variable argument list whose contents are accessed + @param Format The format string for the debug message to print. + @param ... The variable argument list whose contents are accessed based on the format string specified by Format. **/ @@ -108,9 +116,9 @@ DebugPrint ( If FileName is NULL, then a string of "(NULL) Filename" is printed. If Description is NULL, then a string of "(NULL) Description" is printed. - @param FileName Pointer to the name of the source file that generated the assert condition. + @param FileName The 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. + @param Description The pointer to the description of the assert condition. **/ VOID @@ -129,12 +137,12 @@ DebugAssert ( PcdDebugClearMemoryValue, and returns Buffer. If Buffer is NULL, then ASSERT(). - If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). - @param Buffer Pointer to the target buffer to be filled with PcdDebugClearMemoryValue. - @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. + @param Buffer The pointer to the target buffer to be filled with PcdDebugClearMemoryValue. + @param Length The number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. - @return Buffer Pointer to the target buffer filled with PcdDebugClearMemoryValue. + @return Buffer The pointer to the target buffer filled with PcdDebugClearMemoryValue. **/ VOID * @@ -149,7 +157,7 @@ DebugClearMemory ( 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. + 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. @@ -166,7 +174,7 @@ DebugAssertEnabled ( 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. + 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. @@ -183,7 +191,7 @@ DebugPrintEnabled ( 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. + 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. @@ -200,7 +208,7 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugProperyMask is set. Otherwise, FALSE is returned. @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. @@ -212,14 +220,28 @@ DebugClearMemoryEnabled ( VOID ); +/** + Returns TRUE if any one of the bit is set both in ErrorLevel and PcdFixedDebugPrintErrorLevel. + + This function compares the bit mask of ErrorLevel and PcdFixedDebugPrintErrorLevel. + + @retval TRUE Current ErrorLevel is supported. + @retval FALSE Current ErrorLevel is not supported. + +**/ +BOOLEAN +EFIAPI +DebugPrintLevelEnabled ( + IN CONST UINTN ErrorLevel + ); /** Internal worker macro that calls DebugAssert(). - This macro calls DebugAssert() passing in the filename, line number, and - expression that evailated to FALSE. + This macro calls DebugAssert(), passing in the filename, line number, and an + expression that evaluated to FALSE. - @param Expression Boolean expression that evailated to FALSE + @param Expression Boolean expression that evaluated to FALSE **/ #define _ASSERT(Expression) DebugAssert (__FILE__, __LINE__, #Expression) @@ -230,82 +252,106 @@ DebugClearMemoryEnabled ( This macro calls DebugPrint() passing in the debug error level, a format string, and a variable argument list. + __VA_ARGS__ is not supported by ECB compiler, Microsoft Visual Studio .NET 2003 + and Microsoft Windows Server 2003 Driver Development Kit (Microsoft WINDDK) version 3790.1830. @param Expression Expression containing an error level, a format string, and a variable argument list based on the format string. **/ -#define _DEBUG(Expression) DebugPrint Expression +#if !defined(MDE_CPU_EBC) && (!defined (_MSC_VER) || _MSC_VER >= 1400) + #define _DEBUG_PRINT(PrintLevel, ...) \ + do { \ + if (DebugPrintLevelEnabled (PrintLevel)) { \ + DebugPrint (PrintLevel, ##__VA_ARGS__); \ + } \ + } while (FALSE) + #define _DEBUG(Expression) _DEBUG_PRINT Expression +#else +#define _DEBUG(Expression) DebugPrint Expression +#endif /** - Macro that calls DebugAssert() if a expression evaluates to FALSE. + Macro that calls DebugAssert() if an expression evaluates to FALSE. - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, - then this macro evaluates the Boolean expression specified by Expression. If - Expression evaluates to FALSE, then DebugAssert() is called passing in the - source filename, source line number, and Expression. + If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED + bit of PcdDebugProperyMask is set, then this macro evaluates the Boolean + expression specified by Expression. If Expression evaluates to FALSE, then + DebugAssert() is called passing in the source filename, source line number, + and Expression. - @param Expression Boolean expression + @param Expression Boolean expression. **/ -#define ASSERT(Expression) \ - do { \ - if (DebugAssertEnabled ()) { \ - if (!(Expression)) { \ - _ASSERT (Expression); \ - } \ - } \ - } while (FALSE) - +#if !defined(MDEPKG_NDEBUG) + #define ASSERT(Expression) \ + do { \ + if (DebugAssertEnabled ()) { \ + if (!(Expression)) { \ + _ASSERT (Expression); \ + } \ + } \ + } while (FALSE) +#else + #define ASSERT(Expression) +#endif /** Macro that calls DebugPrint(). - If the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set, - then this macro passes Expression to DebugPrint(). + If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED + bit of PcdDebugProperyMask is set, then this macro passes Expression to + DebugPrint(). @param Expression Expression containing an error level, a format string, and a variable argument list based on the format string. **/ -#define DEBUG(Expression) \ - do { \ - if (DebugPrintEnabled ()) { \ - _DEBUG (Expression); \ - } \ - } while (FALSE) - +#if !defined(MDEPKG_NDEBUG) + #define DEBUG(Expression) \ + do { \ + if (DebugPrintEnabled ()) { \ + _DEBUG (Expression); \ + } \ + } while (FALSE) +#else + #define DEBUG(Expression) +#endif /** Macro that calls DebugAssert() if an EFI_STATUS evaluates to an error code. - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, - then this macro evaluates the EFI_STATUS value specified by StatusParameter. - If StatusParameter is an error code, then DebugAssert() is called passing in - the source filename, source line number, and StatusParameter. + If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED + bit of PcdDebugProperyMask is set, then this macro evaluates the EFI_STATUS + value specified by StatusParameter. If StatusParameter is an error code, + then DebugAssert() is called passing in the source filename, source line + number, and StatusParameter. @param StatusParameter EFI_STATUS value to evaluate. **/ -#define ASSERT_EFI_ERROR(StatusParameter) \ - do { \ - if (DebugAssertEnabled ()) { \ - if (EFI_ERROR (StatusParameter)) { \ - DEBUG ((EFI_D_ERROR, "\nASSERT_EFI_ERROR (Status = %r)\n", StatusParameter)); \ - _ASSERT (!EFI_ERROR (StatusParameter)); \ - } \ - } \ - } while (FALSE) - +#if !defined(MDEPKG_NDEBUG) + #define ASSERT_EFI_ERROR(StatusParameter) \ + do { \ + if (DebugAssertEnabled ()) { \ + if (EFI_ERROR (StatusParameter)) { \ + DEBUG ((EFI_D_ERROR, "\nASSERT_EFI_ERROR (Status = %r)\n", StatusParameter)); \ + _ASSERT (!EFI_ERROR (StatusParameter)); \ + } \ + } \ + } while (FALSE) +#else + #define ASSERT_EFI_ERROR(StatusParameter) +#endif /** Macro that calls DebugAssert() if a protocol is already installed in the handle database. - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear, - then return. + If MDEPKG_NDEBUG is defined or the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit + of PcdDebugProperyMask is clear, then return. If Handle is NULL, then a check is made to see if the protocol specified by Guid is present on any handle in the handle database. If Handle is not NULL, then @@ -319,26 +365,29 @@ DebugClearMemoryEnabled ( parameter that may be NULL. If it is NULL, then the entire handle database is searched. - @param Guid Pointer to a protocol GUID. + @param Guid The pointer to a protocol GUID. **/ -#define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) \ - do { \ - if (DebugAssertEnabled ()) { \ - VOID *Instance; \ - ASSERT (Guid != NULL); \ - if (Handle == NULL) { \ - if (!EFI_ERROR (gBS->LocateProtocol ((EFI_GUID *)Guid, NULL, &Instance))) { \ - _ASSERT (Guid already installed in database); \ - } \ - } else { \ - if (!EFI_ERROR (gBS->HandleProtocol (Handle, (EFI_GUID *)Guid, &Instance))) { \ - _ASSERT (Guid already installed on Handle); \ - } \ - } \ - } \ - } while (FALSE) - +#if !defined(MDEPKG_NDEBUG) + #define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) \ + do { \ + if (DebugAssertEnabled ()) { \ + VOID *Instance; \ + ASSERT (Guid != NULL); \ + if (Handle == NULL) { \ + if (!EFI_ERROR (gBS->LocateProtocol ((EFI_GUID *)Guid, NULL, &Instance))) { \ + _ASSERT (Guid already installed in database); \ + } \ + } else { \ + if (!EFI_ERROR (gBS->HandleProtocol (Handle, (EFI_GUID *)Guid, &Instance))) { \ + _ASSERT (Guid already installed on Handle); \ + } \ + } \ + } \ + } while (FALSE) +#else + #define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) +#endif /** Macro that marks the beginning of debug source code. @@ -353,7 +402,7 @@ DebugClearMemoryEnabled ( /** - Macro that marks the end of debug source code. + The macro that marks the end of debug source code. If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, then this macro marks the end of source code that is included in a module. @@ -365,7 +414,7 @@ DebugClearMemoryEnabled ( /** - Macro that declares a section of debug source code. + The macro that declares a section of debug source code. If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, then the source code specified by Expression is included in a module. @@ -379,12 +428,12 @@ DebugClearMemoryEnabled ( /** - Macro that calls DebugClearMemory() to clear a buffer to a default value. + The macro that calls DebugClearMemory() to clear a buffer to a default value. If the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set, then this macro calls DebugClearMemory() passing in Address and Length. - @param Address Pointer to a buffer. + @param Address The pointer to a buffer. @param Length The number of bytes in the buffer to set. **/ @@ -400,25 +449,25 @@ DebugClearMemoryEnabled ( Macro that calls DebugAssert() if the containing record does not have a matching signature. If the signatures matches, then a pointer to the data structure that contains a specified field of that data structure is returned. - This is a light weight method hide information by placing a public data + This is a lightweight method hide information by placing a public data structure inside a larger private data structure and using a pointer to the public data structure to retrieve a pointer to the private data structure. - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear, - then this macro computes the offset, in bytes, of field specified by Field - from the beginning of the data structure specified by TYPE. This offset is - subtracted from Record, and is used to return a pointer to a data structure - of the type specified by TYPE. - - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, - then this macro computes the offset, in bytes, of field specified by Field from - the beginning of the data structure specified by TYPE. This offset is - subtracted from Record, and is used to compute a pointer to a data structure of - the type specified by TYPE. The Signature field of the data structure specified - by TYPE is compared to TestSignature. If the signatures match, then a pointer - to the pointer to a data structure of the type specified by TYPE is returned. - If the signatures do not match, then DebugAssert() is called with a description - of "CR has a bad signature" and Record is returned. + If MDEPKG_NDEBUG is defined or the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit + of PcdDebugProperyMask is clear, then this macro computes the offset, in bytes, + of the field specified by Field from the beginning of the data structure specified + by TYPE. This offset is subtracted from Record, and is used to return a pointer + to a data structure of the type specified by TYPE. + + If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit + of PcdDebugProperyMask is set, then this macro computes the offset, in bytes, + of field specified by Field from the beginning of the data structure specified + by TYPE. This offset is subtracted from Record, and is used to compute a pointer + to a data structure of the type specified by TYPE. The Signature field of the + data structure specified by TYPE is compared to TestSignature. If the signatures + match, then a pointer to the pointer to a data structure of the type specified by + TYPE is returned. If the signatures do not match, then DebugAssert() is called + with a description of "CR has a bad signature" and Record is returned. If the data type specified by TYPE does not contain the field specified by Field, then the module will not compile. @@ -426,7 +475,7 @@ DebugClearMemoryEnabled ( If TYPE does not contain a field called Signature, then the module will not compile. - @param Record Pointer to the field specified by Field within a data + @param Record The pointer to the field specified by Field within a data structure of type TYPE. @param TYPE The name of the data structure type to return This @@ -438,9 +487,14 @@ DebugClearMemoryEnabled ( @param TestSignature The 32-bit signature value to match. **/ -#define CR(Record, TYPE, Field, TestSignature) \ - (DebugAssertEnabled () && (_CR (Record, TYPE, Field)->Signature != TestSignature)) ? \ - (TYPE *) (_ASSERT (CR has Bad Signature), Record) : \ - _CR (Record, TYPE, Field) +#if !defined(MDEPKG_NDEBUG) + #define CR(Record, TYPE, Field, TestSignature) \ + (DebugAssertEnabled () && (BASE_CR (Record, TYPE, Field)->Signature != TestSignature)) ? \ + (TYPE *) (_ASSERT (CR has Bad Signature), Record) : \ + BASE_CR (Record, TYPE, Field) +#else + #define CR(Record, TYPE, Field, TestSignature) \ + BASE_CR (Record, TYPE, Field) +#endif #endif