Reviewed-by: Liming Gao <[email protected]>

>-----Original Message-----
>From: edk2-devel [mailto:[email protected]] On Behalf Of Star
>Zeng
>Sent: Monday, January 16, 2017 5:07 PM
>To: [email protected]
>Cc: Kinney, Michael D <[email protected]>; Chan, Amy
><[email protected]>; Yao, Jiewen <[email protected]>; Gao, Liming
><[email protected]>; Zeng, Star <[email protected]>
>Subject: [edk2] [PATCH] MdePkg DxeHobLib: Make GetHobList working
>before Constructor is called
>
>The latest PiSmmCore driver added several debug messages in the
>function SmmAddMemoryRegion in Page.c. The function
>SmmAddMemoryRegion
>is called by the library constructor
>PiSmmCoreMemoryAllocationLibConstructor.
>
>When PiSmmCoreMemoryAllocationLibConstructor is executed, the
>constructor of DxeHobLib (HobLibConstructor in HobLib.c) is not
>executed yet. But platform instance of DebugLib may need get hob
>before printing any message. As a result, an ASSERT happens in the
>function GetHobList.
>
>The patch is to update GetHobList to get HOB list from system
>configuration table when the HOB list is not retrieved and not cached
>yet, and HobLibConstructor is also to be updated to just call
>GetHobList.
>
>Cc: Jiewen Yao <[email protected]>
>Cc: Liming Gao <[email protected]>
>Cc: Michael Kinney <[email protected]>
>Cc: Amy Chan <[email protected]>
>Contributed-under: TianoCore Contribution Agreement 1.0
>Signed-off-by: Star Zeng <[email protected]>
>---
> MdePkg/Library/DxeHobLib/HobLib.c | 67 ++++++++++++++++++++-----------
>--------
> 1 file changed, 34 insertions(+), 33 deletions(-)
>
>diff --git a/MdePkg/Library/DxeHobLib/HobLib.c
>b/MdePkg/Library/DxeHobLib/HobLib.c
>index c6c04e6a5924..bb65206b044a 100644
>--- a/MdePkg/Library/DxeHobLib/HobLib.c
>+++ b/MdePkg/Library/DxeHobLib/HobLib.c
>@@ -1,7 +1,7 @@
> /** @file
>   HOB Library implemenation for Dxe Phase.
>
>-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
> 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
>@@ -24,35 +24,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
>KIND, EITHER EXPRESS OR IMPLIED.
> VOID  *mHobList = NULL;
>
> /**
>-  The constructor function caches the pointer to HOB list.
>-
>-  The constructor function gets the start address of HOB list from system
>configuration table.
>-  It will ASSERT() if that operation fails and it will always return 
>EFI_SUCCESS.
>-
>-  @param  ImageHandle   The firmware allocated handle for the EFI image.
>-  @param  SystemTable   A pointer to the EFI System Table.
>-
>-  @retval EFI_SUCCESS   The constructor successfully gets HobList.
>-  @retval Other value   The constructor can't get HobList.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-HobLibConstructor (
>-  IN EFI_HANDLE        ImageHandle,
>-  IN EFI_SYSTEM_TABLE  *SystemTable
>-  )
>-{
>-  EFI_STATUS  Status;
>-
>-  Status = EfiGetSystemConfigurationTable (&gEfiHobListGuid, &mHobList);
>-  ASSERT_EFI_ERROR (Status);
>-  ASSERT (mHobList != NULL);
>-
>-  return Status;
>-}
>-
>-/**
>   Returns the pointer to the HOB list.
>
>   This function returns the pointer to first HOB in the list.
>@@ -62,9 +33,11 @@ HobLibConstructor (
>   Since the System Configuration Table does not exist that the time the DXE
>Core is
>   launched, the DXE Core uses a global variable from the DXE Core Entry Point
>Library
>   to manage the pointer to the HOB list.
>-
>+
>   If the pointer to the HOB list is NULL, then ASSERT().
>-
>+
>+  This function also caches the pointer to the HOB list retrieved.
>+
>   @return The pointer to the HOB list.
>
> **/
>@@ -74,11 +47,39 @@ GetHobList (
>   VOID
>   )
> {
>-  ASSERT (mHobList != NULL);
>+  EFI_STATUS  Status;
>+
>+  if (mHobList == NULL) {
>+    Status = EfiGetSystemConfigurationTable (&gEfiHobListGuid, &mHobList);
>+    ASSERT_EFI_ERROR (Status);
>+    ASSERT (mHobList != NULL);
>+  }
>   return mHobList;
> }
>
> /**
>+  The constructor function caches the pointer to HOB list by calling
>GetHobList()
>+  and will always return EFI_SUCCESS.
>+
>+  @param  ImageHandle   The firmware allocated handle for the EFI image.
>+  @param  SystemTable   A pointer to the EFI System Table.
>+
>+  @retval EFI_SUCCESS   The constructor successfully gets HobList.
>+
>+**/
>+EFI_STATUS
>+EFIAPI
>+HobLibConstructor (
>+  IN EFI_HANDLE        ImageHandle,
>+  IN EFI_SYSTEM_TABLE  *SystemTable
>+  )
>+{
>+  GetHobList ();
>+
>+  return EFI_SUCCESS;
>+}
>+
>+/**
>   Returns the next instance of a HOB type from the starting HOB.
>
>   This function searches the first instance of a HOB type from the starting 
> HOB
>pointer.
>--
>2.7.0.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>[email protected]
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to