REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4264 Fix debug print error level hob not save correct DebugPrintErrorlevel Should cover the case: Header.Length == UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_FIELD () Cc: Ray Ni <ray.ni@intel.com> Cc: Sean Rhodes <sean@starlabs.systems> Cc: James Lu <james.lu@intel.com> Cc: Gua Guo <gua.guo@intel.com> Signed-off-by: Ning Feng <ning.feng@intel.com> Reviewed-by: Gua Guo <gua.guo@intel.com>
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Debug Print Error Level library instance that retrieves
 | 
						|
  the DebugPrintErrorLevel from bootloader.
 | 
						|
 | 
						|
  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Base.h>
 | 
						|
#include <Uefi.h>
 | 
						|
#include <PiDxe.h>
 | 
						|
#include <Library/PcdLib.h>
 | 
						|
#include <Library/HobLib.h>
 | 
						|
#include <Guid/DebugPrintErrorLevel.h>
 | 
						|
#include <Library/DebugPrintErrorLevelLib.h>
 | 
						|
#include <UniversalPayload/UniversalPayload.h>
 | 
						|
 | 
						|
STATIC UINT32   gDebugPrintErrorLevel;
 | 
						|
STATIC BOOLEAN  gDebugPrintErrorLevelInitialized = FALSE;
 | 
						|
 | 
						|
/**
 | 
						|
  Returns the debug print error level mask for the current module.
 | 
						|
 | 
						|
  @return  Debug print error level mask for the current module.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
GetDebugPrintErrorLevel (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  VOID                                  *GuidHob;
 | 
						|
  UNIVERSAL_PAYLOAD_GENERIC_HEADER      *GenericHeader;
 | 
						|
  UEFI_PAYLOAD_DEBUG_PRINT_ERROR_LEVEL  *DebugPrintErrorLevel;
 | 
						|
 | 
						|
  if (!gDebugPrintErrorLevelInitialized) {
 | 
						|
    gDebugPrintErrorLevelInitialized = TRUE;
 | 
						|
    gDebugPrintErrorLevel            = PcdGet32 (PcdDebugPrintErrorLevel);
 | 
						|
    GuidHob                          = GetFirstGuidHob (&gEdkiiDebugPrintErrorLevelGuid);
 | 
						|
    if (GuidHob != NULL) {
 | 
						|
      GenericHeader = (UNIVERSAL_PAYLOAD_GENERIC_HEADER *)GET_GUID_HOB_DATA (GuidHob);
 | 
						|
      if ((sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) < GET_GUID_HOB_DATA_SIZE (GuidHob)) &&
 | 
						|
          (GenericHeader->Length <= GET_GUID_HOB_DATA_SIZE (GuidHob)))
 | 
						|
      {
 | 
						|
        if (GenericHeader->Revision == UEFI_PAYLOAD_DEBUG_PRINT_ERROR_LEVEL_REVISION) {
 | 
						|
          DebugPrintErrorLevel =  (UEFI_PAYLOAD_DEBUG_PRINT_ERROR_LEVEL *)GET_GUID_HOB_DATA (GuidHob);
 | 
						|
          if (DebugPrintErrorLevel->Header.Length >= UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_FIELD (UEFI_PAYLOAD_DEBUG_PRINT_ERROR_LEVEL, ErrorLevel)) {
 | 
						|
            gDebugPrintErrorLevel = DebugPrintErrorLevel->ErrorLevel;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return gDebugPrintErrorLevel;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Sets the global debug print error level mask fpr the entire platform.
 | 
						|
 | 
						|
  @param   ErrorLevel     Global debug print error level.
 | 
						|
 | 
						|
  @retval  TRUE           The debug print error level mask was sucessfully set.
 | 
						|
  @retval  FALSE          The debug print error level mask could not be set.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
EFIAPI
 | 
						|
SetDebugPrintErrorLevel (
 | 
						|
  UINT32  ErrorLevel
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // This library uinstance does not support setting the global debug print error
 | 
						|
  // level mask.
 | 
						|
  //
 | 
						|
  return FALSE;
 | 
						|
}
 |