From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=star.zeng@intel.com; receiver=edk2-devel@lists.01.org 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 437DF211B76AE for ; Tue, 15 Jan 2019 02:29:44 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Jan 2019 02:29:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,481,1539673200"; d="scan'208";a="310538358" Received: from shwdeopenpsi068.ccr.corp.intel.com ([10.239.158.46]) by fmsmga006.fm.intel.com with ESMTP; 15 Jan 2019 02:29:43 -0800 From: Star Zeng To: edk2-devel@lists.01.org Cc: Star Zeng , Jian J Wang , Hao Wu Date: Tue, 15 Jan 2019 18:29:24 +0800 Message-Id: <1547548179-42552-3-git-send-email-star.zeng@intel.com> X-Mailer: git-send-email 2.7.0.windows.1 In-Reply-To: <1547548179-42552-1-git-send-email-star.zeng@intel.com> References: <1547548179-42552-1-git-send-email-star.zeng@intel.com> Subject: [PATCH V3 02/17] MdeModulePkg Variable: Abstract InitRealNonVolatileVariableStore X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Jan 2019 10:29:44 -0000 REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1323 Merge EmuVariable and Real variable driver. Abstract InitRealNonVolatileVariableStore from InitNonVolatileVariableStore. This patch prepares for adding emulated variable NV mode support in VariableRuntimeDxe. Cc: Jian J Wang Cc: Hao Wu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng Reviewed-by: Hao Wu --- .../Universal/Variable/RuntimeDxe/Variable.c | 86 +++++++++++++++------- 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c index 99d487adac9e..0b675c8f36df 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c @@ -3728,9 +3728,9 @@ GetMaxVariableSize ( } /** - Init non-volatile variable store. + Init real non-volatile variable store. - @param[out] NvFvHeader Output pointer to non-volatile FV header address. + @param[out] VariableStoreBase Output pointer to real non-volatile variable store base. @retval EFI_SUCCESS Function successfully executed. @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource. @@ -3738,16 +3738,13 @@ GetMaxVariableSize ( **/ EFI_STATUS -InitNonVolatileVariableStore ( - OUT EFI_FIRMWARE_VOLUME_HEADER **NvFvHeader +InitRealNonVolatileVariableStore ( + OUT EFI_PHYSICAL_ADDRESS *VariableStoreBase ) { EFI_FIRMWARE_VOLUME_HEADER *FvHeader; - VARIABLE_HEADER *Variable; - VARIABLE_HEADER *NextVariable; - EFI_PHYSICAL_ADDRESS VariableStoreBase; - UINT64 VariableStoreLength; - UINTN VariableSize; + VARIABLE_STORE_HEADER *VariableStore; + UINT32 VariableStoreLength; EFI_HOB_GUID_TYPE *GuidHob; EFI_PHYSICAL_ADDRESS NvStorageBase; UINT8 *NvStorageData; @@ -3777,6 +3774,8 @@ InitNonVolatileVariableStore ( if (NvStorageBase == 0) { NvStorageBase = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageVariableBase); } + ASSERT (NvStorageBase != 0); + // // Copy NV storage data to the memory buffer. // @@ -3826,24 +3825,23 @@ InitNonVolatileVariableStore ( return EFI_VOLUME_CORRUPTED; } - VariableStoreBase = (UINTN) FvHeader + FvHeader->HeaderLength; + VariableStore = (VARIABLE_STORE_HEADER *) ((UINTN) FvHeader + FvHeader->HeaderLength); VariableStoreLength = NvStorageSize - FvHeader->HeaderLength; + ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength); + ASSERT (VariableStore->Size == VariableStoreLength); - mNvFvHeaderCache = FvHeader; - mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase = VariableStoreBase; - mNvVariableCache = (VARIABLE_STORE_HEADER *) (UINTN) VariableStoreBase; - if (GetVariableStoreStatus (mNvVariableCache) != EfiValid) { + // + // Check if the Variable Store header is not corrupted + // + if (GetVariableStoreStatus (VariableStore) != EfiValid) { FreePool (NvStorageData); - mNvFvHeaderCache = NULL; - mNvVariableCache = NULL; DEBUG((EFI_D_ERROR, "Variable Store header is corrupted\n")); return EFI_VOLUME_CORRUPTED; } - ASSERT(mNvVariableCache->Size == VariableStoreLength); - ASSERT (sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength); + mNvFvHeaderCache = FvHeader; - mVariableModuleGlobal->VariableGlobal.AuthFormat = (BOOLEAN)(CompareGuid (&mNvVariableCache->Signature, &gEfiAuthenticatedVariableGuid)); + *VariableStoreBase = (EFI_PHYSICAL_ADDRESS) (UINTN) VariableStore; HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize); MaxUserNvVariableSpaceSize = PcdGet32 (PcdMaxUserNvVariableSpaceSize); @@ -3878,14 +3876,45 @@ InitNonVolatileVariableStore ( // ASSERT (GetNonVolatileMaxVariableSize () < (VariableStoreLength - sizeof (VARIABLE_STORE_HEADER))); + return EFI_SUCCESS; +} + +/** + Init non-volatile variable store. + + @retval EFI_SUCCESS Function successfully executed. + @retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource. + @retval EFI_VOLUME_CORRUPTED Variable Store or Firmware Volume for Variable Store is corrupted. + +**/ +EFI_STATUS +InitNonVolatileVariableStore ( + VOID + ) +{ + VARIABLE_HEADER *Variable; + VARIABLE_HEADER *NextVariable; + EFI_PHYSICAL_ADDRESS VariableStoreBase; + UINTN VariableSize; + EFI_STATUS Status; + + Status = InitRealNonVolatileVariableStore (&VariableStoreBase); + if (EFI_ERROR (Status)) { + return Status; + } + + mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase = VariableStoreBase; + mNvVariableCache = (VARIABLE_STORE_HEADER *) (UINTN) VariableStoreBase; + mVariableModuleGlobal->VariableGlobal.AuthFormat = (BOOLEAN)(CompareGuid (&mNvVariableCache->Signature, &gEfiAuthenticatedVariableGuid)); + mVariableModuleGlobal->MaxVariableSize = PcdGet32 (PcdMaxVariableSize); mVariableModuleGlobal->MaxAuthVariableSize = ((PcdGet32 (PcdMaxAuthVariableSize) != 0) ? PcdGet32 (PcdMaxAuthVariableSize) : mVariableModuleGlobal->MaxVariableSize); // // Parse non-volatile variable data and get last variable offset. // - Variable = GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase); - while (IsValidVariableHeader (Variable, GetEndPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase))) { + Variable = GetStartPointer (mNvVariableCache); + while (IsValidVariableHeader (Variable, GetEndPointer (mNvVariableCache))) { NextVariable = GetNextVariablePtr (Variable); VariableSize = (UINTN) NextVariable - (UINTN) Variable; if ((Variable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) { @@ -3896,9 +3925,8 @@ InitNonVolatileVariableStore ( Variable = NextVariable; } - mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) Variable - (UINTN) VariableStoreBase; + mVariableModuleGlobal->NonVolatileLastVariableOffset = (UINTN) Variable - (UINTN) mNvVariableCache; - *NvFvHeader = FvHeader; return EFI_SUCCESS; } @@ -4303,7 +4331,6 @@ VariableCommonInitialize ( VARIABLE_STORE_HEADER *VolatileVariableStore; UINTN ScratchSize; EFI_GUID *VariableGuid; - EFI_FIRMWARE_VOLUME_HEADER *NvFvHeader; // // Allocate runtime memory for variable driver global structure. @@ -4318,8 +4345,7 @@ VariableCommonInitialize ( // // Init non-volatile variable store. // - NvFvHeader = NULL; - Status = InitNonVolatileVariableStore (&NvFvHeader); + Status = InitNonVolatileVariableStore (); if (EFI_ERROR (Status)) { FreePool (mVariableModuleGlobal); return Status; @@ -4347,7 +4373,9 @@ VariableCommonInitialize ( // Status = GetHobVariableStore (VariableGuid); if (EFI_ERROR (Status)) { - FreePool (NvFvHeader); + if (mNvFvHeaderCache != NULL) { + FreePool (mNvFvHeaderCache); + } FreePool (mVariableModuleGlobal); return Status; } @@ -4366,7 +4394,9 @@ VariableCommonInitialize ( if (mVariableModuleGlobal->VariableGlobal.HobVariableBase != 0) { FreePool ((VOID *) (UINTN) mVariableModuleGlobal->VariableGlobal.HobVariableBase); } - FreePool (NvFvHeader); + if (mNvFvHeaderCache != NULL) { + FreePool (mNvFvHeaderCache); + } FreePool (mVariableModuleGlobal); return EFI_OUT_OF_RESOURCES; } -- 2.7.0.windows.1