PI 1.1 SMM Feature Check-in
1. Add SmmReportStatusCodeLib library instance. 2. Add StatusCodeHandler Smm part git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9593 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		@@ -119,6 +119,13 @@
 | 
				
			|||||||
  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
 | 
					  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
 | 
				
			||||||
  IoLib|IntelFrameworkPkg/Library/DxeIoLibCpuIo/DxeIoLibCpuIo.inf
 | 
					  IoLib|IntelFrameworkPkg/Library/DxeIoLibCpuIo/DxeIoLibCpuIo.inf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[LibraryClasses.common.DXE_SMM_DRIVER]
 | 
				
			||||||
 | 
					  SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf
 | 
				
			||||||
 | 
					  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/SmmReportStatusCodeLib/SmmReportStatusCodeLib.inf
 | 
				
			||||||
 | 
					  UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
 | 
				
			||||||
 | 
					  PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
 | 
				
			||||||
 | 
					  UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Pcd Section - list of all EDK II PCD Entries defined by this Platform
 | 
					# Pcd Section - list of all EDK II PCD Entries defined by this Platform
 | 
				
			||||||
@@ -188,6 +195,7 @@
 | 
				
			|||||||
  IntelFrameworkModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
 | 
					  IntelFrameworkModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
 | 
					  IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Library/SmmRuntimeDxeReportStatusCodeLibFramework/SmmRuntimeDxeReportStatusCodeLibFramework.inf
 | 
					  IntelFrameworkModulePkg/Library/SmmRuntimeDxeReportStatusCodeLibFramework/SmmRuntimeDxeReportStatusCodeLibFramework.inf
 | 
				
			||||||
 | 
					  IntelFrameworkModulePkg/Library/SmmReportStatusCodeLib/SmmReportStatusCodeLib.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
 | 
					  IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
 | 
					  IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
 | 
					  IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
 | 
				
			||||||
@@ -213,8 +221,10 @@
 | 
				
			|||||||
  IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
 | 
					  IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf
 | 
					  IntelFrameworkModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 | 
					  IntelFrameworkModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 | 
				
			||||||
 | 
					  IntelFrameworkModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerSmm.inf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Components.X64]
 | 
					[Components.X64]
 | 
				
			||||||
  IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
 | 
					  IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf
 | 
					  IntelFrameworkModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf
 | 
				
			||||||
  IntelFrameworkModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 | 
					  IntelFrameworkModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
 | 
				
			||||||
 | 
					  IntelFrameworkModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerSmm.inf  
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@
 | 
				
			|||||||
  FILE_GUID                      = 3ddc3b12-99ea-4364-b315-6310a2050be5
 | 
					  FILE_GUID                      = 3ddc3b12-99ea-4364-b315-6310a2050be5
 | 
				
			||||||
  MODULE_TYPE                    = DXE_DRIVER
 | 
					  MODULE_TYPE                    = DXE_DRIVER
 | 
				
			||||||
  VERSION_STRING                 = 1.0
 | 
					  VERSION_STRING                 = 1.0
 | 
				
			||||||
  LIBRARY_CLASS                  = ReportStatusCodeLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
 | 
					  LIBRARY_CLASS                  = ReportStatusCodeLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# The following information is for reference only and not required by the build tools.
 | 
					# The following information is for reference only and not required by the build tools.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@
 | 
				
			|||||||
  FILE_GUID                      = bda39d3a-451b-4350-8266-81ab10fa0523
 | 
					  FILE_GUID                      = bda39d3a-451b-4350-8266-81ab10fa0523
 | 
				
			||||||
  MODULE_TYPE                    = PEIM
 | 
					  MODULE_TYPE                    = PEIM
 | 
				
			||||||
  VERSION_STRING                 = 1.0
 | 
					  VERSION_STRING                 = 1.0
 | 
				
			||||||
  LIBRARY_CLASS                  = DebugLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER PEIM SEC PEI_CORE UEFI_APPLICATION UEFI_DRIVER
 | 
					  LIBRARY_CLASS                  = DebugLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE PEIM SEC PEI_CORE UEFI_APPLICATION UEFI_DRIVER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# The following information is for reference only and not required by the build tools.
 | 
					# The following information is for reference only and not required by the build tools.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,551 @@
 | 
				
			|||||||
 | 
					/** @file
 | 
				
			||||||
 | 
					  Report Status Code Library for SMM Phase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright (c)  2009, 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 <Library/ReportStatusCodeLib.h>
 | 
				
			||||||
 | 
					#include <Library/DebugLib.h>
 | 
				
			||||||
 | 
					#include <Library/SmmServicesTableLib.h>
 | 
				
			||||||
 | 
					#include <Library/BaseLib.h>
 | 
				
			||||||
 | 
					#include <Library/BaseMemoryLib.h>
 | 
				
			||||||
 | 
					#include <Library/PcdLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Guid/StatusCodeDataTypeId.h>
 | 
				
			||||||
 | 
					#include <Guid/StatusCodeDataTypeDebug.h>
 | 
				
			||||||
 | 
					#include <Protocol/SmmStatusCode.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EFI_SMM_REPORT_STATUS_CODE     mReportStatusCode = NULL;
 | 
				
			||||||
 | 
					EFI_SMM_STATUS_CODE_PROTOCOL   *mStatusCodeProtocol = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Locate the report status code service.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @return   Function pointer to the report status code service.
 | 
				
			||||||
 | 
					            NULL is returned if no status code service is available.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_SMM_REPORT_STATUS_CODE
 | 
				
			||||||
 | 
					InternalGetReportStatusCode (
 | 
				
			||||||
 | 
					  VOID
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  EFI_STATUS                    Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Status = gSmst->SmmLocateProtocol (&gEfiSmmStatusCodeProtocolGuid, NULL, (VOID**)&mStatusCodeProtocol);
 | 
				
			||||||
 | 
					  if (!EFI_ERROR (Status) && mStatusCodeProtocol != NULL) {
 | 
				
			||||||
 | 
					    return mStatusCodeProtocol->ReportStatusCode;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Internal worker function that reports a status code through the status code service.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  If status code service is not cached, then this function checks if status code service is
 | 
				
			||||||
 | 
					  available in system.  If status code service is not available, then EFI_UNSUPPORTED is
 | 
				
			||||||
 | 
					  returned.  If status code service is present, then it is cached in mReportStatusCode.
 | 
				
			||||||
 | 
					  Finally this function reports status code through the status code service.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @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_UNSUPPORTED   Status code service is not available.
 | 
				
			||||||
 | 
					  @retval EFI_UNSUPPORTED   Status code type is not supported.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if ((ReportProgressCodeEnabled() && ((Type) & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) ||
 | 
				
			||||||
 | 
					      (ReportErrorCodeEnabled() && ((Type) & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE) ||
 | 
				
			||||||
 | 
					      (ReportDebugCodeEnabled() && ((Type) & EFI_STATUS_CODE_TYPE_MASK) == EFI_DEBUG_CODE)) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // If mReportStatusCode is NULL, then check if status code service is available in system.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    if (mReportStatusCode == NULL) {
 | 
				
			||||||
 | 
					      mReportStatusCode = InternalGetReportStatusCode ();
 | 
				
			||||||
 | 
					      if (mReportStatusCode == NULL) {
 | 
				
			||||||
 | 
					        return EFI_UNSUPPORTED;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // A status code service is present in system, so pass in all the parameters to the service.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    return (*mReportStatusCode) (mStatusCodeProtocol, Type, Value, Instance, (EFI_GUID *)CallerId, Data);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  return EFI_UNSUPPORTED;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  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 BASE_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 * sizeof (UINT64) bytes following EFI_DEBUG_INFO are for variable arguments
 | 
				
			||||||
 | 
					  // of format in DEBUG string. Its address is returned in Marker and has to be 64-bit aligned.
 | 
				
			||||||
 | 
					  // It must be noticed that EFI_DEBUG_INFO follows EFI_STATUS_CODE_DATA, whose size is
 | 
				
			||||||
 | 
					  // 20 bytes. The size of EFI_DEBUG_INFO is 4 bytes, so we can ensure that Marker
 | 
				
			||||||
 | 
					  // returned is 64-bit aligned.
 | 
				
			||||||
 | 
					  // 64-bit aligned is a must, otherwise retrieving 64-bit parameter from BASE_LIST will
 | 
				
			||||||
 | 
					  // cause unalignment exception.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  *Marker = (BASE_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 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 gEfiStatusCodeSpecificDataGuid 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 (gSmst == NULL || gSmst->SmmAllocatePool == NULL || gSmst->SmmFreePool == NULL) {
 | 
				
			||||||
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Allocate space for the Status Code Header and its buffer
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  StatusCodeData = NULL;
 | 
				
			||||||
 | 
					  gSmst->SmmAllocatePool (EfiRuntimeServicesData, 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
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  if (ExtendedData != NULL) {
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  gSmst->SmmFreePool (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,57 @@
 | 
				
			|||||||
 | 
					#/** @file
 | 
				
			||||||
 | 
					#  SMM report status code library
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Retrieve status code and report status code in SMM phase
 | 
				
			||||||
 | 
					#  Copyright (c) 2009, 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                      = SmmReportStatusCodeLib
 | 
				
			||||||
 | 
					  FILE_GUID                      = 67089D19-B3D6-4d9e-A0EB-FEDC1F83A1EE
 | 
				
			||||||
 | 
					  MODULE_TYPE                    = DXE_SMM_DRIVER
 | 
				
			||||||
 | 
					  VERSION_STRING                 = 1.0
 | 
				
			||||||
 | 
					  PI_SPECIFICATION_VERSION       = 0x0001000A
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  LIBRARY_CLASS                  = ReportStatusCodeLib| DXE_SMM_DRIVER SMM_CORE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The following information is for reference only and not required by the build tools.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  VALID_ARCHITECTURES           = IA32 X64
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Sources.common]
 | 
				
			||||||
 | 
					  ReportStatusCodeLib.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Packages]
 | 
				
			||||||
 | 
					  MdePkg/MdePkg.dec
 | 
				
			||||||
 | 
					  IntelFrameworkPkg/IntelFrameworkPkg.dec
 | 
				
			||||||
 | 
					  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[LibraryClasses]
 | 
				
			||||||
 | 
					  PcdLib
 | 
				
			||||||
 | 
					  BaseMemoryLib
 | 
				
			||||||
 | 
					  SmmServicesTableLib
 | 
				
			||||||
 | 
					  DebugLib
 | 
				
			||||||
 | 
					  UefiDriverEntryPoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Guids]
 | 
				
			||||||
 | 
					  gEfiStatusCodeSpecificDataGuid                ## CONSUMES
 | 
				
			||||||
 | 
					  gEfiStatusCodeDataTypeDebugGuid               ## CONSUMES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Protocols]
 | 
				
			||||||
 | 
					  gEfiSmmStatusCodeProtocolGuid                 ## CONSUMES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Pcd.common]
 | 
				
			||||||
 | 
					  gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,114 @@
 | 
				
			|||||||
 | 
					/** @file
 | 
				
			||||||
 | 
					  Runtime memory status code worker.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright (c) 2006 - 2009, 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.             
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "StatusCodeHandlerSmm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUNTIME_MEMORY_STATUSCODE_HEADER  *mSmmMemoryStatusCodeTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Initialize SMM memory status code table as initialization for memory status code worker
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS  SMM memory status code table successfully initialized.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					MemoryStatusCodeInitializeWorker (
 | 
				
			||||||
 | 
					  VOID
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Allocate SMM memory status code pool.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  Status = gSmst->SmmAllocatePool (
 | 
				
			||||||
 | 
					                       EfiRuntimeServicesData,
 | 
				
			||||||
 | 
					                       sizeof (RUNTIME_MEMORY_STATUSCODE_HEADER) + PcdGet16 (PcdStatusCodeMemorySize) * 1024,
 | 
				
			||||||
 | 
					                       (VOID**)&mSmmMemoryStatusCodeTable
 | 
				
			||||||
 | 
					                       );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ASSERT_EFI_ERROR(Status);
 | 
				
			||||||
 | 
					  ASSERT (mSmmMemoryStatusCodeTable != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mSmmMemoryStatusCodeTable->RecordIndex      = 0;
 | 
				
			||||||
 | 
					  mSmmMemoryStatusCodeTable->NumberOfRecords  = 0;
 | 
				
			||||||
 | 
					  mSmmMemoryStatusCodeTable->MaxRecordsNumber = 
 | 
				
			||||||
 | 
					    (PcdGet16 (PcdStatusCodeMemorySize) * 1024) / sizeof (MEMORY_STATUSCODE_RECORD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Report status code into runtime memory. If the runtime pool is full, roll back to the 
 | 
				
			||||||
 | 
					  first record and overwrite it.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @param  CodeType                Indicates the type of status code being reported.
 | 
				
			||||||
 | 
					  @param  Value                   Describes the current status of a hardware or software entity.
 | 
				
			||||||
 | 
					                                  This included information about the class and subclass that is used to
 | 
				
			||||||
 | 
					                                  classify the entity as well as an operation.
 | 
				
			||||||
 | 
					  @param  Instance                The enumeration of a hardware or software entity within
 | 
				
			||||||
 | 
					                                  the system. Valid instance numbers start with 1.
 | 
				
			||||||
 | 
					  @param  CallerId                This optional parameter may be used to identify the caller.
 | 
				
			||||||
 | 
					                                  This parameter allows the status code driver to apply different rules to
 | 
				
			||||||
 | 
					                                  different callers.
 | 
				
			||||||
 | 
					  @param  Data                    This optional parameter may be used to pass additional data.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					MemoryStatusCodeReportWorker (
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_TYPE               CodeType,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_VALUE              Value,
 | 
				
			||||||
 | 
					  IN UINT32                             Instance,
 | 
				
			||||||
 | 
					  IN EFI_GUID                           *CallerId,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_DATA               *Data OPTIONAL
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  MEMORY_STATUSCODE_RECORD              *Record;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Locate current record buffer.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  Record = (MEMORY_STATUSCODE_RECORD *) (mSmmMemoryStatusCodeTable + 1);
 | 
				
			||||||
 | 
					  Record = &Record[mSmmMemoryStatusCodeTable->RecordIndex++];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Save status code.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  Record->CodeType = CodeType;
 | 
				
			||||||
 | 
					  Record->Value    = Value;
 | 
				
			||||||
 | 
					  Record->Instance = Instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // If record index equals to max record number, then wrap around record index to zero.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // The reader of status code should compare the number of records with max records number,
 | 
				
			||||||
 | 
					  // If it is equal to or larger than the max number, then the wrap-around had happened,
 | 
				
			||||||
 | 
					  // so the first record is pointed by record index.
 | 
				
			||||||
 | 
					  // If it is less then max number, index of the first record is zero.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  mSmmMemoryStatusCodeTable->NumberOfRecords++;
 | 
				
			||||||
 | 
					  if (mSmmMemoryStatusCodeTable->RecordIndex == mSmmMemoryStatusCodeTable->MaxRecordsNumber) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Wrap around record index.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    mSmmMemoryStatusCodeTable->RecordIndex = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,148 @@
 | 
				
			|||||||
 | 
					/** @file
 | 
				
			||||||
 | 
					  Serial I/O status code reporting worker.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright (c) 2009, 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.             
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "StatusCodeHandlerSmm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Convert status code value and extended data to readable ASCII string, send string to serial I/O device.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @param  CodeType         Indicates the type of status code being reported.
 | 
				
			||||||
 | 
					  @param  Value            Describes the current status of a hardware or software entity.
 | 
				
			||||||
 | 
					                           This included information about the class and subclass that is used to
 | 
				
			||||||
 | 
					                           classify the entity as well as an operation.
 | 
				
			||||||
 | 
					  @param  Instance         The enumeration of a hardware or software entity within
 | 
				
			||||||
 | 
					                           the system. Valid instance numbers start with 1.
 | 
				
			||||||
 | 
					  @param  CallerId         This optional parameter may be used to identify the caller.
 | 
				
			||||||
 | 
					                           This parameter allows the status code driver to apply different rules to
 | 
				
			||||||
 | 
					                           different callers.
 | 
				
			||||||
 | 
					  @param  Data             This optional parameter may be used to pass additional data.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS      Status code reported to serial I/O successfully.
 | 
				
			||||||
 | 
					  @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called.
 | 
				
			||||||
 | 
					  @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					SerialStatusCodeReportWorker (
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_TYPE     CodeType,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_VALUE    Value,
 | 
				
			||||||
 | 
					  IN UINT32                   Instance,
 | 
				
			||||||
 | 
					  IN EFI_GUID                 *CallerId,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  CHAR8           *Filename;
 | 
				
			||||||
 | 
					  CHAR8           *Description;
 | 
				
			||||||
 | 
					  CHAR8           *Format;
 | 
				
			||||||
 | 
					  CHAR8           Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE];
 | 
				
			||||||
 | 
					  UINT32          ErrorLevel;
 | 
				
			||||||
 | 
					  UINT32          LineNumber;
 | 
				
			||||||
 | 
					  UINTN           CharCount;
 | 
				
			||||||
 | 
					  BASE_LIST       Marker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Buffer[0] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Data != NULL &&
 | 
				
			||||||
 | 
					      ReportStatusCodeExtractAssertInfo (CodeType, Value, Data, &Filename, &Description, &LineNumber)) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Print ASSERT() information into output buffer.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    CharCount = AsciiSPrint (
 | 
				
			||||||
 | 
					                  Buffer,
 | 
				
			||||||
 | 
					                  sizeof (Buffer),
 | 
				
			||||||
 | 
					                  "\n\rDXE_ASSERT!: %a (%d): %a\n\r",
 | 
				
			||||||
 | 
					                  Filename,
 | 
				
			||||||
 | 
					                  LineNumber,
 | 
				
			||||||
 | 
					                  Description
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					  } else if (Data != NULL &&
 | 
				
			||||||
 | 
					             ReportStatusCodeExtractDebugInfo (Data, &ErrorLevel, &Marker, &Format)) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Print DEBUG() information into output buffer.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    CharCount = AsciiBSPrint (
 | 
				
			||||||
 | 
					                  Buffer, 
 | 
				
			||||||
 | 
					                  sizeof (Buffer), 
 | 
				
			||||||
 | 
					                  Format, 
 | 
				
			||||||
 | 
					                  Marker
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					  } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Print ERROR information into output buffer.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    CharCount = AsciiSPrint (
 | 
				
			||||||
 | 
					                  Buffer, 
 | 
				
			||||||
 | 
					                  sizeof (Buffer), 
 | 
				
			||||||
 | 
					                  "ERROR: C%x:V%x I%x", 
 | 
				
			||||||
 | 
					                  CodeType, 
 | 
				
			||||||
 | 
					                  Value, 
 | 
				
			||||||
 | 
					                  Instance
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    if (CallerId != NULL) {
 | 
				
			||||||
 | 
					      CharCount += AsciiSPrint (
 | 
				
			||||||
 | 
					                     &Buffer[CharCount - 1],
 | 
				
			||||||
 | 
					                     (sizeof (Buffer) - (sizeof (Buffer[0]) * CharCount)),
 | 
				
			||||||
 | 
					                     " %g",
 | 
				
			||||||
 | 
					                     CallerId
 | 
				
			||||||
 | 
					                     );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Data != NULL) {
 | 
				
			||||||
 | 
					      CharCount += AsciiSPrint (
 | 
				
			||||||
 | 
					                     &Buffer[CharCount - 1],
 | 
				
			||||||
 | 
					                     (sizeof (Buffer) - (sizeof (Buffer[0]) * CharCount)),
 | 
				
			||||||
 | 
					                     " %x",
 | 
				
			||||||
 | 
					                     Data
 | 
				
			||||||
 | 
					                     );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CharCount += AsciiSPrint (
 | 
				
			||||||
 | 
					                   &Buffer[CharCount - 1],
 | 
				
			||||||
 | 
					                   (sizeof (Buffer) - (sizeof (Buffer[0]) * CharCount)),
 | 
				
			||||||
 | 
					                   "\n\r"
 | 
				
			||||||
 | 
					                   );
 | 
				
			||||||
 | 
					  } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Print PROGRESS information into output buffer.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    CharCount = AsciiSPrint (
 | 
				
			||||||
 | 
					                  Buffer, 
 | 
				
			||||||
 | 
					                  sizeof (Buffer), 
 | 
				
			||||||
 | 
					                  "PROGRESS CODE: V%x I%x\n\r", 
 | 
				
			||||||
 | 
					                  Value, 
 | 
				
			||||||
 | 
					                  Instance
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Code type is not defined.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    CharCount = AsciiSPrint (
 | 
				
			||||||
 | 
					                  Buffer, 
 | 
				
			||||||
 | 
					                  sizeof (Buffer), 
 | 
				
			||||||
 | 
					                  "Undefined: C%x:V%x I%x\n\r", 
 | 
				
			||||||
 | 
					                  CodeType, 
 | 
				
			||||||
 | 
					                  Value, 
 | 
				
			||||||
 | 
					                  Instance
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Call SerialPort Lib function to do print.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  SerialPortWrite ((UINT8 *) Buffer, CharCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					/** @file
 | 
				
			||||||
 | 
					  Status Code Handler Driver which produces general handlers and hook them
 | 
				
			||||||
 | 
					  onto the SMM status code router.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright (c) 2009, 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "StatusCodeHandlerSmm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EFI_SMM_RSC_HANDLER_PROTOCOL  *mRscHandlerProtocol       = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Dispatch initialization request to sub status code devices based on 
 | 
				
			||||||
 | 
					  customized feature flags.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					VOID
 | 
				
			||||||
 | 
					InitializationDispatcherWorker (
 | 
				
			||||||
 | 
					  VOID
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  EFI_STATUS                        Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // If enable UseSerial, then initialize serial port.
 | 
				
			||||||
 | 
					  // if enable UseRuntimeMemory, then initialize runtime memory status code worker.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  if (FeaturePcdGet (PcdStatusCodeUseSerial)) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Call Serial Port Lib API to initialize serial port.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    Status = SerialPortInitialize ();
 | 
				
			||||||
 | 
					    ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (FeaturePcdGet (PcdStatusCodeUseMemory)) {
 | 
				
			||||||
 | 
					    Status = MemoryStatusCodeInitializeWorker ();
 | 
				
			||||||
 | 
					    ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Entry point of SMM Status Code Driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function is the entry point of SMM Status Code Driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @param  ImageHandle       The firmware allocated handle for the EFI image.
 | 
				
			||||||
 | 
					  @param  SystemTable       A pointer to the EFI System Table.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS       The entry point is executed successfully.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					EFIAPI
 | 
				
			||||||
 | 
					StatusCodeHandlerSmmEntry (
 | 
				
			||||||
 | 
					  IN EFI_HANDLE         ImageHandle,
 | 
				
			||||||
 | 
					  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  EFI_STATUS                Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Status = gSmst->SmmLocateProtocol (
 | 
				
			||||||
 | 
					                    &gEfiSmmRscHandlerProtocolGuid,
 | 
				
			||||||
 | 
					                    NULL,
 | 
				
			||||||
 | 
					                    (VOID **) &mRscHandlerProtocol
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Dispatch initialization request to supported devices
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  InitializationDispatcherWorker ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (FeaturePcdGet (PcdStatusCodeUseSerial)) {
 | 
				
			||||||
 | 
					    mRscHandlerProtocol->Register (SerialStatusCodeReportWorker);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (FeaturePcdGet (PcdStatusCodeUseMemory)) {
 | 
				
			||||||
 | 
					    mRscHandlerProtocol->Register (MemoryStatusCodeReportWorker);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,122 @@
 | 
				
			|||||||
 | 
					/** @file
 | 
				
			||||||
 | 
					  Internal include file for Status Code Handler Driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright (c) 2009, 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __STATUS_CODE_HANDLER_SMM_H__
 | 
				
			||||||
 | 
					#define __STATUS_CODE_HANDLER_SMM_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Protocol/SmmReportStatusCodeHandler.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Guid/MemoryStatusCodeRecord.h>
 | 
				
			||||||
 | 
					#include <Guid/StatusCodeDataTypeId.h>
 | 
				
			||||||
 | 
					#include <Guid/StatusCodeDataTypeDebug.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <Library/SynchronizationLib.h>
 | 
				
			||||||
 | 
					#include <Library/DebugLib.h>
 | 
				
			||||||
 | 
					#include <Library/ReportStatusCodeLib.h>
 | 
				
			||||||
 | 
					#include <Library/PrintLib.h>
 | 
				
			||||||
 | 
					#include <Library/PcdLib.h>
 | 
				
			||||||
 | 
					#include <Library/UefiDriverEntryPoint.h>
 | 
				
			||||||
 | 
					#include <Library/SmmServicesTableLib.h>
 | 
				
			||||||
 | 
					#include <Library/SerialPortLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Runtime memory status code worker definition
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  UINT32   RecordIndex;
 | 
				
			||||||
 | 
					  UINT32   NumberOfRecords;
 | 
				
			||||||
 | 
					  UINT32   MaxRecordsNumber;
 | 
				
			||||||
 | 
					} RUNTIME_MEMORY_STATUSCODE_HEADER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern RUNTIME_MEMORY_STATUSCODE_HEADER  *mSmmMemoryStatusCodeTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Locates Serial I/O Protocol as initialization for serial status code worker.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS  Serial I/O Protocol is successfully located.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					EfiSerialStatusCodeInitializeWorker (
 | 
				
			||||||
 | 
					  VOID
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Convert status code value and extended data to readable ASCII string, send string to serial I/O device.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @param  CodeType         Indicates the type of status code being reported.
 | 
				
			||||||
 | 
					  @param  Value            Describes the current status of a hardware or software entity.
 | 
				
			||||||
 | 
					                           This included information about the class and subclass that is used to
 | 
				
			||||||
 | 
					                           classify the entity as well as an operation.
 | 
				
			||||||
 | 
					  @param  Instance         The enumeration of a hardware or software entity within
 | 
				
			||||||
 | 
					                           the system. Valid instance numbers start with 1.
 | 
				
			||||||
 | 
					  @param  CallerId         This optional parameter may be used to identify the caller.
 | 
				
			||||||
 | 
					                           This parameter allows the status code driver to apply different rules to
 | 
				
			||||||
 | 
					                           different callers.
 | 
				
			||||||
 | 
					  @param  Data             This optional parameter may be used to pass additional data.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS      Status code reported to serial I/O successfully.
 | 
				
			||||||
 | 
					  @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called.
 | 
				
			||||||
 | 
					  @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					SerialStatusCodeReportWorker (
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_TYPE     CodeType,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_VALUE    Value,
 | 
				
			||||||
 | 
					  IN UINT32                   Instance,
 | 
				
			||||||
 | 
					  IN EFI_GUID                 *CallerId,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Initialize runtime memory status code table as initialization for runtime memory status code worker
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS  Runtime memory status code table successfully initialized.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					MemoryStatusCodeInitializeWorker (
 | 
				
			||||||
 | 
					  VOID
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					  Report status code into runtime memory. If the runtime pool is full, roll back to the 
 | 
				
			||||||
 | 
					  first record and overwrite it.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @param  CodeType                Indicates the type of status code being reported.
 | 
				
			||||||
 | 
					  @param  Value                   Describes the current status of a hardware or software entity.
 | 
				
			||||||
 | 
					                                  This included information about the class and subclass that is used to
 | 
				
			||||||
 | 
					                                  classify the entity as well as an operation.
 | 
				
			||||||
 | 
					  @param  Instance                The enumeration of a hardware or software entity within
 | 
				
			||||||
 | 
					                                  the system. Valid instance numbers start with 1.
 | 
				
			||||||
 | 
					  @param  CallerId                This optional parameter may be used to identify the caller.
 | 
				
			||||||
 | 
					                                  This parameter allows the status code driver to apply different rules to
 | 
				
			||||||
 | 
					                                  different callers.
 | 
				
			||||||
 | 
					  @param  Data                    This optional parameter may be used to pass additional data.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					EFI_STATUS
 | 
				
			||||||
 | 
					MemoryStatusCodeReportWorker (
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_TYPE               CodeType,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_VALUE              Value,
 | 
				
			||||||
 | 
					  IN UINT32                             Instance,
 | 
				
			||||||
 | 
					  IN EFI_GUID                           *CallerId,
 | 
				
			||||||
 | 
					  IN EFI_STATUS_CODE_DATA               *Data OPTIONAL
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					#/** @file
 | 
				
			||||||
 | 
					#  Status Code Handler Driver which produces general handlers and hook them
 | 
				
			||||||
 | 
					#  onto the SMM status code router.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Copyright (c) 2009, 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                      = StatusCodeHandlerSmm
 | 
				
			||||||
 | 
					  FILE_GUID                      = 79CD78D8-6EDC-4978-BD02-3299C387AB17
 | 
				
			||||||
 | 
					  MODULE_TYPE                    = DXE_SMM_DRIVER
 | 
				
			||||||
 | 
					  PI_SPECIFICATION_VERSION       = 0x0001000A
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  ENTRY_POINT                    = StatusCodeHandlerSmmEntry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The following information is for reference only and not required by the build tools.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  VALID_ARCHITECTURES           = IA32 X64
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Sources.common]
 | 
				
			||||||
 | 
					  StatusCodeHandlerSmm.c
 | 
				
			||||||
 | 
					  StatusCodeHandlerSmm.h
 | 
				
			||||||
 | 
					  SerialStatusCodeWorker.c
 | 
				
			||||||
 | 
					  MemoryStatusCodeWorker.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Packages]
 | 
				
			||||||
 | 
					  MdePkg/MdePkg.dec
 | 
				
			||||||
 | 
					  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[LibraryClasses]
 | 
				
			||||||
 | 
					  SerialPortLib
 | 
				
			||||||
 | 
					  SmmServicesTableLib
 | 
				
			||||||
 | 
					  UefiDriverEntryPoint
 | 
				
			||||||
 | 
					  PcdLib
 | 
				
			||||||
 | 
					  PrintLib
 | 
				
			||||||
 | 
					  ReportStatusCodeLib
 | 
				
			||||||
 | 
					  DebugLib
 | 
				
			||||||
 | 
					  SynchronizationLib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Guids]
 | 
				
			||||||
 | 
					  gEfiStatusCodeDataTypeDebugGuid               ## SOMETIMES_CONSUMES (Needed if Data Hub is supported for status code.)
 | 
				
			||||||
 | 
					  gMemoryStatusCodeRecordGuid                   ## CONSUMES ## HOB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Protocols]
 | 
				
			||||||
 | 
					  gEfiSmmRscHandlerProtocolGuid                 ## CONSUMES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[FeaturePcd]
 | 
				
			||||||
 | 
					  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory
 | 
				
			||||||
 | 
					  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Pcd]
 | 
				
			||||||
 | 
					  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize |128| PcdStatusCodeUseMemory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Depex]
 | 
				
			||||||
 | 
					  gEfiSmmRscHandlerProtocolGuid
 | 
				
			||||||
		Reference in New Issue
	
	Block a user