X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=SecurityPkg%2FVariableAuthenticated%2FRuntimeDxe%2FVariableDxe.c;h=949fb64248bf99acdab98e8924e43ec0402122dc;hp=a2e764cf610c5d4046e6c947fc2e2d46006fdd69;hb=25da08c8b2a73b375f57652104cfdbd0db82d31e;hpb=e4b7e2c94f14f370edd07f58b6abbb5a614cabcd diff --git a/SecurityPkg/VariableAuthenticated/RuntimeDxe/VariableDxe.c b/SecurityPkg/VariableAuthenticated/RuntimeDxe/VariableDxe.c index a2e764cf61..949fb64248 100644 --- a/SecurityPkg/VariableAuthenticated/RuntimeDxe/VariableDxe.c +++ b/SecurityPkg/VariableAuthenticated/RuntimeDxe/VariableDxe.c @@ -2,7 +2,8 @@ Implement all four UEFI Runtime Variable services for the nonvolatile and volatile storage space and install variable architecture protocol. -Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+Copyright (C) 2013, Red Hat, Inc. +Copyright (c) 2009 - 2014, 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 @@ -21,6 +22,7 @@ extern VARIABLE_INFO_ENTRY *gVariableInfo; EFI_HANDLE mHandle = NULL; EFI_EVENT mVirtualAddressChangeEvent = NULL; EFI_EVENT mFtwRegistration = NULL; +extern LIST_ENTRY mLockedVariableList; extern BOOLEAN mEndOfDxe; EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock = { VariableLockRequestToLock }; @@ -220,6 +222,10 @@ VariableClassAddressChangeEvent ( IN VOID *Context ) { + LIST_ENTRY *Link; + VARIABLE_ENTRY *Entry; + EFI_STATUS Status; + EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetBlockSize); EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetPhysicalAddress); EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->FvbInstance->GetAttributes); @@ -235,9 +241,25 @@ VariableClassAddressChangeEvent ( EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal->VariableGlobal.VolatileVariableBase); EfiConvertPointer (0x0, (VOID **) &mVariableModuleGlobal); EfiConvertPointer (0x0, (VOID **) &mHashCtx); - EfiConvertPointer (0x0, (VOID **) &mStorageArea); EfiConvertPointer (0x0, (VOID **) &mSerializationRuntimeBuffer); EfiConvertPointer (0x0, (VOID **) &mNvVariableCache); + + // + // in the list of locked variables, convert the name pointers first + // + for ( Link = GetFirstNode (&mLockedVariableList) + ; !IsNull (&mLockedVariableList, Link) + ; Link = GetNextNode (&mLockedVariableList, Link) + ) { + Entry = BASE_CR (Link, VARIABLE_ENTRY, Link); + Status = EfiConvertPointer (0x0, (VOID **) &Entry->Name); + ASSERT_EFI_ERROR (Status); + } + // + // second, convert the list itself using UefiRuntimeLib + // + Status = EfiConvertList (0x0, &mLockedVariableList); + ASSERT_EFI_ERROR (Status); } @@ -314,6 +336,7 @@ FtwNotificationEvent ( UINT64 Length; EFI_PHYSICAL_ADDRESS VariableStoreBase; UINT64 VariableStoreLength; + UINTN FtwMaxBlockSize; // // Ensure FTW protocol is installed. @@ -323,6 +346,11 @@ FtwNotificationEvent ( return ; } + Status = FtwProtocol->GetMaxBlockSize (FtwProtocol, &FtwMaxBlockSize); + if (!EFI_ERROR (Status)) { + ASSERT (PcdGet32 (PcdFlashNvStorageVariableSize) <= FtwMaxBlockSize); + } + // // Find the proper FVB protocol for variable. // @@ -360,7 +388,9 @@ FtwNotificationEvent ( } Status = VariableWriteServiceInitialize (); - ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Variable write service initialization failed. Status = %r\n", Status)); + } // // Install the Variable Write Architectural protocol.