mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/PeiDxeDebugLibReportStatusCode: Add new APIs
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1395 Add new APIs' implementation (DebugVPrint, DebugBPrint) in the DebugLib instance. These APIs would expose print routines with VaList parameter and BaseList parameter. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Zhichao Gao <zhichao.gao@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Hao Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Sean Brogan <sean.brogan@microsoft.com> Cc: Michael Turner <Michael.Turner@microsoft.com> Cc: Bret Barkelew <Bret.Barkelew@microsoft.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
parent
9fb1f7efc9
commit
bd68cddc6b
|
@ -4,7 +4,7 @@
|
||||||
Note that if the debug message length is larger than the maximum allowable
|
Note that if the debug message length is larger than the maximum allowable
|
||||||
record length, then the debug message will be ignored directly.
|
record length, then the debug message will be ignored directly.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -27,6 +27,12 @@
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/DebugPrintErrorLevelLib.h>
|
#include <Library/DebugPrintErrorLevelLib.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// VA_LIST can not initialize to NULL for all compiler, so we use this to
|
||||||
|
// indicate a null VA_LIST
|
||||||
|
//
|
||||||
|
VA_LIST mVaListNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Prints a debug message to the debug output device if the specified error level is enabled.
|
Prints a debug message to the debug output device if the specified error level is enabled.
|
||||||
|
|
||||||
|
@ -52,12 +58,48 @@ DebugPrint (
|
||||||
IN CONST CHAR8 *Format,
|
IN CONST CHAR8 *Format,
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
|
{
|
||||||
|
VA_LIST Marker;
|
||||||
|
|
||||||
|
VA_START (Marker, Format);
|
||||||
|
DebugVPrint (ErrorLevel, Format, Marker);
|
||||||
|
VA_END (Marker);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Prints a debug message to the debug output device if the specified
|
||||||
|
error level is enabled base on Null-terminated format string and a
|
||||||
|
VA_LIST argument list or a BASE_LIST argument list.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Only one list type is used.
|
||||||
|
If BaseListMarker == NULL, then use VaListMarker.
|
||||||
|
Otherwise use BaseListMarker and the VaListMarker should be initilized as
|
||||||
|
mVaListNull.
|
||||||
|
|
||||||
|
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 VaListMarker VA_LIST marker for the variable argument list.
|
||||||
|
@param BaseListMarker BASE_LIST marker for the variable argument list.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
DebugPrintMarker (
|
||||||
|
IN UINTN ErrorLevel,
|
||||||
|
IN CONST CHAR8 *Format,
|
||||||
|
IN VA_LIST VaListMarker,
|
||||||
|
IN BASE_LIST BaseListMarker
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UINT64 Buffer[(EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)) + 1];
|
UINT64 Buffer[(EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)) + 1];
|
||||||
EFI_DEBUG_INFO *DebugInfo;
|
EFI_DEBUG_INFO *DebugInfo;
|
||||||
UINTN TotalSize;
|
UINTN TotalSize;
|
||||||
VA_LIST VaListMarker;
|
BASE_LIST BaseListMarkerPointer;
|
||||||
BASE_LIST BaseListMarker;
|
|
||||||
CHAR8 *FormatString;
|
CHAR8 *FormatString;
|
||||||
BOOLEAN Long;
|
BOOLEAN Long;
|
||||||
|
|
||||||
|
@ -78,22 +120,22 @@ DebugPrint (
|
||||||
// Note that the passing-in format string and variable parameters will be constructed to
|
// Note that the passing-in format string and variable parameters will be constructed to
|
||||||
// the following layout:
|
// the following layout:
|
||||||
//
|
//
|
||||||
// Buffer->|------------------------|
|
// Buffer->|------------------------|
|
||||||
// | Padding | 4 bytes
|
// | Padding | 4 bytes
|
||||||
// DebugInfo->|------------------------|
|
// DebugInfo->|------------------------|
|
||||||
// | EFI_DEBUG_INFO | sizeof(EFI_DEBUG_INFO)
|
// | EFI_DEBUG_INFO | sizeof(EFI_DEBUG_INFO)
|
||||||
// BaseListMarker->|------------------------|
|
// BaseListMarkerPointer->|------------------------|
|
||||||
// | ... |
|
// | ... |
|
||||||
// | variable arguments | 12 * sizeof (UINT64)
|
// | variable arguments | 12 * sizeof (UINT64)
|
||||||
// | ... |
|
// | ... |
|
||||||
// |------------------------|
|
// |------------------------|
|
||||||
// | Format String |
|
// | Format String |
|
||||||
// |------------------------|<- (UINT8 *)Buffer + sizeof(Buffer)
|
// |------------------------|<- (UINT8 *)Buffer + sizeof(Buffer)
|
||||||
//
|
//
|
||||||
TotalSize = 4 + sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrSize (Format);
|
TotalSize = 4 + sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrSize (Format);
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the TotalSize is larger than the maximum record size, then return
|
// If the TotalSize is larger than the maximum record size, then truncate it.
|
||||||
//
|
//
|
||||||
if (TotalSize > sizeof (Buffer)) {
|
if (TotalSize > sizeof (Buffer)) {
|
||||||
TotalSize = sizeof (Buffer);
|
TotalSize = sizeof (Buffer);
|
||||||
|
@ -102,14 +144,14 @@ DebugPrint (
|
||||||
//
|
//
|
||||||
// Fill in EFI_DEBUG_INFO
|
// Fill in EFI_DEBUG_INFO
|
||||||
//
|
//
|
||||||
// Here we skip the first 4 bytes of Buffer, because we must ensure BaseListMarker is
|
// Here we skip the first 4 bytes of Buffer, because we must ensure BaseListMarkerPointer is
|
||||||
// 64-bit aligned, otherwise retrieving 64-bit parameter from BaseListMarker will cause
|
// 64-bit aligned, otherwise retrieving 64-bit parameter from BaseListMarkerPointer will cause
|
||||||
// exception on IPF. Buffer starts at 64-bit aligned address, so skipping 4 types (sizeof(EFI_DEBUG_INFO))
|
// exception on IPF. Buffer starts at 64-bit aligned address, so skipping 4 types (sizeof(EFI_DEBUG_INFO))
|
||||||
// just makes address of BaseListMarker, which follows DebugInfo, 64-bit aligned.
|
// just makes address of BaseListMarkerPointer, which follows DebugInfo, 64-bit aligned.
|
||||||
//
|
//
|
||||||
DebugInfo = (EFI_DEBUG_INFO *)(Buffer) + 1;
|
DebugInfo = (EFI_DEBUG_INFO *)(Buffer) + 1;
|
||||||
DebugInfo->ErrorLevel = (UINT32)ErrorLevel;
|
DebugInfo->ErrorLevel = (UINT32)ErrorLevel;
|
||||||
BaseListMarker = (BASE_LIST)(DebugInfo + 1);
|
BaseListMarkerPointer = (BASE_LIST)(DebugInfo + 1);
|
||||||
FormatString = (CHAR8 *)((UINT64 *)(DebugInfo + 1) + 12);
|
FormatString = (CHAR8 *)((UINT64 *)(DebugInfo + 1) + 12);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -125,7 +167,6 @@ DebugPrint (
|
||||||
// of format in DEBUG string, which is followed by the DEBUG format string.
|
// of format in DEBUG string, which is followed by the DEBUG format string.
|
||||||
// Here we will process the variable arguments and pack them in this area.
|
// Here we will process the variable arguments and pack them in this area.
|
||||||
//
|
//
|
||||||
VA_START (VaListMarker, Format);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Use the actual format string.
|
// Use the actual format string.
|
||||||
|
@ -167,7 +208,11 @@ DebugPrint (
|
||||||
// '*' in format field means the precision of the field is specified by
|
// '*' in format field means the precision of the field is specified by
|
||||||
// a UINTN argument in the argument list.
|
// a UINTN argument in the argument list.
|
||||||
//
|
//
|
||||||
BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);
|
if (BaseListMarker == NULL) {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, UINTN) = VA_ARG (VaListMarker, UINTN);
|
||||||
|
} else {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, UINTN) = BASE_ARG (BaseListMarker, UINTN);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (*Format == '\0') {
|
if (*Format == '\0') {
|
||||||
|
@ -192,16 +237,36 @@ DebugPrint (
|
||||||
}
|
}
|
||||||
if (*Format == 'p' || *Format == 'X' || *Format == 'x' || *Format == 'd' || *Format == 'u') {
|
if (*Format == 'p' || *Format == 'X' || *Format == 'x' || *Format == 'd' || *Format == 'u') {
|
||||||
if (Long) {
|
if (Long) {
|
||||||
BASE_ARG (BaseListMarker, INT64) = VA_ARG (VaListMarker, INT64);
|
if (BaseListMarker == NULL) {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, INT64) = VA_ARG (VaListMarker, INT64);
|
||||||
|
} else {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, INT64) = BASE_ARG (BaseListMarker, INT64);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
BASE_ARG (BaseListMarker, int) = VA_ARG (VaListMarker, int);
|
if (BaseListMarker == NULL) {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, int) = VA_ARG (VaListMarker, int);
|
||||||
|
} else {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, int) = BASE_ARG (BaseListMarker, int);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (*Format == 's' || *Format == 'S' || *Format == 'a' || *Format == 'g' || *Format == 't') {
|
} else if (*Format == 's' || *Format == 'S' || *Format == 'a' || *Format == 'g' || *Format == 't') {
|
||||||
BASE_ARG (BaseListMarker, VOID *) = VA_ARG (VaListMarker, VOID *);
|
if (BaseListMarker == NULL) {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, VOID *) = VA_ARG (VaListMarker, VOID *);
|
||||||
|
} else {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, VOID *) = BASE_ARG (BaseListMarker, VOID *);
|
||||||
|
}
|
||||||
} else if (*Format == 'c') {
|
} else if (*Format == 'c') {
|
||||||
BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);
|
if (BaseListMarker == NULL) {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, UINTN) = VA_ARG (VaListMarker, UINTN);
|
||||||
|
} else {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, UINTN) = BASE_ARG (BaseListMarker, UINTN);
|
||||||
|
}
|
||||||
} else if (*Format == 'r') {
|
} else if (*Format == 'r') {
|
||||||
BASE_ARG (BaseListMarker, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS);
|
if (BaseListMarker == NULL) {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS);
|
||||||
|
} else {
|
||||||
|
BASE_ARG (BaseListMarkerPointer, RETURN_STATUS) = BASE_ARG (BaseListMarker, RETURN_STATUS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -209,17 +274,15 @@ DebugPrint (
|
||||||
// This indicates that the DEBUG() macro is passing in more argument than can be handled by
|
// This indicates that the DEBUG() macro is passing in more argument than can be handled by
|
||||||
// the EFI_DEBUG_INFO record
|
// the EFI_DEBUG_INFO record
|
||||||
//
|
//
|
||||||
ASSERT ((CHAR8 *)BaseListMarker <= FormatString);
|
ASSERT ((CHAR8 *)BaseListMarkerPointer <= FormatString);
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) allocated bytes, then return
|
// If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) allocated bytes, then return
|
||||||
//
|
//
|
||||||
if ((CHAR8 *)BaseListMarker > FormatString) {
|
if ((CHAR8 *)BaseListMarkerPointer > FormatString) {
|
||||||
VA_END (VaListMarker);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VA_END (VaListMarker);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Send the DebugInfo record
|
// Send the DebugInfo record
|
||||||
|
@ -235,6 +298,60 @@ DebugPrint (
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 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 VaListMarker VA_LIST marker for the variable argument list.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
DebugVPrint (
|
||||||
|
IN UINTN ErrorLevel,
|
||||||
|
IN CONST CHAR8 *Format,
|
||||||
|
IN VA_LIST VaListMarker
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DebugPrintMarker (ErrorLevel, Format, VaListMarker, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Prints a debug message to the debug output device if the specified
|
||||||
|
error level is enabled.
|
||||||
|
This function use BASE_LIST which would provide a more compatible
|
||||||
|
service than VA_LIST.
|
||||||
|
|
||||||
|
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 BaseListMarker BASE_LIST marker for the variable argument list.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
DebugBPrint (
|
||||||
|
IN UINTN ErrorLevel,
|
||||||
|
IN CONST CHAR8 *Format,
|
||||||
|
IN BASE_LIST BaseListMarker
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DebugPrintMarker (ErrorLevel, Format, mVaListNull, BaseListMarker);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Prints an assert message containing a filename, line number, and description.
|
Prints an assert message containing a filename, line number, and description.
|
||||||
This may be followed by a breakpoint or a dead loop.
|
This may be followed by a breakpoint or a dead loop.
|
||||||
|
|
Loading…
Reference in New Issue