mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 11:13:53 +01:00 
			
		
		
		
	1) Move EFI_DEBUG_INFO structure to IntelFrameworkModule/Include/DebugInfo.h header file.
2) Move BaseReportStatusCodeLib, PeiDxeDebugLibReportStatusCode, DxeReportStatusCodeLibFramework,PeiReportStatusCodeLib to IntelFrameworkModulePkg git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3601 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									f22cf5f19a
								
							
						
					
					
						commit
						2287f237ee
					
				| @ -62,7 +62,7 @@ | ||||
|   PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf | ||||
|   BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf | ||||
|   MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf | ||||
|   ReportStatusCodeLib|IntelFrameworkPkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf | ||||
|   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf | ||||
| 
 | ||||
| [LibraryClasses.common.DXE_DRIVER] | ||||
|   HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf | ||||
| @ -76,7 +76,7 @@ | ||||
|   UefiLib|MdePkg/Library/UefiLib/UefiLib.inf | ||||
|   UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf | ||||
|   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf | ||||
|   ReportStatusCodeLib|IntelFrameworkPkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf | ||||
|   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf | ||||
|   HiiLibFramework|IntelFrameworkPkg/Library/HiiLibFramework/HiiLib.inf | ||||
|   IfrSupportLibFramework|IntelFrameworkPkg/Library/IfrSupportLibFramework/IfrSupportLib.inf | ||||
|   PciIncompatibleDeviceSupportLib|IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.inf | ||||
| @ -94,7 +94,7 @@ | ||||
|   UefiLib|MdePkg/Library/UefiLib/UefiLib.inf | ||||
|   UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf | ||||
|   UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf | ||||
|   ReportStatusCodeLib|IntelFrameworkPkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf | ||||
|   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf | ||||
|   HiiLibFramework|IntelFrameworkPkg/Library/HiiLibFramework/HiiLib.inf | ||||
|   IfrSupportLibFramework|IntelFrameworkPkg/Library/IfrSupportLibFramework/IfrSupportLib.inf | ||||
|   IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf | ||||
| @ -179,6 +179,12 @@ | ||||
|   IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf | ||||
|   IntelFrameworkModulePkg/Bus/Pci/VgaMiniPortDxe/VgaMiniPortDxe.inf | ||||
| 
 | ||||
|   IntelFrameworkModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf | ||||
|   IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf | ||||
|   IntelFrameworkModulePkg/Library/BaseReportStatusCodeLib/BaseReportStatusCodeLib.inf | ||||
|   IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf | ||||
| 
 | ||||
| 
 | ||||
| [Components.IA32] | ||||
|   IntelFrameworkModulePkg/Universal/StatusCode/Dxe/DxeStatusCode.inf | ||||
| 
 | ||||
|  | ||||
| @ -0,0 +1,532 @@ | ||||
| /** @file
 | ||||
|   Report Status Code Library for DXE Phase. | ||||
| 
 | ||||
|   Copyright (c) 2006 - 2007, 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
 | ||||
| 
 | ||||
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| 
 | ||||
| **/ | ||||
| 
 | ||||
| 
 | ||||
| #include <Base.h> | ||||
| #include <Framework/StatusCodeDataTypeId.h> | ||||
| #include <Framework/StatusCode.h> | ||||
| 
 | ||||
| #include <Guid/StatusCodeDataTypeId.h> | ||||
| #include <Library/ReportStatusCodeLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/PcdLib.h> | ||||
| 
 | ||||
| #include <DebugInfo.h> | ||||
| 
 | ||||
| /**
 | ||||
|   Internal worker function that reports a status code through the Status Code Protocol | ||||
| 
 | ||||
|   This function checks to see if a Status Code Protocol is present in the handle | ||||
|   database.  If a Status Code Protocol is not present, then EFI_UNSUPPORTED is | ||||
|   returned.  If a Status Code Protocol is present, then it is cached in gStatusCode, | ||||
|   and the ReportStatusCode() service of the Status Code Protocol is called passing in | ||||
|   Type, Value, Instance, CallerId, and Data.  The result of this call is returned. | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  Instance          Status code instance number. | ||||
|   @param  CallerId          Pointer to a GUID that identifies the caller of this | ||||
|                             function.  This is an optional parameter that may be | ||||
|                             NULL. | ||||
|   @param  Data              Pointer to the extended data buffer.  This is an | ||||
|                             optional parameter that may be NULL. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to report the status code. | ||||
|   @retval  EFI_UNSUPPORTED       Status Code Protocol is not available. | ||||
| 
 | ||||
| **/ | ||||
| STATIC | ||||
| EFI_STATUS | ||||
| InternalReportStatusCode ( | ||||
|   IN EFI_STATUS_CODE_TYPE     Type, | ||||
|   IN EFI_STATUS_CODE_VALUE    Value, | ||||
|   IN UINT32                   Instance, | ||||
|   IN CONST EFI_GUID           *CallerId OPTIONAL, | ||||
|   IN EFI_STATUS_CODE_DATA     *Data     OPTIONAL | ||||
|   ) | ||||
| { | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Computes and returns the size, in bytes, of a device path. | ||||
| 
 | ||||
|   @param  DevicePath  A pointer to a device path. | ||||
| 
 | ||||
|   @return  The size, in bytes, of DevicePath. | ||||
| 
 | ||||
| **/ | ||||
| STATIC | ||||
| UINTN | ||||
| InternalReportStatusCodeDevicePathSize ( | ||||
|   IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath | ||||
|   ) | ||||
| { | ||||
|   CONST EFI_DEVICE_PATH_PROTOCOL  *Start; | ||||
| 
 | ||||
|   //
 | ||||
|   // Search for the end of the device path structure
 | ||||
|   //
 | ||||
|   Start = DevicePath; | ||||
|   while (!EfiIsDevicePathEnd (DevicePath)) { | ||||
|     DevicePath = EfiNextDevicePathNode (DevicePath); | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Subtract the start node from the end node and add in the size of the end node
 | ||||
|   //
 | ||||
|   return ((UINTN) DevicePath - (UINTN) Start) + DevicePathNodeLength (DevicePath); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Converts a status code to an 8-bit POST code value. | ||||
| 
 | ||||
|   Converts the status code specified by CodeType and Value to an 8-bit POST code | ||||
|   and returns the 8-bit POST code in PostCode.  If CodeType is an | ||||
|   EFI_PROGRESS_CODE or CodeType is an EFI_ERROR_CODE, then bits 0..4 of PostCode | ||||
|   are set to bits 16..20 of Value, and bits 5..7 of PostCode are set to bits | ||||
|   24..26 of Value., and TRUE is returned.  Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If PostCode is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  CodeType  The type of status code being converted. | ||||
|   @param  Value     The status code value being converted. | ||||
|   @param  PostCode  A pointer to the 8-bit POST code value to return. | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by CodeType and Value was converted | ||||
|                   to an 8-bit POST code and returned in  PostCode. | ||||
|   @retval  FALSE  The status code specified by CodeType and Value could not be | ||||
|                   converted to an 8-bit POST code value. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| CodeTypeToPostCode ( | ||||
|   IN  EFI_STATUS_CODE_TYPE   CodeType, | ||||
|   IN  EFI_STATUS_CODE_VALUE  Value, | ||||
|   OUT UINT8                  *PostCode | ||||
|   ) | ||||
| { | ||||
|   //
 | ||||
|   // If PostCode is NULL, then ASSERT()
 | ||||
|   //
 | ||||
|   ASSERT (PostCode != NULL); | ||||
| 
 | ||||
|   //
 | ||||
|   // Convert Value to an 8 bit post code
 | ||||
|   //
 | ||||
|   if (((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) || | ||||
|       ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE)       ) { | ||||
|     *PostCode  = (UINT8) ((((Value & EFI_STATUS_CODE_CLASS_MASK) >> 24) << 5) | | ||||
|                           (((Value & EFI_STATUS_CODE_SUBCLASS_MASK) >> 16) & 0x1f)); | ||||
|     return TRUE; | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Extracts ASSERT() information from a status code structure. | ||||
| 
 | ||||
|   Converts the status code specified by CodeType, Value, and Data to the ASSERT() | ||||
|   arguments specified by Filename, Description, and LineNumber.  If CodeType is | ||||
|   an EFI_ERROR_CODE, and CodeType has a severity of EFI_ERROR_UNRECOVERED, and | ||||
|   Value has an operation mask of EFI_SW_EC_ILLEGAL_SOFTWARE_STATE, extract | ||||
|   Filename, Description, and LineNumber from the optional data area of the | ||||
|   status code buffer specified by Data.  The optional data area of Data contains | ||||
|   a Null-terminated ASCII string for the FileName, followed by a Null-terminated | ||||
|   ASCII string for the Description, followed by a 32-bit LineNumber.  If the | ||||
|   ASSERT() information could be extracted from Data, then return TRUE. | ||||
|   Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If Data is NULL, then ASSERT(). | ||||
|   If Filename is NULL, then ASSERT(). | ||||
|   If Description is NULL, then ASSERT(). | ||||
|   If LineNumber is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  CodeType     The type of status code being converted. | ||||
|   @param  Value        The status code value being converted. | ||||
|   @param  Data         Pointer to status code data buffer. | ||||
|   @param  Filename     Pointer to the source file name that generated the ASSERT(). | ||||
|   @param  Description  Pointer to the description of the ASSERT(). | ||||
|   @param  LineNumber   Pointer to source line number that generated the ASSERT(). | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by CodeType, Value, and Data was | ||||
|                   converted ASSERT() arguments specified by Filename, Description, | ||||
|                   and LineNumber. | ||||
|   @retval  FALSE  The status code specified by CodeType, Value, and Data could | ||||
|                   not be converted to ASSERT() arguments. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportStatusCodeExtractAssertInfo ( | ||||
|   IN EFI_STATUS_CODE_TYPE        CodeType, | ||||
|   IN EFI_STATUS_CODE_VALUE       Value, | ||||
|   IN CONST EFI_STATUS_CODE_DATA  *Data, | ||||
|   OUT CHAR8                      **Filename, | ||||
|   OUT CHAR8                      **Description, | ||||
|   OUT UINT32                     *LineNumber | ||||
|   ) | ||||
| { | ||||
|   EFI_DEBUG_ASSERT_DATA  *AssertData; | ||||
| 
 | ||||
|   ASSERT (Data        != NULL); | ||||
|   ASSERT (Filename    != NULL); | ||||
|   ASSERT (Description != NULL); | ||||
|   ASSERT (LineNumber  != NULL); | ||||
| 
 | ||||
|   if (((CodeType & EFI_STATUS_CODE_TYPE_MASK)      == EFI_ERROR_CODE) && | ||||
|       ((CodeType & EFI_STATUS_CODE_SEVERITY_MASK)  == EFI_ERROR_UNRECOVERED) && | ||||
|       ((Value    & EFI_STATUS_CODE_OPERATION_MASK) == EFI_SW_EC_ILLEGAL_SOFTWARE_STATE)) { | ||||
|     AssertData   = (EFI_DEBUG_ASSERT_DATA *)(Data + 1); | ||||
|     *Filename    = (CHAR8 *)(AssertData + 1); | ||||
|     *Description = *Filename + AsciiStrLen (*Filename) + 1; | ||||
|     *LineNumber  = AssertData->LineNumber; | ||||
|     return TRUE; | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Extracts DEBUG() information from a status code structure. | ||||
| 
 | ||||
|   Converts the status code specified by Data to the DEBUG() arguments specified | ||||
|   by ErrorLevel, Marker, and Format.  If type GUID in Data is | ||||
|   EFI_STATUS_CODE_DATA_TYPE_DEBUG_GUID, then extract ErrorLevel, Marker, and | ||||
|   Format from the optional data area of the status code buffer specified by Data. | ||||
|   The optional data area of Data contains a 32-bit ErrorLevel followed by Marker | ||||
|   which is 12 UINTN parameters, followed by a Null-terminated ASCII string for | ||||
|   the Format.  If the DEBUG() information could be extracted from Data, then | ||||
|   return TRUE.  Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If Data is NULL, then ASSERT(). | ||||
|   If ErrorLevel is NULL, then ASSERT(). | ||||
|   If Marker is NULL, then ASSERT(). | ||||
|   If Format is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  Data        Pointer to status code data buffer. | ||||
|   @param  ErrorLevel  Pointer to error level mask for a debug message. | ||||
|   @param  Marker      Pointer to the variable argument list associated with Format. | ||||
|   @param  Format      Pointer to a Null-terminated ASCII format string of a | ||||
|                       debug message. | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by Data was converted DEBUG() arguments | ||||
|                   specified by ErrorLevel, Marker, and Format. | ||||
|   @retval  FALSE  The status code specified by Data could not be converted to | ||||
|                   DEBUG() arguments. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportStatusCodeExtractDebugInfo ( | ||||
|   IN CONST EFI_STATUS_CODE_DATA  *Data, | ||||
|   OUT UINT32                     *ErrorLevel, | ||||
|   OUT VA_LIST                    *Marker, | ||||
|   OUT CHAR8                      **Format | ||||
|   ) | ||||
| { | ||||
|   EFI_DEBUG_INFO  *DebugInfo; | ||||
| 
 | ||||
|   ASSERT (Data       != NULL); | ||||
|   ASSERT (ErrorLevel != NULL); | ||||
|   ASSERT (Marker     != NULL); | ||||
|   ASSERT (Format     != NULL); | ||||
| 
 | ||||
|   //
 | ||||
|   // If the GUID type is not EFI_STATUS_CODE_DATA_TYPE_DEBUG_GUID then return FALSE
 | ||||
|   //
 | ||||
|   if (!CompareGuid (&Data->Type, &gEfiStatusCodeDataTypeDebugGuid)) { | ||||
|     return FALSE; | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Retrieve the debug information from the status code record
 | ||||
|   //
 | ||||
|   DebugInfo = (EFI_DEBUG_INFO *)(Data + 1); | ||||
| 
 | ||||
|   *ErrorLevel = DebugInfo->ErrorLevel; | ||||
| 
 | ||||
|   //
 | ||||
|   // The first 12 * UINTN bytes of the string are really an
 | ||||
|   // argument stack to support varargs on the Format string.
 | ||||
|   //
 | ||||
|   *Marker = (VA_LIST) (DebugInfo + 1); | ||||
|   *Format = (CHAR8 *)(((UINT64 *)*Marker) + 12); | ||||
| 
 | ||||
|   return TRUE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code. | ||||
| 
 | ||||
|   Reports the status code specified by the parameters Type and Value.  Status | ||||
|   code also require an instance, caller ID, and extended data.  This function | ||||
|   passed in a zero instance, NULL extended data, and a caller ID of | ||||
|   gEfiCallerIdGuid, which is the GUID for the module. | ||||
| 
 | ||||
|   ReportStatusCode()must actively prevent recusrsion.  If ReportStatusCode() | ||||
|   is called while processing another any other Report Status Code Library function, | ||||
|   then ReportStatusCode() must return immediately. | ||||
| 
 | ||||
|   @param  Type   Status code type. | ||||
|   @param  Value  Status code value. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS       The status code was reported. | ||||
|   @retval  EFI_DEVICE_ERROR  There status code could not be reported due to a | ||||
|                              device error. | ||||
|   @retval  EFI_UNSUPPORTED   Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCode ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value | ||||
|   ) | ||||
| { | ||||
|   return InternalReportStatusCode (Type, Value, 0, &gEfiCallerIdGuid, NULL); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with a Device Path Protocol as the extended data. | ||||
| 
 | ||||
|   Allocates and fills in the extended data section of a status code with the | ||||
|   Device Path Protocol specified by DevicePath.  This function is responsible | ||||
|   for allocating a buffer large enough for the standard header and the device | ||||
|   path.  The standard header is filled in with a GUID of | ||||
|   gEfiStatusCodeSpecificDataGuid.  The status code is reported with a zero | ||||
|   instance and a caller ID of gEfiCallerIdGuid. | ||||
| 
 | ||||
|   ReportStatusCodeWithDevicePath()must actively prevent recursion.  If | ||||
|   ReportStatusCodeWithDevicePath() is called while processing another any other | ||||
|   Report Status Code Library function, then ReportStatusCodeWithDevicePath() | ||||
|   must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If DevicePath is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type        Status code type. | ||||
|   @param  Value       Status code value. | ||||
|   @param  DevicePath  Pointer to the Device Path Protocol to be reported. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported with the extended | ||||
|                                  data specified by DevicePath. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate the | ||||
|                                  extended data section. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeWithDevicePath ( | ||||
|   IN EFI_STATUS_CODE_TYPE            Type, | ||||
|   IN EFI_STATUS_CODE_VALUE           Value, | ||||
|   IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath | ||||
|   ) | ||||
| { | ||||
|   ASSERT (DevicePath != NULL); | ||||
|   return ReportStatusCodeWithExtendedData ( | ||||
|            Type, | ||||
|            Value, | ||||
|            (VOID *)DevicePath, | ||||
|            InternalReportStatusCodeDevicePathSize (DevicePath) | ||||
|            ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with an extended data buffer. | ||||
| 
 | ||||
|   Allocates and fills in the extended data section of a status code with the | ||||
|   extended data specified by ExtendedData and ExtendedDataSize.  ExtendedData | ||||
|   is assumed to be one of the data structures specified in Related Definitions. | ||||
|   These data structure do not have the standard header, so this function is | ||||
|   responsible for allocating a buffer large enough for the standard header and | ||||
|   the extended data passed into this function.  The standard header is filled | ||||
|   in with a GUID of  gEfiStatusCodeSpecificDataGuid.  The status code is reported | ||||
|   with a zero instance and a caller ID of gEfiCallerIdGuid. | ||||
| 
 | ||||
|   ReportStatusCodeWithExtendedData()must actively prevent recursion.  If | ||||
|   ReportStatusCodeWithExtendedData() is called while processing another any other | ||||
|   Report Status Code Library function, then ReportStatusCodeWithExtendedData() | ||||
|   must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If ExtendedData is NULL, then ASSERT(). | ||||
|   If ExtendedDataSize is 0, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  ExtendedData      Pointer to the extended data buffer to be reported. | ||||
|   @param  ExtendedDataSize  The size, in bytes, of the extended data buffer to | ||||
|                             be reported. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported with the extended | ||||
|                                  data specified by ExtendedData and ExtendedDataSize. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate the | ||||
|                                  extended data section. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeWithExtendedData ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value, | ||||
|   IN CONST VOID             *ExtendedData, | ||||
|   IN UINTN                  ExtendedDataSize | ||||
|   ) | ||||
| { | ||||
|   ASSERT (ExtendedData     != NULL); | ||||
|   ASSERT (ExtendedDataSize != 0); | ||||
|   return ReportStatusCodeEx ( | ||||
|            Type, | ||||
|            Value, | ||||
|            0, | ||||
|            NULL, | ||||
|            NULL, | ||||
|            ExtendedData, | ||||
|            ExtendedDataSize | ||||
|            ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with full parameters. | ||||
| 
 | ||||
|   The function reports a status code.  If ExtendedData is NULL and ExtendedDataSize | ||||
|   is 0, then an extended data buffer is not reported.  If ExtendedData is not | ||||
|   NULL and ExtendedDataSize is not 0, then an extended data buffer is allocated. | ||||
|   ExtendedData is assumed not have the standard status code header, so this function | ||||
|   is responsible for allocating a buffer large enough for the standard header and | ||||
|   the extended data passed into this function.  The standard header is filled in | ||||
|   with a GUID specified by ExtendedDataGuid.  If ExtendedDataGuid is NULL, then a | ||||
|   GUID of gEfiStatusCodeSpecificDatauid is used.  The status code is reported with | ||||
|   an instance specified by Instance and a caller ID specified by CallerId.  If | ||||
|   CallerId is NULL, then a caller ID of gEfiCallerIdGuid is used. | ||||
| 
 | ||||
|   ReportStatusCodeEx()must actively prevent recursion.  If ReportStatusCodeEx() | ||||
|   is called while processing another any other Report Status Code Library function, | ||||
|   then ReportStatusCodeEx() must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If ExtendedData is NULL and ExtendedDataSize is not zero, then ASSERT(). | ||||
|   If ExtendedData is not NULL and ExtendedDataSize is zero, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  Instance          Status code instance number. | ||||
|   @param  CallerId          Pointer to a GUID that identifies the caller of this | ||||
|                             function.  If this parameter is NULL, then a caller | ||||
|                             ID of gEfiCallerIdGuid is used. | ||||
|   @param  ExtendedDataGuid  Pointer to the GUID for the extended data buffer. | ||||
|                             If this parameter is NULL, then a the status code | ||||
|                             standard header is filled in with | ||||
|                             gEfiStatusCodeSpecificDataGuid. | ||||
|   @param  ExtendedData      Pointer to the extended data buffer.  This is an | ||||
|                             optional parameter that may be NULL. | ||||
|   @param  ExtendedDataSize  The size, in bytes, of the extended data buffer. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate | ||||
|                                  the extended data section if it was specified. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeEx ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value, | ||||
|   IN UINT32                 Instance, | ||||
|   IN CONST EFI_GUID         *CallerId          OPTIONAL, | ||||
|   IN CONST EFI_GUID         *ExtendedDataGuid  OPTIONAL, | ||||
|   IN CONST VOID             *ExtendedData      OPTIONAL, | ||||
|   IN UINTN                  ExtendedDataSize | ||||
|   ) | ||||
| { | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportProgressCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED) != 0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_ERROR_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportErrorCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED) != 0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportDebugCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED) != 0); | ||||
| } | ||||
| @ -0,0 +1,58 @@ | ||||
| #/** @file | ||||
| # DXE report status code library | ||||
| # | ||||
| # Retrieve status code and report status code in DXE phase | ||||
| # Copyright (c) 2006 - 2007, 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. | ||||
| # | ||||
| # | ||||
| #**/ | ||||
| 
 | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x00010005 | ||||
|   BASE_NAME                      = BaseReportStatusCodeLib | ||||
|   FILE_GUID                      = 1DE0B8C2-FFB6-4bdf-97F5-0FFB33979038 | ||||
|   MODULE_TYPE                    = BASE | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = ReportStatusCodeLib|BASE SEC USER_DEFINED | ||||
|   EDK_RELEASE_VERSION            = 0x00020000 | ||||
|   EFI_SPECIFICATION_VERSION      = 0x00020000 | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
| # The following information is for reference only and not required by the build tools. | ||||
| # | ||||
| #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC | ||||
| # | ||||
| 
 | ||||
| [Sources.common] | ||||
|   BaseReportStatusCodeLib.c | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   IntelFrameworkPkg/IntelFrameworkPkg.dec | ||||
|   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec | ||||
| 
 | ||||
| [LibraryClasses] | ||||
|   PcdLib | ||||
|   BaseMemoryLib | ||||
|   BaseLib | ||||
|   DebugLib | ||||
| 
 | ||||
| 
 | ||||
| [Guids] | ||||
|   gEfiStatusCodeSpecificDataGuid                # ALWAYS_CONSUMED | ||||
|   gEfiStatusCodeDataTypeDebugGuid               # ALWAYS_CONSUMED | ||||
| 
 | ||||
| 
 | ||||
| [PcdsFixedAtBuild.common] | ||||
|   PcdReportStatusCodePropertyMask|gEfiMdePkgTokenSpaceGuid | ||||
| 
 | ||||
| @ -0,0 +1,67 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||||
|   <MsaHeader> | ||||
|     <ModuleName>DxeReportStatusCodeLib</ModuleName> | ||||
|     <ModuleType>BASE</ModuleType> | ||||
|     <GuidValue>1DE0B8C2-FFB6-4bdf-97F5-0FFB33979038</GuidValue> | ||||
|     <Version>1.0</Version> | ||||
|     <Abstract>DXE report status code library</Abstract> | ||||
|     <Description>Retrieve status code and report status code in DXE phase</Description> | ||||
|     <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright> | ||||
|     <License>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.</License> | ||||
|     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification> | ||||
|   </MsaHeader> | ||||
|   <ModuleDefinitions> | ||||
|     <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures> | ||||
|     <BinaryModule>false</BinaryModule> | ||||
|     <OutputFileBasename>BaseReportStatusCodeLib</OutputFileBasename> | ||||
|   </ModuleDefinitions> | ||||
|   <LibraryClassDefinitions> | ||||
|     <LibraryClass Usage="ALWAYS_PRODUCED" SupModuleList="BASE"> | ||||
|       <Keyword>ReportStatusCodeLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>DebugLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseMemoryLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>PcdLib</Keyword> | ||||
|     </LibraryClass> | ||||
|   </LibraryClassDefinitions> | ||||
|   <SourceFiles> | ||||
|     <Filename>BaseReportStatusCodeLib.c</Filename> | ||||
|   </SourceFiles> | ||||
|   <PackageDependencies> | ||||
|     <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/> | ||||
|   </PackageDependencies> | ||||
|   <Guids> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeDataTypeDebugGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeSpecificDataGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|   </Guids> | ||||
|   <Externs> | ||||
|     <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification> | ||||
|     <Specification>EDK_RELEASE_VERSION 0x00020000</Specification> | ||||
|   </Externs> | ||||
|   <PcdCoded> | ||||
|     <PcdEntry PcdItemType="FIXED_AT_BUILD"> | ||||
|       <C_Name>PcdReportStatusCodePropertyMask</C_Name> | ||||
|       <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName> | ||||
|       <HelpText>The bitmask of flags that specify the enable/disable of | ||||
|                 Progress Code, Error Code and Debug Code.</HelpText> | ||||
|     </PcdEntry> | ||||
|   </PcdCoded> | ||||
| </ModuleSurfaceArea> | ||||
| @ -0,0 +1,64 @@ | ||||
| #/** @file | ||||
| # DXE report status code library | ||||
| # | ||||
| # Retrieve status code and report status code in DXE phase | ||||
| # Copyright (c) 2006 - 2007, 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. | ||||
| # | ||||
| # | ||||
| #**/ | ||||
| 
 | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x00010005 | ||||
|   BASE_NAME                      = DxeReportStatusCodeLib | ||||
|   FILE_GUID                      = 3ddc3b12-99ea-4364-b315-6310a2050be5 | ||||
|   MODULE_TYPE                    = DXE_DRIVER | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = ReportStatusCodeLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER | ||||
|   EDK_RELEASE_VERSION            = 0x00020000 | ||||
|   EFI_SPECIFICATION_VERSION      = 0x00020000 | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
| # The following information is for reference only and not required by the build tools. | ||||
| # | ||||
| #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC | ||||
| # | ||||
| 
 | ||||
| [Sources.common] | ||||
|   ReportStatusCodeLib.c | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   IntelFrameworkPkg/IntelFrameworkPkg.dec | ||||
|   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec | ||||
| 
 | ||||
| [LibraryClasses] | ||||
|   PcdLib | ||||
|   BaseMemoryLib | ||||
|   BaseLib | ||||
|   UefiBootServicesTableLib | ||||
|   DebugLib | ||||
|   UefiRuntimeServicesTableLib | ||||
| 
 | ||||
| 
 | ||||
| [Guids] | ||||
|   gEfiStatusCodeSpecificDataGuid                # ALWAYS_CONSUMED | ||||
|   gEfiStatusCodeDataTypeDebugGuid               # ALWAYS_CONSUMED | ||||
| 
 | ||||
| 
 | ||||
| [Protocols] | ||||
|   gEfiStatusCodeRuntimeProtocolGuid             # PROTOCOL ALWAYS_CONSUMED | ||||
| 
 | ||||
| 
 | ||||
| [PcdsFixedAtBuild.common] | ||||
|   PcdReportStatusCodePropertyMask|gEfiMdePkgTokenSpaceGuid | ||||
| 
 | ||||
| @ -0,0 +1,78 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||||
|   <MsaHeader> | ||||
|     <ModuleName>DxeReportStatusCodeLib</ModuleName> | ||||
|     <ModuleType>DXE_DRIVER</ModuleType> | ||||
|     <GuidValue>3ddc3b12-99ea-4364-b315-6310a2050be5</GuidValue> | ||||
|     <Version>1.0</Version> | ||||
|     <Abstract>DXE report status code library</Abstract> | ||||
|     <Description>Retrieve status code and report status code in DXE phase</Description> | ||||
|     <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright> | ||||
|     <License>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.</License> | ||||
|     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification> | ||||
|   </MsaHeader> | ||||
|   <ModuleDefinitions> | ||||
|     <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures> | ||||
|     <BinaryModule>false</BinaryModule> | ||||
|     <OutputFileBasename>DxeReportStatusCodeLib</OutputFileBasename> | ||||
|   </ModuleDefinitions> | ||||
|   <LibraryClassDefinitions> | ||||
|     <LibraryClass Usage="ALWAYS_PRODUCED" SupModuleList="DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER"> | ||||
|       <Keyword>ReportStatusCodeLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>DebugLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>UefiBootServicesTableLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseMemoryLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>PcdLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>UefiRuntimeServicesTableLib</Keyword> | ||||
|     </LibraryClass> | ||||
|   </LibraryClassDefinitions> | ||||
|   <SourceFiles> | ||||
|     <Filename>ReportStatusCodeLib.c</Filename> | ||||
|   </SourceFiles> | ||||
|   <PackageDependencies> | ||||
|     <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/> | ||||
|   </PackageDependencies> | ||||
|   <Protocols> | ||||
|     <Protocol Usage="ALWAYS_CONSUMED"> | ||||
|       <ProtocolCName>gEfiStatusCodeRuntimeProtocolGuid</ProtocolCName> | ||||
|     </Protocol> | ||||
|   </Protocols> | ||||
|   <Guids> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeDataTypeDebugGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeSpecificDataGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|   </Guids> | ||||
|   <Externs> | ||||
|     <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification> | ||||
|     <Specification>EDK_RELEASE_VERSION 0x00020000</Specification> | ||||
|   </Externs> | ||||
|   <PcdCoded> | ||||
|     <PcdEntry PcdItemType="FIXED_AT_BUILD"> | ||||
|       <C_Name>PcdReportStatusCodePropertyMask</C_Name> | ||||
|       <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName> | ||||
|       <HelpText>The bitmask of flags that specify the enable/disable of | ||||
|                 Progress Code, Error Code and Debug Code.</HelpText> | ||||
|     </PcdEntry> | ||||
|   </PcdCoded> | ||||
| </ModuleSurfaceArea> | ||||
| @ -0,0 +1,607 @@ | ||||
| /** @file
 | ||||
|   Report Status Code Library for DXE Phase. | ||||
| 
 | ||||
|   Copyright (c) 2006 - 2007, 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
 | ||||
| 
 | ||||
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| 
 | ||||
| **/ | ||||
| 
 | ||||
| 
 | ||||
| #include <FrameworkDxe.h> | ||||
| 
 | ||||
| #include <Guid/StatusCodeDataTypeId.h> | ||||
| #include <Protocol/StatusCode.h> | ||||
| 
 | ||||
| #include <Library/ReportStatusCodeLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/UefiBootServicesTableLib.h> | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/PcdLib.h> | ||||
| #include <Library/UefiRuntimeServicesTableLib.h> | ||||
| 
 | ||||
| #include <DebugInfo.h> | ||||
| 
 | ||||
| /**
 | ||||
|   Internal worker function that reports a status code through the Status Code Protocol | ||||
| 
 | ||||
|   This function checks to see if a Status Code Protocol is present in the handle | ||||
|   database.  If a Status Code Protocol is not present, then EFI_UNSUPPORTED is | ||||
|   returned.  If a Status Code Protocol is present, then it is cached in gStatusCode, | ||||
|   and the ReportStatusCode() service of the Status Code Protocol is called passing in | ||||
|   Type, Value, Instance, CallerId, and Data.  The result of this call is returned. | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  Instance          Status code instance number. | ||||
|   @param  CallerId          Pointer to a GUID that identifies the caller of this | ||||
|                             function.  This is an optional parameter that may be | ||||
|                             NULL. | ||||
|   @param  Data              Pointer to the extended data buffer.  This is an | ||||
|                             optional parameter that may be NULL. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to report the status code. | ||||
|   @retval  EFI_UNSUPPORTED       Status Code Protocol is not available. | ||||
| 
 | ||||
| **/ | ||||
| STATIC | ||||
| EFI_STATUS | ||||
| InternalReportStatusCode ( | ||||
|   IN EFI_STATUS_CODE_TYPE     Type, | ||||
|   IN EFI_STATUS_CODE_VALUE    Value, | ||||
|   IN UINT32                   Instance, | ||||
|   IN CONST EFI_GUID           *CallerId OPTIONAL, | ||||
|   IN EFI_STATUS_CODE_DATA     *Data     OPTIONAL | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS                    Status; | ||||
|   EFI_STATUS_CODE_PROTOCOL      *StatusCode; | ||||
|   STATIC EFI_REPORT_STATUS_CODE ReportStatusCode = NULL; | ||||
| 
 | ||||
|   //
 | ||||
|   // If gStatusCode is NULL, then see if a Status Code Protocol instance is present
 | ||||
|   // in the handle database.
 | ||||
|   //
 | ||||
|   if (ReportStatusCode == NULL) { | ||||
|     if (gBS == NULL) { | ||||
|       return EFI_UNSUPPORTED; | ||||
|     } | ||||
|     Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**)&StatusCode); | ||||
|     if (!EFI_ERROR (Status) && StatusCode != NULL) { | ||||
|       ReportStatusCode = StatusCode->ReportStatusCode; | ||||
|     } else if (gRT->Hdr.Revision < 0x20000) { | ||||
|       ReportStatusCode = ((FRAMEWORK_EFI_RUNTIME_SERVICES*)gRT)->ReportStatusCode; | ||||
|     } else { | ||||
|       return EFI_UNSUPPORTED; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // A Status Code Protocol is present in the handle database, so pass in all the
 | ||||
|   // parameters to the ReportStatusCode() service of the Status Code Protocol
 | ||||
|   //
 | ||||
|   return (*ReportStatusCode) (Type, Value, Instance, (EFI_GUID *)CallerId, Data); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Computes and returns the size, in bytes, of a device path. | ||||
| 
 | ||||
|   @param  DevicePath  A pointer to a device path. | ||||
| 
 | ||||
|   @return  The size, in bytes, of DevicePath. | ||||
| 
 | ||||
| **/ | ||||
| STATIC | ||||
| UINTN | ||||
| InternalReportStatusCodeDevicePathSize ( | ||||
|   IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath | ||||
|   ) | ||||
| { | ||||
|   CONST EFI_DEVICE_PATH_PROTOCOL  *Start; | ||||
| 
 | ||||
|   //
 | ||||
|   // Search for the end of the device path structure
 | ||||
|   //
 | ||||
|   Start = DevicePath; | ||||
|   while (!EfiIsDevicePathEnd (DevicePath)) { | ||||
|     DevicePath = EfiNextDevicePathNode (DevicePath); | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Subtract the start node from the end node and add in the size of the end node
 | ||||
|   //
 | ||||
|   return ((UINTN) DevicePath - (UINTN) Start) + DevicePathNodeLength (DevicePath); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Converts a status code to an 8-bit POST code value. | ||||
| 
 | ||||
|   Converts the status code specified by CodeType and Value to an 8-bit POST code | ||||
|   and returns the 8-bit POST code in PostCode.  If CodeType is an | ||||
|   EFI_PROGRESS_CODE or CodeType is an EFI_ERROR_CODE, then bits 0..4 of PostCode | ||||
|   are set to bits 16..20 of Value, and bits 5..7 of PostCode are set to bits | ||||
|   24..26 of Value., and TRUE is returned.  Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If PostCode is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  CodeType  The type of status code being converted. | ||||
|   @param  Value     The status code value being converted. | ||||
|   @param  PostCode  A pointer to the 8-bit POST code value to return. | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by CodeType and Value was converted | ||||
|                   to an 8-bit POST code and returned in  PostCode. | ||||
|   @retval  FALSE  The status code specified by CodeType and Value could not be | ||||
|                   converted to an 8-bit POST code value. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| CodeTypeToPostCode ( | ||||
|   IN  EFI_STATUS_CODE_TYPE   CodeType, | ||||
|   IN  EFI_STATUS_CODE_VALUE  Value, | ||||
|   OUT UINT8                  *PostCode | ||||
|   ) | ||||
| { | ||||
|   //
 | ||||
|   // If PostCode is NULL, then ASSERT()
 | ||||
|   //
 | ||||
|   ASSERT (PostCode != NULL); | ||||
| 
 | ||||
|   //
 | ||||
|   // Convert Value to an 8 bit post code
 | ||||
|   //
 | ||||
|   if (((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) || | ||||
|       ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE)       ) { | ||||
|     *PostCode  = (UINT8) ((((Value & EFI_STATUS_CODE_CLASS_MASK) >> 24) << 5) | | ||||
|                           (((Value & EFI_STATUS_CODE_SUBCLASS_MASK) >> 16) & 0x1f)); | ||||
|     return TRUE; | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Extracts ASSERT() information from a status code structure. | ||||
| 
 | ||||
|   Converts the status code specified by CodeType, Value, and Data to the ASSERT() | ||||
|   arguments specified by Filename, Description, and LineNumber.  If CodeType is | ||||
|   an EFI_ERROR_CODE, and CodeType has a severity of EFI_ERROR_UNRECOVERED, and | ||||
|   Value has an operation mask of EFI_SW_EC_ILLEGAL_SOFTWARE_STATE, extract | ||||
|   Filename, Description, and LineNumber from the optional data area of the | ||||
|   status code buffer specified by Data.  The optional data area of Data contains | ||||
|   a Null-terminated ASCII string for the FileName, followed by a Null-terminated | ||||
|   ASCII string for the Description, followed by a 32-bit LineNumber.  If the | ||||
|   ASSERT() information could be extracted from Data, then return TRUE. | ||||
|   Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If Data is NULL, then ASSERT(). | ||||
|   If Filename is NULL, then ASSERT(). | ||||
|   If Description is NULL, then ASSERT(). | ||||
|   If LineNumber is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  CodeType     The type of status code being converted. | ||||
|   @param  Value        The status code value being converted. | ||||
|   @param  Data         Pointer to status code data buffer. | ||||
|   @param  Filename     Pointer to the source file name that generated the ASSERT(). | ||||
|   @param  Description  Pointer to the description of the ASSERT(). | ||||
|   @param  LineNumber   Pointer to source line number that generated the ASSERT(). | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by CodeType, Value, and Data was | ||||
|                   converted ASSERT() arguments specified by Filename, Description, | ||||
|                   and LineNumber. | ||||
|   @retval  FALSE  The status code specified by CodeType, Value, and Data could | ||||
|                   not be converted to ASSERT() arguments. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportStatusCodeExtractAssertInfo ( | ||||
|   IN EFI_STATUS_CODE_TYPE        CodeType, | ||||
|   IN EFI_STATUS_CODE_VALUE       Value, | ||||
|   IN CONST EFI_STATUS_CODE_DATA  *Data, | ||||
|   OUT CHAR8                      **Filename, | ||||
|   OUT CHAR8                      **Description, | ||||
|   OUT UINT32                     *LineNumber | ||||
|   ) | ||||
| { | ||||
|   EFI_DEBUG_ASSERT_DATA  *AssertData; | ||||
| 
 | ||||
|   ASSERT (Data        != NULL); | ||||
|   ASSERT (Filename    != NULL); | ||||
|   ASSERT (Description != NULL); | ||||
|   ASSERT (LineNumber  != NULL); | ||||
| 
 | ||||
|   if (((CodeType & EFI_STATUS_CODE_TYPE_MASK)      == EFI_ERROR_CODE) && | ||||
|       ((CodeType & EFI_STATUS_CODE_SEVERITY_MASK)  == EFI_ERROR_UNRECOVERED) && | ||||
|       ((Value    & EFI_STATUS_CODE_OPERATION_MASK) == EFI_SW_EC_ILLEGAL_SOFTWARE_STATE)) { | ||||
|     AssertData   = (EFI_DEBUG_ASSERT_DATA *)(Data + 1); | ||||
|     *Filename    = (CHAR8 *)(AssertData + 1); | ||||
|     *Description = *Filename + AsciiStrLen (*Filename) + 1; | ||||
|     *LineNumber  = AssertData->LineNumber; | ||||
|     return TRUE; | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Extracts DEBUG() information from a status code structure. | ||||
| 
 | ||||
|   Converts the status code specified by Data to the DEBUG() arguments specified | ||||
|   by ErrorLevel, Marker, and Format.  If type GUID in Data is | ||||
|   EFI_STATUS_CODE_DATA_TYPE_DEBUG_GUID, then extract ErrorLevel, Marker, and | ||||
|   Format from the optional data area of the status code buffer specified by Data. | ||||
|   The optional data area of Data contains a 32-bit ErrorLevel followed by Marker | ||||
|   which is 12 UINTN parameters, followed by a Null-terminated ASCII string for | ||||
|   the Format.  If the DEBUG() information could be extracted from Data, then | ||||
|   return TRUE.  Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If Data is NULL, then ASSERT(). | ||||
|   If ErrorLevel is NULL, then ASSERT(). | ||||
|   If Marker is NULL, then ASSERT(). | ||||
|   If Format is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  Data        Pointer to status code data buffer. | ||||
|   @param  ErrorLevel  Pointer to error level mask for a debug message. | ||||
|   @param  Marker      Pointer to the variable argument list associated with Format. | ||||
|   @param  Format      Pointer to a Null-terminated ASCII format string of a | ||||
|                       debug message. | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by Data was converted DEBUG() arguments | ||||
|                   specified by ErrorLevel, Marker, and Format. | ||||
|   @retval  FALSE  The status code specified by Data could not be converted to | ||||
|                   DEBUG() arguments. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportStatusCodeExtractDebugInfo ( | ||||
|   IN CONST EFI_STATUS_CODE_DATA  *Data, | ||||
|   OUT UINT32                     *ErrorLevel, | ||||
|   OUT VA_LIST                    *Marker, | ||||
|   OUT CHAR8                      **Format | ||||
|   ) | ||||
| { | ||||
|   EFI_DEBUG_INFO  *DebugInfo; | ||||
| 
 | ||||
|   ASSERT (Data       != NULL); | ||||
|   ASSERT (ErrorLevel != NULL); | ||||
|   ASSERT (Marker     != NULL); | ||||
|   ASSERT (Format     != NULL); | ||||
| 
 | ||||
|   //
 | ||||
|   // If the GUID type is not EFI_STATUS_CODE_DATA_TYPE_DEBUG_GUID then return FALSE
 | ||||
|   //
 | ||||
|   if (!CompareGuid (&Data->Type, &gEfiStatusCodeDataTypeDebugGuid)) { | ||||
|     return FALSE; | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Retrieve the debug information from the status code record
 | ||||
|   //
 | ||||
|   DebugInfo = (EFI_DEBUG_INFO *)(Data + 1); | ||||
| 
 | ||||
|   *ErrorLevel = DebugInfo->ErrorLevel; | ||||
| 
 | ||||
|   //
 | ||||
|   // The first 12 * UINTN bytes of the string are really an
 | ||||
|   // argument stack to support varargs on the Format string.
 | ||||
|   //
 | ||||
|   *Marker = (VA_LIST) (DebugInfo + 1); | ||||
|   *Format = (CHAR8 *)(((UINT64 *)*Marker) + 12); | ||||
| 
 | ||||
|   return TRUE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code. | ||||
| 
 | ||||
|   Reports the status code specified by the parameters Type and Value.  Status | ||||
|   code also require an instance, caller ID, and extended data.  This function | ||||
|   passed in a zero instance, NULL extended data, and a caller ID of | ||||
|   gEfiCallerIdGuid, which is the GUID for the module. | ||||
| 
 | ||||
|   ReportStatusCode()must actively prevent recusrsion.  If ReportStatusCode() | ||||
|   is called while processing another any other Report Status Code Library function, | ||||
|   then ReportStatusCode() must return immediately. | ||||
| 
 | ||||
|   @param  Type   Status code type. | ||||
|   @param  Value  Status code value. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS       The status code was reported. | ||||
|   @retval  EFI_DEVICE_ERROR  There status code could not be reported due to a | ||||
|                              device error. | ||||
|   @retval  EFI_UNSUPPORTED   Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCode ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value | ||||
|   ) | ||||
| { | ||||
|   return InternalReportStatusCode (Type, Value, 0, &gEfiCallerIdGuid, NULL); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with a Device Path Protocol as the extended data. | ||||
| 
 | ||||
|   Allocates and fills in the extended data section of a status code with the | ||||
|   Device Path Protocol specified by DevicePath.  This function is responsible | ||||
|   for allocating a buffer large enough for the standard header and the device | ||||
|   path.  The standard header is filled in with a GUID of | ||||
|   gEfiStatusCodeSpecificDataGuid.  The status code is reported with a zero | ||||
|   instance and a caller ID of gEfiCallerIdGuid. | ||||
| 
 | ||||
|   ReportStatusCodeWithDevicePath()must actively prevent recursion.  If | ||||
|   ReportStatusCodeWithDevicePath() is called while processing another any other | ||||
|   Report Status Code Library function, then ReportStatusCodeWithDevicePath() | ||||
|   must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If DevicePath is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type        Status code type. | ||||
|   @param  Value       Status code value. | ||||
|   @param  DevicePath  Pointer to the Device Path Protocol to be reported. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported with the extended | ||||
|                                  data specified by DevicePath. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate the | ||||
|                                  extended data section. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeWithDevicePath ( | ||||
|   IN EFI_STATUS_CODE_TYPE            Type, | ||||
|   IN EFI_STATUS_CODE_VALUE           Value, | ||||
|   IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath | ||||
|   ) | ||||
| { | ||||
|   ASSERT (DevicePath != NULL); | ||||
|   return ReportStatusCodeWithExtendedData ( | ||||
|            Type, | ||||
|            Value, | ||||
|            (VOID *)DevicePath, | ||||
|            InternalReportStatusCodeDevicePathSize (DevicePath) | ||||
|            ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with an extended data buffer. | ||||
| 
 | ||||
|   Allocates and fills in the extended data section of a status code with the | ||||
|   extended data specified by ExtendedData and ExtendedDataSize.  ExtendedData | ||||
|   is assumed to be one of the data structures specified in Related Definitions. | ||||
|   These data structure do not have the standard header, so this function is | ||||
|   responsible for allocating a buffer large enough for the standard header and | ||||
|   the extended data passed into this function.  The standard header is filled | ||||
|   in with a GUID of  gEfiStatusCodeSpecificDataGuid.  The status code is reported | ||||
|   with a zero instance and a caller ID of gEfiCallerIdGuid. | ||||
| 
 | ||||
|   ReportStatusCodeWithExtendedData()must actively prevent recursion.  If | ||||
|   ReportStatusCodeWithExtendedData() is called while processing another any other | ||||
|   Report Status Code Library function, then ReportStatusCodeWithExtendedData() | ||||
|   must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If ExtendedData is NULL, then ASSERT(). | ||||
|   If ExtendedDataSize is 0, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  ExtendedData      Pointer to the extended data buffer to be reported. | ||||
|   @param  ExtendedDataSize  The size, in bytes, of the extended data buffer to | ||||
|                             be reported. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported with the extended | ||||
|                                  data specified by ExtendedData and ExtendedDataSize. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate the | ||||
|                                  extended data section. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeWithExtendedData ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value, | ||||
|   IN CONST VOID             *ExtendedData, | ||||
|   IN UINTN                  ExtendedDataSize | ||||
|   ) | ||||
| { | ||||
|   ASSERT (ExtendedData     != NULL); | ||||
|   ASSERT (ExtendedDataSize != 0); | ||||
|   return ReportStatusCodeEx ( | ||||
|            Type, | ||||
|            Value, | ||||
|            0, | ||||
|            NULL, | ||||
|            NULL, | ||||
|            ExtendedData, | ||||
|            ExtendedDataSize | ||||
|            ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with full parameters. | ||||
| 
 | ||||
|   The function reports a status code.  If ExtendedData is NULL and ExtendedDataSize | ||||
|   is 0, then an extended data buffer is not reported.  If ExtendedData is not | ||||
|   NULL and ExtendedDataSize is not 0, then an extended data buffer is allocated. | ||||
|   ExtendedData is assumed not have the standard status code header, so this function | ||||
|   is responsible for allocating a buffer large enough for the standard header and | ||||
|   the extended data passed into this function.  The standard header is filled in | ||||
|   with a GUID specified by ExtendedDataGuid.  If ExtendedDataGuid is NULL, then a | ||||
|   GUID of gEfiStatusCodeSpecificDatauid is used.  The status code is reported with | ||||
|   an instance specified by Instance and a caller ID specified by CallerId.  If | ||||
|   CallerId is NULL, then a caller ID of gEfiCallerIdGuid is used. | ||||
| 
 | ||||
|   ReportStatusCodeEx()must actively prevent recursion.  If ReportStatusCodeEx() | ||||
|   is called while processing another any other Report Status Code Library function, | ||||
|   then ReportStatusCodeEx() must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If ExtendedData is NULL and ExtendedDataSize is not zero, then ASSERT(). | ||||
|   If ExtendedData is not NULL and ExtendedDataSize is zero, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  Instance          Status code instance number. | ||||
|   @param  CallerId          Pointer to a GUID that identifies the caller of this | ||||
|                             function.  If this parameter is NULL, then a caller | ||||
|                             ID of gEfiCallerIdGuid is used. | ||||
|   @param  ExtendedDataGuid  Pointer to the GUID for the extended data buffer. | ||||
|                             If this parameter is NULL, then a the status code | ||||
|                             standard header is filled in with | ||||
|                             gEfiStatusCodeSpecificDataGuid. | ||||
|   @param  ExtendedData      Pointer to the extended data buffer.  This is an | ||||
|                             optional parameter that may be NULL. | ||||
|   @param  ExtendedDataSize  The size, in bytes, of the extended data buffer. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate | ||||
|                                  the extended data section if it was specified. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeEx ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value, | ||||
|   IN UINT32                 Instance, | ||||
|   IN CONST EFI_GUID         *CallerId          OPTIONAL, | ||||
|   IN CONST EFI_GUID         *ExtendedDataGuid  OPTIONAL, | ||||
|   IN CONST VOID             *ExtendedData      OPTIONAL, | ||||
|   IN UINTN                  ExtendedDataSize | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS            Status; | ||||
|   EFI_STATUS_CODE_DATA  *StatusCodeData; | ||||
| 
 | ||||
|   ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0))); | ||||
|   ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0))); | ||||
| 
 | ||||
|   if (gBS == NULL) { | ||||
|     return EFI_UNSUPPORTED; | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Allocate space for the Status Code Header and its buffer
 | ||||
|   //
 | ||||
|   StatusCodeData = NULL; | ||||
|   gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData); | ||||
|   if (StatusCodeData == NULL) { | ||||
|     return EFI_OUT_OF_RESOURCES; | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Fill in the extended data header
 | ||||
|   //
 | ||||
|   StatusCodeData->HeaderSize = sizeof (EFI_STATUS_CODE_DATA); | ||||
|   StatusCodeData->Size = (UINT16)ExtendedDataSize; | ||||
|   if (ExtendedDataGuid == NULL) { | ||||
|     ExtendedDataGuid = &gEfiStatusCodeSpecificDataGuid; | ||||
|   } | ||||
|   CopyGuid (&StatusCodeData->Type, ExtendedDataGuid); | ||||
| 
 | ||||
|   //
 | ||||
|   // Fill in the extended data buffer
 | ||||
|   //
 | ||||
|   CopyMem (StatusCodeData + 1, ExtendedData, ExtendedDataSize); | ||||
| 
 | ||||
|   //
 | ||||
|   // Report the status code
 | ||||
|   //
 | ||||
|   if (CallerId == NULL) { | ||||
|     CallerId = &gEfiCallerIdGuid; | ||||
|   } | ||||
|   Status = InternalReportStatusCode (Type, Value, Instance, CallerId, StatusCodeData); | ||||
| 
 | ||||
|   //
 | ||||
|   // Free the allocated buffer
 | ||||
|   //
 | ||||
|   gBS->FreePool (StatusCodeData); | ||||
| 
 | ||||
|   return Status; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportProgressCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED) != 0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_ERROR_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportErrorCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED) != 0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportDebugCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED) != 0); | ||||
| } | ||||
| @ -0,0 +1,300 @@ | ||||
| /** @file
 | ||||
|   Debug Library that fowards all messages to ReportStatusCode() | ||||
| 
 | ||||
|   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
 | ||||
| 
 | ||||
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| 
 | ||||
| **/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #include <FrameworkPei.h> | ||||
| 
 | ||||
| #include <Guid/StatusCodeDataTypeId.h> | ||||
| 
 | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/ReportStatusCodeLib.h> | ||||
| #include <Library/PcdLib.h> | ||||
| 
 | ||||
| #include <DebugInfo.h> | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|   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 Format is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @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, | ||||
|   ... | ||||
|   ) | ||||
| { | ||||
|   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 ((ErrorLevel & PcdGet32(PcdDebugPrintErrorLevel)) == 0) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   TotalSize = sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrLen (Format) + 1; | ||||
|   if (TotalSize > EFI_STATUS_CODE_DATA_MAX_SIZE) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Then EFI_DEBUG_INFO
 | ||||
|   //
 | ||||
|   DebugInfo = (EFI_DEBUG_INFO *)Buffer; | ||||
|   DebugInfo->ErrorLevel = (UINT32)ErrorLevel; | ||||
| 
 | ||||
|   //
 | ||||
|   // 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++) { | ||||
|     WriteUnaligned64(ArgumentPointer, VA_ARG (Marker, UINT64)); | ||||
|   } | ||||
|   VA_END (Marker); | ||||
|   AsciiStrCpy ((CHAR8 *)ArgumentPointer, Format); | ||||
| 
 | ||||
|   REPORT_STATUS_CODE_EX ( | ||||
|     EFI_DEBUG_CODE, | ||||
|     (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_DC_UNSPECIFIED), | ||||
|     0, | ||||
|     NULL, | ||||
|     &gEfiStatusCodeDataTypeDebugGuid, | ||||
|     DebugInfo, | ||||
|     TotalSize | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|   Prints an assert message containing a filename, line number, and description. | ||||
|   This may be followed by a breakpoint or a dead loop. | ||||
| 
 | ||||
|   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. | ||||
| 
 | ||||
|   If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed. | ||||
| 
 | ||||
|   If Description is NULL, then a <Description> string of "(NULL) Description" is printed. | ||||
| 
 | ||||
|   @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 | ||||
|   ) | ||||
| { | ||||
|   UINT64                 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof(UINT64)]; | ||||
|   EFI_DEBUG_ASSERT_DATA  *AssertData; | ||||
|   UINTN                  TotalSize; | ||||
|   CHAR8                  *Temp; | ||||
|   UINTN                  FileNameLength; | ||||
|   UINTN                  DescriptionLength; | ||||
| 
 | ||||
|   //
 | ||||
|   // Make sure it will all fit in the passed in buffer
 | ||||
|   //
 | ||||
|   FileNameLength    = AsciiStrLen (FileName); | ||||
|   DescriptionLength = AsciiStrLen (Description); | ||||
|   TotalSize = sizeof (EFI_DEBUG_ASSERT_DATA) + FileNameLength + 1 + DescriptionLength + 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 | ||||
|   PcdDebugClearMemoryValue, and returns Buffer. | ||||
| 
 | ||||
|   If Buffer is NULL, then ASSERT(). | ||||
| 
 | ||||
|   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. | ||||
| 
 | ||||
|   @return  Buffer | ||||
| 
 | ||||
| **/ | ||||
| VOID * | ||||
| EFIAPI | ||||
| DebugClearMemory ( | ||||
|   OUT VOID  *Buffer, | ||||
|   IN UINTN  Length | ||||
|   ) | ||||
| { | ||||
|   //
 | ||||
|   // 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 ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((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 ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((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 ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((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 ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0); | ||||
| } | ||||
| @ -0,0 +1,57 @@ | ||||
| #/** @file | ||||
| # Debug Library based on report status code library | ||||
| # | ||||
| # Debug Library for PEIMs and DXE drivers that send debug messages to ReportStatusCode | ||||
| # 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. | ||||
| # | ||||
| # | ||||
| #**/ | ||||
| 
 | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x00010005 | ||||
|   BASE_NAME                      = PeiDxeDebugLibReportStatusCode | ||||
|   FILE_GUID                      = bda39d3a-451b-4350-8266-81ab10fa0523 | ||||
|   MODULE_TYPE                    = PEIM | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = DebugLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER PEIM PEI_CORE UEFI_APPLICATION UEFI_DRIVER | ||||
|   EDK_RELEASE_VERSION            = 0x00020000 | ||||
|   EFI_SPECIFICATION_VERSION      = 0x00020000 | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
| # The following information is for reference only and not required by the build tools. | ||||
| # | ||||
| #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC | ||||
| # | ||||
| 
 | ||||
| [Sources.common] | ||||
|   DebugLib.c | ||||
| 
 | ||||
| 
 | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   IntelFrameworkPkg/IntelFrameworkPkg.dec | ||||
|   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec | ||||
|    | ||||
| [LibraryClasses] | ||||
|   PcdLib | ||||
|   ReportStatusCodeLib | ||||
|   BaseMemoryLib | ||||
|   BaseLib | ||||
| 
 | ||||
| 
 | ||||
| [PcdsFixedAtBuild.common] | ||||
|   PcdDebugClearMemoryValue|gEfiMdePkgTokenSpaceGuid | ||||
|   PcdDebugPropertyMask|gEfiMdePkgTokenSpaceGuid | ||||
| 
 | ||||
| 
 | ||||
| [PcdsDynamic.common] | ||||
|   PcdDebugPrintErrorLevel|gEfiMdePkgTokenSpaceGuid | ||||
| 
 | ||||
| @ -0,0 +1,77 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||||
|   <MsaHeader> | ||||
|     <ModuleName>PeiDxeDebugLibReportStatusCode</ModuleName> | ||||
|     <ModuleType>PEIM</ModuleType> | ||||
|     <GuidValue>bda39d3a-451b-4350-8266-81ab10fa0523</GuidValue> | ||||
|     <Version>1.0</Version> | ||||
|     <Abstract>Debug Library based on report status code library</Abstract> | ||||
|     <Description>Debug Library for PEIMs and DXE drivers that send debug messages to ReportStatusCode</Description> | ||||
|     <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright> | ||||
|     <License>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.</License> | ||||
|     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification> | ||||
|   </MsaHeader> | ||||
|   <ModuleDefinitions> | ||||
|     <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures> | ||||
|     <BinaryModule>false</BinaryModule> | ||||
|     <OutputFileBasename>PeiDxeDebugLibReportStatusCode</OutputFileBasename> | ||||
|   </ModuleDefinitions> | ||||
|   <LibraryClassDefinitions> | ||||
|     <LibraryClass Usage="ALWAYS_PRODUCED" SupModuleList="DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER PEIM PEI_CORE UEFI_APPLICATION UEFI_DRIVER"> | ||||
|       <Keyword>DebugLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseMemoryLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>ReportStatusCodeLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>PcdLib</Keyword> | ||||
|     </LibraryClass> | ||||
|   </LibraryClassDefinitions> | ||||
|   <SourceFiles> | ||||
|     <Filename>DebugLib.c</Filename> | ||||
|   </SourceFiles> | ||||
|   <PackageDependencies> | ||||
|     <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/> | ||||
|   </PackageDependencies> | ||||
|   <Guids> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeDataTypeDebugGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|   </Guids> | ||||
|   <Externs> | ||||
|     <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification> | ||||
|     <Specification>EDK_RELEASE_VERSION 0x00020000</Specification> | ||||
|   </Externs> | ||||
|   <PcdCoded> | ||||
|     <PcdEntry PcdItemType="FIXED_AT_BUILD"> | ||||
|       <C_Name>PcdDebugPropertyMask</C_Name> | ||||
|       <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName> | ||||
|       <HelpText>The bitmask of flags that specify the enable/disable of Debug | ||||
|                 Assert, Debug Print, Debug Code, Clear Memory, Assert | ||||
|                 Breakpoint and Assert Deadloop.</HelpText> | ||||
|     </PcdEntry> | ||||
|     <PcdEntry PcdItemType="FIXED_AT_BUILD"> | ||||
|       <C_Name>PcdDebugClearMemoryValue</C_Name> | ||||
|       <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName> | ||||
|       <HelpText>The value used by DebugClearMemory () to fill a certain range | ||||
|                 of memory.</HelpText> | ||||
|     </PcdEntry> | ||||
|     <PcdEntry PcdItemType="DYNAMIC"> | ||||
|       <C_Name>PcdDebugPrintErrorLevel</C_Name> | ||||
|       <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName> | ||||
|       <HelpText>The bitmask of flags that specify the kind of debug message | ||||
|                 output when Debug Print is enabled.</HelpText> | ||||
|     </PcdEntry> | ||||
|   </PcdCoded> | ||||
| </ModuleSurfaceArea> | ||||
| @ -0,0 +1,58 @@ | ||||
| #/** @file | ||||
| # Report status code library | ||||
| # | ||||
| # ReportStatusCodeLib for PEIM which depends upon Pei Services table | ||||
| # Copyright (c) 2006 - 2007, 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. | ||||
| # | ||||
| # | ||||
| #**/ | ||||
| 
 | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x00010005 | ||||
|   BASE_NAME                      = PeiReportStatusCodeLib | ||||
|   FILE_GUID                      = 8c690838-7a22-45c4-aa58-a33e3e515cd4 | ||||
|   MODULE_TYPE                    = PEIM | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = ReportStatusCodeLib|PEIM PEI_CORE | ||||
|   EDK_RELEASE_VERSION            = 0x00020000 | ||||
|   EFI_SPECIFICATION_VERSION      = 0x00020000 | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
| # The following information is for reference only and not required by the build tools. | ||||
| # | ||||
| #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC | ||||
| # | ||||
| 
 | ||||
| [Sources.common] | ||||
|   ReportStatusCodeLib.c | ||||
| 
 | ||||
| 
 | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   IntelFrameworkPkg/IntelFrameworkPkg.dec | ||||
|   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec | ||||
| 
 | ||||
| [LibraryClasses] | ||||
|   PcdLib | ||||
|   PeiServicesTablePointerLib | ||||
|   BaseMemoryLib | ||||
|   BaseLib | ||||
|   DebugLib | ||||
| 
 | ||||
| 
 | ||||
| [Guids] | ||||
|   gEfiStatusCodeSpecificDataGuid                # ALWAYS_CONSUMED | ||||
|   gEfiStatusCodeDataTypeDebugGuid               # ALWAYS_CONSUMED | ||||
| 
 | ||||
| 
 | ||||
| [PcdsFixedAtBuild.common] | ||||
|   PcdReportStatusCodePropertyMask|gEfiMdePkgTokenSpaceGuid | ||||
| 
 | ||||
| @ -0,0 +1,70 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||||
|   <MsaHeader> | ||||
|     <ModuleName>PeiReportStatusCodeLib</ModuleName> | ||||
|     <ModuleType>PEIM</ModuleType> | ||||
|     <GuidValue>8c690838-7a22-45c4-aa58-a33e3e515cd4</GuidValue> | ||||
|     <Version>1.0</Version> | ||||
|     <Abstract>Report status code library</Abstract> | ||||
|     <Description>ReportStatusCodeLib for PEIM which depends upon Pei Services table</Description> | ||||
|     <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright> | ||||
|     <License>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.</License> | ||||
|     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification> | ||||
|   </MsaHeader> | ||||
|   <ModuleDefinitions> | ||||
|     <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures> | ||||
|     <BinaryModule>false</BinaryModule> | ||||
|     <OutputFileBasename>PeiReportStatusCodeLib</OutputFileBasename> | ||||
|   </ModuleDefinitions> | ||||
|   <LibraryClassDefinitions> | ||||
|     <LibraryClass Usage="ALWAYS_PRODUCED" SupModuleList="PEIM PEI_CORE"> | ||||
|       <Keyword>ReportStatusCodeLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>DebugLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseMemoryLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>PeiServicesTablePointerLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>PcdLib</Keyword> | ||||
|     </LibraryClass> | ||||
|   </LibraryClassDefinitions> | ||||
|   <SourceFiles> | ||||
|     <Filename>ReportStatusCodeLib.c</Filename> | ||||
|   </SourceFiles> | ||||
|   <PackageDependencies> | ||||
|     <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/> | ||||
|   </PackageDependencies> | ||||
|   <Guids> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeDataTypeDebugGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|     <GuidCNames Usage="ALWAYS_CONSUMED"> | ||||
|       <GuidCName>gEfiStatusCodeSpecificDataGuid</GuidCName> | ||||
|     </GuidCNames> | ||||
|   </Guids> | ||||
|   <Externs> | ||||
|     <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification> | ||||
|     <Specification>EDK_RELEASE_VERSION 0x00020000</Specification> | ||||
|   </Externs> | ||||
|   <PcdCoded> | ||||
|     <PcdEntry PcdItemType="FIXED_AT_BUILD"> | ||||
|       <C_Name>PcdReportStatusCodePropertyMask</C_Name> | ||||
|       <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName> | ||||
|       <HelpText>The bitmask of flags that specify the enable/disable of | ||||
|                 Progress Code, Error Code and Debug Code.</HelpText> | ||||
|     </PcdEntry> | ||||
|   </PcdCoded> | ||||
| </ModuleSurfaceArea> | ||||
| @ -0,0 +1,531 @@ | ||||
| /** @file
 | ||||
|   Report Status Code Library for DXE Phase. | ||||
| 
 | ||||
|   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
 | ||||
| 
 | ||||
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| 
 | ||||
| **/ | ||||
| 
 | ||||
| 
 | ||||
| #include <FrameworkPei.h> | ||||
| 
 | ||||
| #include <Guid/StatusCodeDataTypeId.h> | ||||
| 
 | ||||
| #include <Library/ReportStatusCodeLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/PeiServicesTablePointerLib.h> | ||||
| #include <Library/PcdLib.h> | ||||
| 
 | ||||
| #include <DebugInfo.h> | ||||
| 
 | ||||
| //
 | ||||
| // Define the maximum extended data size that is supported in the PEI phase
 | ||||
| //
 | ||||
| #define MAX_EXTENDED_DATA_SIZE  0x200 | ||||
| 
 | ||||
| /**
 | ||||
|   Internal worker function that reports a status code through the Status Code Protocol | ||||
| 
 | ||||
|   This function checks to see if a Status Code Protocol is present in the handle | ||||
|   database.  If a Status Code Protocol is not present, then EFI_UNSUPPORTED is | ||||
|   returned.  If a Status Code Protocol is present, then it is cached in gStatusCode, | ||||
|   and the ReportStatusCode() service of the Status Code Protocol is called passing in | ||||
|   Type, Value, Instance, CallerId, and Data.  The result of this call is returned. | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  Instance          Status code instance number. | ||||
|   @param  CallerId          Pointer to a GUID that identifies the caller of this | ||||
|                             function.  This is an optional parameter that may be | ||||
|                             NULL. | ||||
|   @param  Data              Pointer to the extended data buffer.  This is an | ||||
|                             optional parameter that may be NULL. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to report the status code. | ||||
|   @retval  EFI_UNSUPPORTED       Status Code Protocol is not available. | ||||
| 
 | ||||
| **/ | ||||
| STATIC | ||||
| EFI_STATUS | ||||
| InternalReportStatusCode ( | ||||
|   IN EFI_STATUS_CODE_TYPE     Type, | ||||
|   IN EFI_STATUS_CODE_VALUE    Value, | ||||
|   IN UINT32                   Instance, | ||||
|   IN CONST EFI_GUID           *CallerId OPTIONAL, | ||||
|   IN EFI_STATUS_CODE_DATA     *Data     OPTIONAL | ||||
|   ) | ||||
| { | ||||
|   EFI_PEI_SERVICES  **PeiServices; | ||||
| 
 | ||||
|   PeiServices = GetPeiServicesTablePointer (); | ||||
|   return (*PeiServices)->ReportStatusCode ( | ||||
|                            PeiServices, | ||||
|                            Type, | ||||
|                            Value, | ||||
|                            Instance, | ||||
|                            (EFI_GUID *)CallerId, | ||||
|                            Data | ||||
|                            ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Converts a status code to an 8-bit POST code value. | ||||
| 
 | ||||
|   Converts the status code specified by CodeType and Value to an 8-bit POST code | ||||
|   and returns the 8-bit POST code in PostCode.  If CodeType is an | ||||
|   EFI_PROGRESS_CODE or CodeType is an EFI_ERROR_CODE, then bits 0..4 of PostCode | ||||
|   are set to bits 16..20 of Value, and bits 5..7 of PostCode are set to bits | ||||
|   24..26 of Value., and TRUE is returned.  Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If PostCode is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  CodeType  The type of status code being converted. | ||||
|   @param  Value     The status code value being converted. | ||||
|   @param  PostCode  A pointer to the 8-bit POST code value to return. | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by CodeType and Value was converted | ||||
|                   to an 8-bit POST code and returned in  PostCode. | ||||
|   @retval  FALSE  The status code specified by CodeType and Value could not be | ||||
|                   converted to an 8-bit POST code value. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| CodeTypeToPostCode ( | ||||
|   IN  EFI_STATUS_CODE_TYPE   CodeType, | ||||
|   IN  EFI_STATUS_CODE_VALUE  Value, | ||||
|   OUT UINT8                  *PostCode | ||||
|   ) | ||||
| { | ||||
|   //
 | ||||
|   // If PostCode is NULL, then ASSERT()
 | ||||
|   //
 | ||||
|   ASSERT (PostCode != NULL); | ||||
| 
 | ||||
|   //
 | ||||
|   // Convert Value to an 8 bit post code
 | ||||
|   //
 | ||||
|   if (((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) || | ||||
|       ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE)       ) { | ||||
|     *PostCode  = (UINT8) ((((Value & EFI_STATUS_CODE_CLASS_MASK) >> 24) << 5) | | ||||
|                           (((Value & EFI_STATUS_CODE_SUBCLASS_MASK) >> 16) & 0x1f)); | ||||
|     return TRUE; | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Extracts ASSERT() information from a status code structure. | ||||
| 
 | ||||
|   Converts the status code specified by CodeType, Value, and Data to the ASSERT() | ||||
|   arguments specified by Filename, Description, and LineNumber.  If CodeType is | ||||
|   an EFI_ERROR_CODE, and CodeType has a severity of EFI_ERROR_UNRECOVERED, and | ||||
|   Value has an operation mask of EFI_SW_EC_ILLEGAL_SOFTWARE_STATE, extract | ||||
|   Filename, Description, and LineNumber from the optional data area of the | ||||
|   status code buffer specified by Data.  The optional data area of Data contains | ||||
|   a Null-terminated ASCII string for the FileName, followed by a Null-terminated | ||||
|   ASCII string for the Description, followed by a 32-bit LineNumber.  If the | ||||
|   ASSERT() information could be extracted from Data, then return TRUE. | ||||
|   Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If Data is NULL, then ASSERT(). | ||||
|   If Filename is NULL, then ASSERT(). | ||||
|   If Description is NULL, then ASSERT(). | ||||
|   If LineNumber is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  CodeType     The type of status code being converted. | ||||
|   @param  Value        The status code value being converted. | ||||
|   @param  Data         Pointer to status code data buffer. | ||||
|   @param  Filename     Pointer to the source file name that generated the ASSERT(). | ||||
|   @param  Description  Pointer to the description of the ASSERT(). | ||||
|   @param  LineNumber   Pointer to source line number that generated the ASSERT(). | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by CodeType, Value, and Data was | ||||
|                   converted ASSERT() arguments specified by Filename, Description, | ||||
|                   and LineNumber. | ||||
|   @retval  FALSE  The status code specified by CodeType, Value, and Data could | ||||
|                   not be converted to ASSERT() arguments. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportStatusCodeExtractAssertInfo ( | ||||
|   IN EFI_STATUS_CODE_TYPE        CodeType, | ||||
|   IN EFI_STATUS_CODE_VALUE       Value, | ||||
|   IN CONST EFI_STATUS_CODE_DATA  *Data, | ||||
|   OUT CHAR8                      **Filename, | ||||
|   OUT CHAR8                      **Description, | ||||
|   OUT UINT32                     *LineNumber | ||||
|   ) | ||||
| { | ||||
|   EFI_DEBUG_ASSERT_DATA  *AssertData; | ||||
| 
 | ||||
|   ASSERT (Data        != NULL); | ||||
|   ASSERT (Filename    != NULL); | ||||
|   ASSERT (Description != NULL); | ||||
|   ASSERT (LineNumber  != NULL); | ||||
| 
 | ||||
|   if (((CodeType & EFI_STATUS_CODE_TYPE_MASK)      == EFI_ERROR_CODE) && | ||||
|       ((CodeType & EFI_STATUS_CODE_SEVERITY_MASK)  == EFI_ERROR_UNRECOVERED) && | ||||
|       ((Value    & EFI_STATUS_CODE_OPERATION_MASK) == EFI_SW_EC_ILLEGAL_SOFTWARE_STATE)) { | ||||
|     AssertData   = (EFI_DEBUG_ASSERT_DATA *)(Data + 1); | ||||
|     *Filename    = (CHAR8 *)(AssertData + 1); | ||||
|     *Description = *Filename + AsciiStrLen (*Filename) + 1; | ||||
|     *LineNumber  = AssertData->LineNumber; | ||||
|     return TRUE; | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Extracts DEBUG() information from a status code structure. | ||||
| 
 | ||||
|   Converts the status code specified by Data to the DEBUG() arguments specified | ||||
|   by ErrorLevel, Marker, and Format.  If type GUID in Data is | ||||
|   EFI_STATUS_CODE_DATA_TYPE_DEBUG_GUID, then extract ErrorLevel, Marker, and | ||||
|   Format from the optional data area of the status code buffer specified by Data. | ||||
|   The optional data area of Data contains a 32-bit ErrorLevel followed by Marker | ||||
|   which is 12 UINTN parameters, followed by a Null-terminated ASCII string for | ||||
|   the Format.  If the DEBUG() information could be extracted from Data, then | ||||
|   return TRUE.  Otherwise, FALSE is returned. | ||||
| 
 | ||||
|   If Data is NULL, then ASSERT(). | ||||
|   If ErrorLevel is NULL, then ASSERT(). | ||||
|   If Marker is NULL, then ASSERT(). | ||||
|   If Format is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  Data        Pointer to status code data buffer. | ||||
|   @param  ErrorLevel  Pointer to error level mask for a debug message. | ||||
|   @param  Marker      Pointer to the variable argument list associated with Format. | ||||
|   @param  Format      Pointer to a Null-terminated ASCII format string of a | ||||
|                       debug message. | ||||
| 
 | ||||
|   @retval  TRUE   The status code specified by Data was converted DEBUG() arguments | ||||
|                   specified by ErrorLevel, Marker, and Format. | ||||
|   @retval  FALSE  The status code specified by Data could not be converted to | ||||
|                   DEBUG() arguments. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportStatusCodeExtractDebugInfo ( | ||||
|   IN CONST EFI_STATUS_CODE_DATA  *Data, | ||||
|   OUT UINT32                     *ErrorLevel, | ||||
|   OUT VA_LIST                    *Marker, | ||||
|   OUT CHAR8                      **Format | ||||
|   ) | ||||
| { | ||||
|   EFI_DEBUG_INFO  *DebugInfo; | ||||
| 
 | ||||
|   ASSERT (Data       != NULL); | ||||
|   ASSERT (ErrorLevel != NULL); | ||||
|   ASSERT (Marker     != NULL); | ||||
|   ASSERT (Format     != NULL); | ||||
| 
 | ||||
|   //
 | ||||
|   // If the GUID type is not EFI_STATUS_CODE_DATA_TYPE_DEBUG_GUID then return FALSE
 | ||||
|   //
 | ||||
|   if (!CompareGuid (&Data->Type, &gEfiStatusCodeDataTypeDebugGuid)) { | ||||
|     return FALSE; | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Retrieve the debug information from the status code record
 | ||||
|   //
 | ||||
|   DebugInfo = (EFI_DEBUG_INFO *)(Data + 1); | ||||
| 
 | ||||
|   *ErrorLevel = DebugInfo->ErrorLevel; | ||||
| 
 | ||||
|   //
 | ||||
|   // The first 12 * UINTN bytes of the string are really an
 | ||||
|   // argument stack to support varargs on the Format string.
 | ||||
|   //
 | ||||
|   *Marker = (VA_LIST) (DebugInfo + 1); | ||||
|   *Format = (CHAR8 *)(((UINT64 *)*Marker) + 12); | ||||
| 
 | ||||
|   return TRUE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code. | ||||
| 
 | ||||
|   Reports the status code specified by the parameters Type and Value.  Status | ||||
|   code also require an instance, caller ID, and extended data.  This function | ||||
|   passed in a zero instance, NULL extended data, and a caller ID of | ||||
|   gEfiCallerIdGuid, which is the GUID for the module. | ||||
| 
 | ||||
|   ReportStatusCode()must actively prevent recusrsion.  If ReportStatusCode() | ||||
|   is called while processing another any other Report Status Code Library function, | ||||
|   then ReportStatusCode() must return immediately. | ||||
| 
 | ||||
|   @param  Type   Status code type. | ||||
|   @param  Value  Status code value. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS       The status code was reported. | ||||
|   @retval  EFI_DEVICE_ERROR  There status code could not be reported due to a | ||||
|                              device error. | ||||
|   @retval  EFI_UNSUPPORTED   Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCode ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value | ||||
|   ) | ||||
| { | ||||
|   return InternalReportStatusCode (Type, Value, 0, &gEfiCallerIdGuid, NULL); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with a Device Path Protocol as the extended data. | ||||
| 
 | ||||
|   Allocates and fills in the extended data section of a status code with the | ||||
|   Device Path Protocol specified by DevicePath.  This function is responsible | ||||
|   for allocating a buffer large enough for the standard header and the device | ||||
|   path.  The standard header is filled in with a GUID of | ||||
|   gEfiStatusCodeSpecificDataGuid.  The status code is reported with a zero | ||||
|   instance and a caller ID of gEfiCallerIdGuid. | ||||
| 
 | ||||
|   ReportStatusCodeWithDevicePath()must actively prevent recursion.  If | ||||
|   ReportStatusCodeWithDevicePath() is called while processing another any other | ||||
|   Report Status Code Library function, then ReportStatusCodeWithDevicePath() | ||||
|   must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If DevicePath is NULL, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type        Status code type. | ||||
|   @param  Value       Status code value. | ||||
|   @param  DevicePath  Pointer to the Device Path Protocol to be reported. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported with the extended | ||||
|                                  data specified by DevicePath. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate the | ||||
|                                  extended data section. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeWithDevicePath ( | ||||
|   IN EFI_STATUS_CODE_TYPE            Type, | ||||
|   IN EFI_STATUS_CODE_VALUE           Value, | ||||
|   IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath | ||||
|   ) | ||||
| { | ||||
|   ASSERT (DevicePath != NULL); | ||||
|   return EFI_UNSUPPORTED; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with an extended data buffer. | ||||
| 
 | ||||
|   Allocates and fills in the extended data section of a status code with the | ||||
|   extended data specified by ExtendedData and ExtendedDataSize.  ExtendedData | ||||
|   is assumed to be one of the data structures specified in Related Definitions. | ||||
|   These data structure do not have the standard header, so this function is | ||||
|   responsible for allocating a buffer large enough for the standard header and | ||||
|   the extended data passed into this function.  The standard header is filled | ||||
|   in with a GUID of  gEfiStatusCodeSpecificDataGuid.  The status code is reported | ||||
|   with a zero instance and a caller ID of gEfiCallerIdGuid. | ||||
| 
 | ||||
|   ReportStatusCodeWithExtendedData()must actively prevent recursion.  If | ||||
|   ReportStatusCodeWithExtendedData() is called while processing another any other | ||||
|   Report Status Code Library function, then ReportStatusCodeWithExtendedData() | ||||
|   must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If ExtendedData is NULL, then ASSERT(). | ||||
|   If ExtendedDataSize is 0, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  ExtendedData      Pointer to the extended data buffer to be reported. | ||||
|   @param  ExtendedDataSize  The size, in bytes, of the extended data buffer to | ||||
|                             be reported. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported with the extended | ||||
|                                  data specified by ExtendedData and ExtendedDataSize. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate the | ||||
|                                  extended data section. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeWithExtendedData ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value, | ||||
|   IN CONST VOID             *ExtendedData, | ||||
|   IN UINTN                  ExtendedDataSize | ||||
|   ) | ||||
| { | ||||
|   ASSERT (ExtendedData     != NULL); | ||||
|   ASSERT (ExtendedDataSize != 0); | ||||
|   return ReportStatusCodeEx ( | ||||
|            Type, | ||||
|            Value, | ||||
|            0, | ||||
|            NULL, | ||||
|            NULL, | ||||
|            ExtendedData, | ||||
|            ExtendedDataSize | ||||
|            ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Reports a status code with full parameters. | ||||
| 
 | ||||
|   The function reports a status code.  If ExtendedData is NULL and ExtendedDataSize | ||||
|   is 0, then an extended data buffer is not reported.  If ExtendedData is not | ||||
|   NULL and ExtendedDataSize is not 0, then an extended data buffer is allocated. | ||||
|   ExtendedData is assumed not have the standard status code header, so this function | ||||
|   is responsible for allocating a buffer large enough for the standard header and | ||||
|   the extended data passed into this function.  The standard header is filled in | ||||
|   with a GUID specified by ExtendedDataGuid.  If ExtendedDataGuid is NULL, then a | ||||
|   GUID of gEfiStatusCodeSpecificDatauid is used.  The status code is reported with | ||||
|   an instance specified by Instance and a caller ID specified by CallerId.  If | ||||
|   CallerId is NULL, then a caller ID of gEfiCallerIdGuid is used. | ||||
| 
 | ||||
|   ReportStatusCodeEx()must actively prevent recursion.  If ReportStatusCodeEx() | ||||
|   is called while processing another any other Report Status Code Library function, | ||||
|   then ReportStatusCodeEx() must return EFI_DEVICE_ERROR immediately. | ||||
| 
 | ||||
|   If ExtendedData is NULL and ExtendedDataSize is not zero, then ASSERT(). | ||||
|   If ExtendedData is not NULL and ExtendedDataSize is zero, then ASSERT(). | ||||
| 
 | ||||
|   @param  Type              Status code type. | ||||
|   @param  Value             Status code value. | ||||
|   @param  Instance          Status code instance number. | ||||
|   @param  CallerId          Pointer to a GUID that identifies the caller of this | ||||
|                             function.  If this parameter is NULL, then a caller | ||||
|                             ID of gEfiCallerIdGuid is used. | ||||
|   @param  ExtendedDataGuid  Pointer to the GUID for the extended data buffer. | ||||
|                             If this parameter is NULL, then a the status code | ||||
|                             standard header is filled in with | ||||
|                             gEfiStatusCodeSpecificDataGuid. | ||||
|   @param  ExtendedData      Pointer to the extended data buffer.  This is an | ||||
|                             optional parameter that may be NULL. | ||||
|   @param  ExtendedDataSize  The size, in bytes, of the extended data buffer. | ||||
| 
 | ||||
|   @retval  EFI_SUCCESS           The status code was reported. | ||||
|   @retval  EFI_OUT_OF_RESOURCES  There were not enough resources to allocate | ||||
|                                  the extended data section if it was specified. | ||||
|   @retval  EFI_UNSUPPORTED       Report status code is not supported | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportStatusCodeEx ( | ||||
|   IN EFI_STATUS_CODE_TYPE   Type, | ||||
|   IN EFI_STATUS_CODE_VALUE  Value, | ||||
|   IN UINT32                 Instance, | ||||
|   IN CONST EFI_GUID         *CallerId          OPTIONAL, | ||||
|   IN CONST EFI_GUID         *ExtendedDataGuid  OPTIONAL, | ||||
|   IN CONST VOID             *ExtendedData      OPTIONAL, | ||||
|   IN UINTN                  ExtendedDataSize | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS_CODE_DATA  *StatusCodeData; | ||||
|   UINT64                Buffer[MAX_EXTENDED_DATA_SIZE / sizeof (UINT64)]; | ||||
| 
 | ||||
|   ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0))); | ||||
|   ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0))); | ||||
| 
 | ||||
|   if (ExtendedDataSize > (MAX_EXTENDED_DATA_SIZE - sizeof (EFI_STATUS_CODE_DATA))) { | ||||
|     return EFI_OUT_OF_RESOURCES; | ||||
|   } | ||||
|   StatusCodeData = (EFI_STATUS_CODE_DATA  *)Buffer; | ||||
|   StatusCodeData->HeaderSize = sizeof (EFI_STATUS_CODE_DATA); | ||||
|   StatusCodeData->Size = (UINT16)ExtendedDataSize; | ||||
|   if (ExtendedDataGuid == NULL) { | ||||
|     ExtendedDataGuid = &gEfiStatusCodeSpecificDataGuid; | ||||
|   } | ||||
|   CopyGuid (&StatusCodeData->Type, ExtendedDataGuid); | ||||
|   CopyMem (StatusCodeData + 1, ExtendedData, ExtendedDataSize); | ||||
|   if (CallerId == NULL) { | ||||
|     CallerId = &gEfiCallerIdGuid; | ||||
|   } | ||||
|   return InternalReportStatusCode (Type, Value, Instance, CallerId, StatusCodeData); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportProgressCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED) != 0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_ERROR_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportErrorCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED) != 0); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled | ||||
| 
 | ||||
|   This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED | ||||
|   bit of PcdReportStatusCodeProperyMask is set.  Otherwise FALSE is returned. | ||||
| 
 | ||||
|   @retval  TRUE   The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is set. | ||||
|   @retval  FALSE  The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of | ||||
|                   PcdReportStatusCodeProperyMask is clear. | ||||
| 
 | ||||
| **/ | ||||
| BOOLEAN | ||||
| EFIAPI | ||||
| ReportDebugCodeEnabled ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return (BOOLEAN) ((PcdGet8(PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED) != 0); | ||||
| } | ||||
| @ -14,6 +14,7 @@ | ||||
| **/ | ||||
| 
 | ||||
| #include "DxeStatusCode.h" | ||||
| #include "DebugInfo.h" | ||||
| 
 | ||||
| STATIC | ||||
| EFI_SERIAL_IO_PROTOCOL *mSerialIoProtocol; | ||||
|  | ||||
| @ -16,6 +16,7 @@ | ||||
| **/ | ||||
| 
 | ||||
| #include "PeiStatusCode.h" | ||||
| #include "DebugInfo.h" | ||||
| 
 | ||||
| /**
 | ||||
|   Convert status code value and extended data to readable ASCII string, send string to serial I/O device. | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user