From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E0EA181D89 for ; Mon, 16 Jan 2017 01:07:21 -0800 (PST) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga105.fm.intel.com with ESMTP; 16 Jan 2017 01:07:21 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,238,1477983600"; d="scan'208";a="213832817" Received: from shwdeopenpsi068.ccr.corp.intel.com ([10.239.9.9]) by fmsmga004.fm.intel.com with ESMTP; 16 Jan 2017 01:07:20 -0800 From: Star Zeng To: edk2-devel@lists.01.org Cc: Star Zeng , Jiewen Yao , Liming Gao , Michael Kinney , Amy Chan Date: Mon, 16 Jan 2017 17:07:18 +0800 Message-Id: <1484557638-172800-1-git-send-email-star.zeng@intel.com> X-Mailer: git-send-email 2.7.0.windows.1 Subject: [PATCH] MdePkg DxeHobLib: Make GetHobList working before Constructor is called X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Jan 2017 09:07:22 -0000 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 Cc: Liming Gao Cc: Michael Kinney Cc: Amy Chan Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng --- 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.
+Copyright (c) 2006 - 2017, 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 @@ -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