+++ /dev/null
-/** @file\r
-\r
- Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include <Base.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/SerialPortLib.h>\r
-#include <Library/DebugDeviceLib.h>\r
-#include <Library/DebugPrintErrorLevelLib.h>\r
-\r
-//\r
-// Define the maximum debug and assert message length that this library supports\r
-//\r
-#define MAX_DEBUG_MESSAGE_LENGTH 0x100\r
-\r
-CONST CHAR8 *mHexTable = "0123456789ABCDEF";\r
-\r
-//\r
-// VA_LIST can not initialize to NULL for all compiler, so we use this to\r
-// indicate a null VA_LIST\r
-//\r
-VA_LIST mVaListNull;\r
-\r
-/**\r
- Get stack frame pointer of function call.\r
-\r
- @return StackFramePointer stack frame pointer of function call.\r
-**/\r
-UINT32 *\r
-EFIAPI\r
-GetStackFramePointer (\r
- VOID\r
- );\r
-\r
-\r
-/**\r
- Prints a debug message to the debug output device if the specified error level is enabled.\r
-\r
- If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function\r
- GetDebugPrintErrorLevel (), then print the message specified by Format and the\r
- associated variable argument list to the debug output device.\r
-\r
- If Format is NULL, then ASSERT().\r
-\r
- @param ErrorLevel The error level of the debug message.\r
- @param Format Format string for the debug message to print.\r
- @param ... Variable argument list whose contents are accessed\r
- based on the format string specified by Format.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DebugPrint (\r
- IN UINTN ErrorLevel,\r
- IN CONST CHAR8 *Format,\r
- ...\r
- )\r
-{\r
- VA_LIST Marker;\r
-\r
- VA_START (Marker, Format);\r
- DebugVPrint (ErrorLevel, Format, Marker);\r
- VA_END (Marker);\r
-}\r
-\r
-/**\r
- Prints a debug message to the debug output device if the specified\r
- error level is enabled base on Null-terminated format string and a\r
- VA_LIST argument list or a BASE_LIST argument list.\r
-\r
- If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function\r
- GetDebugPrintErrorLevel (), then print the message specified by Format and\r
- the associated variable argument list to the debug output device.\r
-\r
- If Format is NULL, then ASSERT().\r
-\r
- @param ErrorLevel The error level of the debug message.\r
- @param Format Format string for the debug message to print.\r
- @param VaListMarker VA_LIST marker for the variable argument list.\r
- @param BaseListMarker BASE_LIST marker for the variable argument list.\r
-\r
-**/\r
-VOID\r
-DebugPrintMarker (\r
- IN UINTN ErrorLevel,\r
- IN CONST CHAR8 *Format,\r
- IN VA_LIST VaListMarker,\r
- IN BASE_LIST BaseListMarker\r
- )\r
-{\r
- CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];\r
-\r
- //\r
- // If Format is NULL, then ASSERT().\r
- //\r
- if (!GetDebugPrintDeviceEnable ()) {\r
- return;\r
- }\r
-\r
- //\r
- // Check driver debug mask value and global mask\r
- //\r
- if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) {\r
- return;\r
- }\r
-\r
- //\r
- // If Format is NULL, then ASSERT().\r
- //\r
- ASSERT (Format != NULL);\r
-\r
- //\r
- // Convert the DEBUG() message to an ASCII String\r
- //\r
- if (BaseListMarker == NULL) {\r
- AsciiVSPrint (Buffer, sizeof (Buffer), Format, VaListMarker);\r
- } else {\r
- AsciiBSPrint (Buffer, sizeof (Buffer), Format, BaseListMarker);\r
- }\r
-\r
- //\r
- // Send the print string to a Serial Port\r
- //\r
- SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer));\r
-}\r
-\r
-/**\r
- Prints a debug message to the debug output device if the specified\r
- error level is enabled.\r
-\r
- If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function\r
- GetDebugPrintErrorLevel (), then print the message specified by Format and\r
- the associated variable argument list to the debug output device.\r
-\r
- If Format is NULL, then ASSERT().\r
-\r
- @param ErrorLevel The error level of the debug message.\r
- @param Format Format string for the debug message to print.\r
- @param VaListMarker VA_LIST marker for the variable argument list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DebugVPrint (\r
- IN UINTN ErrorLevel,\r
- IN CONST CHAR8 *Format,\r
- IN VA_LIST VaListMarker\r
- )\r
-{\r
- DebugPrintMarker (ErrorLevel, Format, VaListMarker, NULL);\r
-}\r
-\r
-/**\r
- Prints a debug message to the debug output device if the specified\r
- error level is enabled.\r
- This function use BASE_LIST which would provide a more compatible\r
- service than VA_LIST.\r
-\r
- If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function\r
- GetDebugPrintErrorLevel (), then print the message specified by Format and\r
- the associated variable argument list to the debug output device.\r
-\r
- If Format is NULL, then ASSERT().\r
-\r
- @param ErrorLevel The error level of the debug message.\r
- @param Format Format string for the debug message to print.\r
- @param BaseListMarker BASE_LIST marker for the variable argument list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DebugBPrint (\r
- IN UINTN ErrorLevel,\r
- IN CONST CHAR8 *Format,\r
- IN BASE_LIST BaseListMarker\r
- )\r
-{\r
- DebugPrintMarker (ErrorLevel, Format, mVaListNull, BaseListMarker);\r
-}\r
-\r
-/**\r
- Convert an UINT32 value into HEX string sepcified by Buffer.\r
-\r
- @param Value The HEX value to convert to string\r
- @param Buffer The pointer to the target buffer to be filled with HEX string\r
-\r
-**/\r
-VOID\r
-FillHex (\r
- UINT32 Value,\r
- CHAR8 *Buffer\r
- )\r
-{\r
- INTN Idx;\r
- for (Idx = 7; Idx >= 0; Idx--) {\r
- Buffer[Idx] = mHexTable[Value & 0x0F];\r
- Value >>= 4;\r
- }\r
-}\r
-\r
-/**\r
- Prints an assert message containing a filename, line number, and description.\r
- This may be followed by a breakpoint or a dead loop.\r
-\r
- Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"\r
- to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of\r
- PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if\r
- DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then\r
- CpuDeadLoop() is called. If neither of these bits are set, then this function\r
- returns immediately after the message is printed to the debug output device.\r
- DebugAssert() must actively prevent recursion. If DebugAssert() is called while\r
- processing another DebugAssert(), then DebugAssert() must return immediately.\r
-\r
- If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.\r
- If Description is NULL, then a <Description> string of "(NULL) Description" is printed.\r
-\r
-**/\r
-VOID\r
-DebugAssertInternal (\r
- VOID\r
- )\r
-{\r
- CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];\r
- UINT32 *Frame;\r
-\r
- Frame = (UINT32 *)GetStackFramePointer ();\r
-\r
- //\r
- // Generate the ASSERT() message in Ascii format\r
- //\r
- AsciiStrnCpyS (\r
- Buffer,\r
- sizeof(Buffer) / sizeof(CHAR8),\r
- "-> EBP:0x00000000 EIP:0x00000000\n",\r
- sizeof(Buffer) / sizeof(CHAR8) - 1\r
- );\r
- SerialPortWrite ((UINT8 *)"ASSERT DUMP:\n", 13);\r
- while (Frame != NULL) {\r
- FillHex ((UINT32)Frame, Buffer + 9);\r
- FillHex (Frame[1], Buffer + 9 + 8 + 8);\r
- SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer));\r
- if ((Frame[0] > (UINT32)Frame) && (Frame[0] < (UINT32)Frame + 0x00100000)) {\r
- Frame = (UINT32 *)Frame[0];\r
- } else {\r
- Frame = NULL;\r
- }\r
- }\r
-\r
- //\r
- // Dead loop\r
- //\r
- CpuDeadLoop ();\r
-}\r
-\r
-/**\r
- Prints an assert message containing a filename, line number, and description.\r
- This may be followed by a breakpoint or a dead loop.\r
-\r
- Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"\r
- to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of\r
- PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if\r
- DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then\r
- CpuDeadLoop() is called. If neither of these bits are set, then this function\r
- returns immediately after the message is printed to the debug output device.\r
- DebugAssert() must actively prevent recursion. If DebugAssert() is called while\r
- processing another DebugAssert(), then DebugAssert() must return immediately.\r
-\r
- If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.\r
- If Description is NULL, then a <Description> string of "(NULL) Description" is printed.\r
-\r
- @param FileName The pointer to the name of the source file that generated the assert condition.\r
- @param LineNumber The line number in the source file that generated the assert condition\r
- @param Description The pointer to the description of the assert condition.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DebugAssert (\r
- IN CONST CHAR8 *FileName,\r
- IN UINTN LineNumber,\r
- IN CONST CHAR8 *Description\r
- )\r
-{\r
- DebugAssertInternal ();\r
-}\r
-\r
-\r
-/**\r
- Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer.\r
-\r
- This function fills Length bytes of Buffer with the value specified by\r
- PcdDebugClearMemoryValue, and returns Buffer.\r
-\r
- If Buffer is NULL, then ASSERT().\r
- If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
-\r
- @param Buffer The pointer to the target buffer to be filled with PcdDebugClearMemoryValue.\r
- @param Length The number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue.\r
-\r
- @return Buffer The pointer to the target buffer filled with PcdDebugClearMemoryValue.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-DebugClearMemory (\r
- OUT VOID *Buffer,\r
- IN UINTN Length\r
- )\r
-{\r
- return Buffer;\r
-}\r
-\r
-\r
-/**\r
- Returns TRUE if ASSERT() macros are enabled.\r
-\r
- This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of\r
- PcdDebugProperyMask is set. Otherwise FALSE is returned.\r
-\r
- @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set.\r
- @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-DebugAssertEnabled (\r
- VOID\r
- )\r
-{\r
- return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);\r
-}\r
-\r
-\r
-/**\r
- Returns TRUE if DEBUG() macros are enabled.\r
-\r
- This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of\r
- PcdDebugProperyMask is set. Otherwise FALSE is returned.\r
-\r
- @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set.\r
- @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-DebugPrintEnabled (\r
- VOID\r
- )\r
-{\r
- return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);\r
-}\r
-\r
-/**\r
- Returns TRUE if DEBUG_CODE() macros are enabled.\r
-\r
- This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of\r
- PcdDebugProperyMask is set. Otherwise FALSE is returned.\r
-\r
- @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set.\r
- @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-DebugCodeEnabled (\r
- VOID\r
- )\r
-{\r
- return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);\r
-}\r
-\r
-\r
-/**\r
- Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled.\r
-\r
- This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of\r
- PcdDebugProperyMask is set. Otherwise FALSE is returned.\r
-\r
- @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set.\r
- @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-DebugClearMemoryEnabled (\r
- VOID\r
- )\r
-{\r
- return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);\r
-}\r
-\r
-/**\r
- Returns TRUE if any one of the bit is set both in ErrorLevel and PcdFixedDebugPrintErrorLevel.\r
-\r
- This function compares the bit mask of ErrorLevel and PcdFixedDebugPrintErrorLevel.\r
-\r
- @retval TRUE Current ErrorLevel is supported.\r
- @retval FALSE Current ErrorLevel is not supported.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-DebugPrintLevelEnabled (\r
- IN CONST UINTN ErrorLevel\r
- )\r
-{\r
- return (BOOLEAN) ((ErrorLevel & PcdGet32(PcdFixedDebugPrintErrorLevel)) != 0);\r
-}\r