From 07220da0c03149ec30459ed1fc2421c3526e06b5 Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Tue, 29 Jan 2008 12:26:51 +0000 Subject: Merge Ia32/Fvb.c & X64/Fvb.c, for these two files are identical. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4642 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/EdkFvbServiceLib/EdkFvbServiceLib.inf | 26 +- MdeModulePkg/Library/EdkFvbServiceLib/Fvb.c | 607 +++++++++++++++++++++ MdeModulePkg/Library/EdkFvbServiceLib/Ia32/Fvb.c | 607 --------------------- MdeModulePkg/Library/EdkFvbServiceLib/X64/Fvb.c | 606 -------------------- 4 files changed, 610 insertions(+), 1236 deletions(-) create mode 100644 MdeModulePkg/Library/EdkFvbServiceLib/Fvb.c delete mode 100644 MdeModulePkg/Library/EdkFvbServiceLib/Ia32/Fvb.c delete mode 100644 MdeModulePkg/Library/EdkFvbServiceLib/X64/Fvb.c (limited to 'MdeModulePkg') diff --git a/MdeModulePkg/Library/EdkFvbServiceLib/EdkFvbServiceLib.inf b/MdeModulePkg/Library/EdkFvbServiceLib/EdkFvbServiceLib.inf index a88e4f9c32..42703d9b26 100644 --- a/MdeModulePkg/Library/EdkFvbServiceLib/EdkFvbServiceLib.inf +++ b/MdeModulePkg/Library/EdkFvbServiceLib/EdkFvbServiceLib.inf @@ -34,28 +34,15 @@ # VIRTUAL_ADDRESS_MAP_CALLBACK = FvbVirtualAddressChangeNotifyEvent # -[Sources.common] +[Sources] Fvb.h - -[Sources.Ia32] - Ia32/Fvb.c - -[Sources.X64] - X64/Fvb.c + Fvb.c [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec -[LibraryClasses.IA32] - UefiBootServicesTableLib - UefiRuntimeLib - BaseMemoryLib - DebugLib - BaseLib - UefiLib - -[LibraryClasses.X64] +[LibraryClasses] UefiBootServicesTableLib UefiRuntimeLib BaseMemoryLib @@ -63,15 +50,8 @@ BaseLib UefiLib - [Protocols] gEfiFirmwareVolumeBlockProtocolGuid # PROTOCOL_NOTIFY SOMETIMES_CONSUMED - -[Protocols.IA32] - gEfiFvbExtensionProtocolGuid # PROTOCOL ALWAYS_CONSUMED - gEfiFirmwareVolumeBlockProtocolGuid # PROTOCOL ALWAYS_CONSUMED - -[Protocols.X64] gEfiFvbExtensionProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiFirmwareVolumeBlockProtocolGuid # PROTOCOL ALWAYS_CONSUMED diff --git a/MdeModulePkg/Library/EdkFvbServiceLib/Fvb.c b/MdeModulePkg/Library/EdkFvbServiceLib/Fvb.c new file mode 100644 index 0000000000..8c2a77e8d6 --- /dev/null +++ b/MdeModulePkg/Library/EdkFvbServiceLib/Fvb.c @@ -0,0 +1,607 @@ +/**@file + + Firmware Volume Block Protocol Runtime Abstraction + + mFvbEntry is an array of Handle Fvb pairs. The Fvb Lib Instance matches the + index in the mFvbEntry array. This should be the same sequence as the FVB's + were described in the HOB. We have to remember the handle so we can tell if + the protocol has been reinstalled and it needs updateing. + + If you are using any of these lib functions.you must first call FvbInitialize (). + +Copyright (c) 2006, 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 +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +#include "Fvb.h" + +// +// Event for Set Virtual Map Changed Event +// +STATIC EFI_EVENT mSetVirtualMapChangedEvent = NULL; + +// +// Lib will ASSERT if more FVB devices than this are added to the system. +// +STATIC FVB_ENTRY *mFvbEntry; +STATIC EFI_EVENT mFvbRegistration; +STATIC UINTN mFvbCount; + +/** + Check whether an address is runtime memory or not. + + @param Address The Address being checked. + + @retval TRUE The address is runtime memory. + @retval FALSE The address is not runtime memory. +**/ +BOOLEAN +IsRuntimeMemory ( + IN VOID *Address + ) +{ + EFI_STATUS Status; + UINT8 TmpMemoryMap[1]; + UINTN MapKey; + UINTN DescriptorSize; + UINT32 DescriptorVersion; + UINTN MemoryMapSize; + EFI_MEMORY_DESCRIPTOR *MemoryMap; + EFI_MEMORY_DESCRIPTOR *MemoryMapPtr; + BOOLEAN IsRuntime; + UINTN Index; + + IsRuntime = FALSE; + + // + // Get System MemoryMapSize + // + MemoryMapSize = 1; + Status = gBS->GetMemoryMap ( + &MemoryMapSize, + (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap, + &MapKey, + &DescriptorSize, + &DescriptorVersion + ); + ASSERT (Status == EFI_BUFFER_TOO_SMALL); + // + // Enlarge space here, because we will allocate pool now. + // + MemoryMapSize += EFI_PAGE_SIZE; + Status = gBS->AllocatePool ( + EfiBootServicesData, + MemoryMapSize, + (VOID**)&MemoryMap + ); + ASSERT_EFI_ERROR (Status); + + // + // Get System MemoryMap + // + Status = gBS->GetMemoryMap ( + &MemoryMapSize, + MemoryMap, + &MapKey, + &DescriptorSize, + &DescriptorVersion + ); + ASSERT_EFI_ERROR (Status); + + MemoryMapPtr = MemoryMap; + // + // Search the request Address + // + for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) { + if (((EFI_PHYSICAL_ADDRESS)(UINTN)Address >= MemoryMap->PhysicalStart) && + ((EFI_PHYSICAL_ADDRESS)(UINTN)Address < MemoryMap->PhysicalStart + + LShiftU64 (MemoryMap->NumberOfPages, EFI_PAGE_SHIFT))) { + // + // Found it + // + if (MemoryMap->Attribute & EFI_MEMORY_RUNTIME) { + IsRuntime = TRUE; + } + break; + } + // + // Get next item + // + MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize); + } + + // + // Done + // + gBS->FreePool (MemoryMapPtr); + + return IsRuntime; +} + +/** + Update mFvbEntry. Add new entry, or update existing entry if Fvb protocol is + reinstalled. + + @param Event The Event that is being processed + @param Context Event Context + +**/ +STATIC +VOID +EFIAPI +FvbNotificationEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + UINTN BufferSize; + EFI_HANDLE Handle; + UINTN Index; + UINTN UpdateIndex; + + while (TRUE) { + BufferSize = sizeof (Handle); + Status = gBS->LocateHandle ( + ByRegisterNotify, + &gEfiFirmwareVolumeBlockProtocolGuid, + mFvbRegistration, + &BufferSize, + &Handle + ); + if (EFI_ERROR (Status)) { + // + // Exit Path of While Loop.... + // + break; + } + + UpdateIndex = MAX_FVB_COUNT; + for (Index = 0; Index < mFvbCount; Index++) { + if (mFvbEntry[Index].Handle == Handle) { + // + // If the handle is already in the table just update the protocol + // + UpdateIndex = Index; + break; + } + } + + if (UpdateIndex == MAX_FVB_COUNT) { + // + // Use the next free slot for a new entry + // + UpdateIndex = mFvbCount++; + // + // Check the UpdateIndex whether exceed the maximum value. + // + ASSERT (UpdateIndex < MAX_FVB_COUNT); + mFvbEntry[UpdateIndex].Handle = Handle; + } + // + // The array does not have enough entries + // + ASSERT (UpdateIndex < MAX_FVB_COUNT); + + // + // Get the interface pointer and if it's ours, skip it + // + Status = gBS->HandleProtocol ( + Handle, + &gEfiFirmwareVolumeBlockProtocolGuid, + (VOID **) &mFvbEntry[UpdateIndex].Fvb + ); + ASSERT_EFI_ERROR (Status); + + Status = gBS->HandleProtocol ( + Handle, + &gEfiFvbExtensionProtocolGuid, + (VOID **) &mFvbEntry[UpdateIndex].FvbExtension + ); + if (Status != EFI_SUCCESS) { + mFvbEntry[UpdateIndex].FvbExtension = NULL; + } + + // + // Check the FVB can be accessed in RUNTIME, The FVBs in FVB handle list comes + // from two way: + // 1) Dxe Core. (FVB information is transferred from FV HOB). + // 2) FVB driver. + // The FVB produced Dxe core is used for discoverying DXE driver and dispatch. These + // FVBs can only be accessed in boot time. + // FVB driver will discovery all FV in FLASH and these FVBs can be accessed in runtime. + // The FVB itself produced by FVB driver is allocated in runtime memory. So we can + // determine the what FVB can be accessed in RUNTIME by judging whether FVB itself is allocated + // in RUNTIME memory. + // + mFvbEntry[UpdateIndex].IsRuntimeAccess = IsRuntimeMemory (mFvbEntry[UpdateIndex].Fvb); + } +} + +/** + Convert all pointers in mFvbEntry after ExitBootServices. + + @param Event The Event that is being processed + @param Context Event Context + +**/ +VOID +EFIAPI +FvbVirtualAddressChangeNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + UINTN Index; + if (mFvbEntry != NULL) { + for (Index = 0; Index < MAX_FVB_COUNT; Index++) { + if (!mFvbEntry[Index].IsRuntimeAccess) { + continue; + } + + if (NULL != mFvbEntry[Index].Fvb) { + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetBlockSize); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetPhysicalAddress); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetAttributes); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->SetAttributes); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->Read); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->Write); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->EraseBlocks); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb); + } + + if (NULL != mFvbEntry[Index].FvbExtension) { + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].FvbExtension->EraseFvbCustomBlock); + EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].FvbExtension); + } + } + + EfiConvertPointer (0x0, (VOID **) &mFvbEntry); + } +} + +/** + Library constructor function entry. + + @param ImageHandle The handle of image who call this libary. + @param SystemTable The point of System Table. + + @retval EFI_SUCESS Sucess construct this library. + @retval Others Fail to contruct this libary. +**/ +EFI_STATUS +EFIAPI +FvbLibInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + UINTN Status; + mFvbCount = 0; + + Status = gBS->AllocatePool ( + EfiRuntimeServicesData, + (UINTN) sizeof (FVB_ENTRY) * MAX_FVB_COUNT, + (VOID *) &mFvbEntry + ); + + if (EFI_ERROR (Status)) { + return Status; + } + + ZeroMem (mFvbEntry, sizeof (FVB_ENTRY) * MAX_FVB_COUNT); + + EfiCreateProtocolNotifyEvent ( + &gEfiFirmwareVolumeBlockProtocolGuid, + TPL_CALLBACK, + FvbNotificationEvent, + NULL, + &mFvbRegistration + ); + + // + // Register SetVirtualAddressMap () notify function + // + Status = gBS->CreateEvent ( + EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, + TPL_NOTIFY, + FvbVirtualAddressChangeNotifyEvent, + NULL, + &mSetVirtualMapChangedEvent + ); + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} + +// +// ============================================================================= +// The following functions wrap Fvb protocol in the Runtime Lib functions. +// The Instance translates into Fvb instance. The Fvb order defined by HOBs and +// thus the sequence of FVB protocol addition define Instance. +// +// EfiFvbInitialize () must be called before any of the following functions +// must be called. +// ============================================================================= +// + +/** + Reads specified number of bytes into a buffer from the specified block + + @param Instance The FV instance to be read from. + @param Lba The logical block address to be read from + @param Offset Offset into the block at which to begin reading + @param NumBytes Pointer that on input contains the total size of + the buffer. On output, it contains the total number + of bytes read + @param Buffer Pointer to a caller allocated buffer that will be + used to hold the data read + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to Read block + @retval Others Fail to read block +**/ +EFI_STATUS +EfiFvbReadBlock ( + IN UINTN Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->Read (mFvbEntry[Instance].Fvb, Lba, Offset, NumBytes, Buffer); +} + +/** + Writes specified number of bytes from the input buffer to the block + + @param Instance The FV instance to be written to + @param Lba The starting logical block index to write to + @param Offset Offset into the block at which to begin writing + @param NumBytes Pointer that on input contains the total size of + the buffer. On output, it contains the total number + of bytes actually written + @param Buffer Pointer to a caller allocated buffer that contains + the source for the write + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to write block + @retval Others Fail to write block +**/ +EFI_STATUS +EfiFvbWriteBlock ( + IN UINTN Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->Write (mFvbEntry[Instance].Fvb, Lba, Offset, NumBytes, Buffer); +} + +/** + Erases and initializes a firmware volume block + + @param Instance The FV instance to be erased + @param Lba The logical block index to be erased + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to erase block + @retval Others Fail to erase block +**/ +EFI_STATUS +EfiFvbEraseBlock ( + IN UINTN Instance, + IN EFI_LBA Lba + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->EraseBlocks (mFvbEntry[Instance].Fvb, Lba, -1); +} + +/** + Retrieves attributes, insures positive polarity of attribute bits, returns + resulting attributes in output parameter + + @param Instance The FV instance whose attributes is going to be returned + @param Attributes Output buffer which contains attributes + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to get Fv attribute + @retval Others Fail to get Fv attribute +**/ +EFI_STATUS +EfiFvbGetVolumeAttributes ( + IN UINTN Instance, + OUT EFI_FVB_ATTRIBUTES *Attributes + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->GetAttributes (mFvbEntry[Instance].Fvb, Attributes); +} + +/** + Modifies the current settings of the firmware volume according to the + input parameter, and returns the new setting of the volume + + @param Instance The FV instance whose attributes is going to be + modified + @param Attributes On input, it is a pointer to EFI_FVB_ATTRIBUTES + containing the desired firmware volume settings. + On successful return, it contains the new settings + of the firmware volume + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to set Fv attribute + @retval Others Fail to set Fv attribute +**/ +EFI_STATUS +EfiFvbSetVolumeAttributes ( + IN UINTN Instance, + IN OUT EFI_FVB_ATTRIBUTES *Attributes + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->SetAttributes (mFvbEntry[Instance].Fvb, Attributes); +} + +/** + Retrieves the physical address of a memory mapped FV + + @param Instance The FV instance whose base address is going to be + returned + @param BaseAddress Pointer to a caller allocated EFI_PHYSICAL_ADDRESS + that on successful return, contains the base address + of the firmware volume. + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to get physical address + @retval Others Fail to get physical address +**/ +EFI_STATUS +EfiFvbGetPhysicalAddress ( + IN UINTN Instance, + OUT EFI_PHYSICAL_ADDRESS *BaseAddress + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->GetPhysicalAddress (mFvbEntry[Instance].Fvb, BaseAddress); +} + +/** + Retrieve the size of a logical block + + @param Instance The FV instance whose block size is going to be + returned + @param Lba Indicates which block to return the size for. + @param BlockSize A pointer to a caller allocated UINTN in which + the size of the block is returned + @param NumOfBlocks a pointer to a caller allocated UINTN in which the + number of consecutive blocks starting with Lba is + returned. All blocks in this range have a size of + BlockSize + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to get block size + @retval Others Fail to get block size +**/ +EFI_STATUS +EfiFvbGetBlockSize ( + IN UINTN Instance, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumOfBlocks + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + return mFvbEntry[Instance].Fvb->GetBlockSize (mFvbEntry[Instance].Fvb, Lba, BlockSize, NumOfBlocks); +} + +/** + Erases and initializes a specified range of a firmware volume + + @param Instance The FV instance to be erased + @param StartLba The starting logical block index to be erased + @param OffsetStartLba Offset into the starting block at which to + begin erasing + @param LastLba The last logical block index to be erased + @param OffsetLastLba Offset into the last block at which to end erasing + + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_SUCESS Sucess to erase custom block range + @retval Others Fail to erase custom block range +**/ +EFI_STATUS +EfiFvbEraseCustomBlockRange ( + IN UINTN Instance, + IN EFI_LBA StartLba, + IN UINTN OffsetStartLba, + IN EFI_LBA LastLba, + IN UINTN OffsetLastLba + ) +{ + if (Instance >= mFvbCount) { + return EFI_INVALID_PARAMETER; + } + + if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { + return EFI_INVALID_PARAMETER; + } + + if (!(mFvbEntry[Instance].FvbExtension)) { + return EFI_UNSUPPORTED; + } + + if (!(mFvbEntry[Instance].FvbExtension->EraseFvbCustomBlock)) { + return EFI_UNSUPPORTED; + } + + return mFvbEntry[Instance].FvbExtension->EraseFvbCustomBlock ( + mFvbEntry[Instance].FvbExtension, + StartLba, + OffsetStartLba, + LastLba, + OffsetLastLba + ); +} diff --git a/MdeModulePkg/Library/EdkFvbServiceLib/Ia32/Fvb.c b/MdeModulePkg/Library/EdkFvbServiceLib/Ia32/Fvb.c deleted file mode 100644 index 8c2a77e8d6..0000000000 --- a/MdeModulePkg/Library/EdkFvbServiceLib/Ia32/Fvb.c +++ /dev/null @@ -1,607 +0,0 @@ -/**@file - - Firmware Volume Block Protocol Runtime Abstraction - - mFvbEntry is an array of Handle Fvb pairs. The Fvb Lib Instance matches the - index in the mFvbEntry array. This should be the same sequence as the FVB's - were described in the HOB. We have to remember the handle so we can tell if - the protocol has been reinstalled and it needs updateing. - - If you are using any of these lib functions.you must first call FvbInitialize (). - -Copyright (c) 2006, 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 -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Fvb.h" - -// -// Event for Set Virtual Map Changed Event -// -STATIC EFI_EVENT mSetVirtualMapChangedEvent = NULL; - -// -// Lib will ASSERT if more FVB devices than this are added to the system. -// -STATIC FVB_ENTRY *mFvbEntry; -STATIC EFI_EVENT mFvbRegistration; -STATIC UINTN mFvbCount; - -/** - Check whether an address is runtime memory or not. - - @param Address The Address being checked. - - @retval TRUE The address is runtime memory. - @retval FALSE The address is not runtime memory. -**/ -BOOLEAN -IsRuntimeMemory ( - IN VOID *Address - ) -{ - EFI_STATUS Status; - UINT8 TmpMemoryMap[1]; - UINTN MapKey; - UINTN DescriptorSize; - UINT32 DescriptorVersion; - UINTN MemoryMapSize; - EFI_MEMORY_DESCRIPTOR *MemoryMap; - EFI_MEMORY_DESCRIPTOR *MemoryMapPtr; - BOOLEAN IsRuntime; - UINTN Index; - - IsRuntime = FALSE; - - // - // Get System MemoryMapSize - // - MemoryMapSize = 1; - Status = gBS->GetMemoryMap ( - &MemoryMapSize, - (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion - ); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); - // - // Enlarge space here, because we will allocate pool now. - // - MemoryMapSize += EFI_PAGE_SIZE; - Status = gBS->AllocatePool ( - EfiBootServicesData, - MemoryMapSize, - (VOID**)&MemoryMap - ); - ASSERT_EFI_ERROR (Status); - - // - // Get System MemoryMap - // - Status = gBS->GetMemoryMap ( - &MemoryMapSize, - MemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion - ); - ASSERT_EFI_ERROR (Status); - - MemoryMapPtr = MemoryMap; - // - // Search the request Address - // - for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) { - if (((EFI_PHYSICAL_ADDRESS)(UINTN)Address >= MemoryMap->PhysicalStart) && - ((EFI_PHYSICAL_ADDRESS)(UINTN)Address < MemoryMap->PhysicalStart - + LShiftU64 (MemoryMap->NumberOfPages, EFI_PAGE_SHIFT))) { - // - // Found it - // - if (MemoryMap->Attribute & EFI_MEMORY_RUNTIME) { - IsRuntime = TRUE; - } - break; - } - // - // Get next item - // - MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize); - } - - // - // Done - // - gBS->FreePool (MemoryMapPtr); - - return IsRuntime; -} - -/** - Update mFvbEntry. Add new entry, or update existing entry if Fvb protocol is - reinstalled. - - @param Event The Event that is being processed - @param Context Event Context - -**/ -STATIC -VOID -EFIAPI -FvbNotificationEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - UINTN BufferSize; - EFI_HANDLE Handle; - UINTN Index; - UINTN UpdateIndex; - - while (TRUE) { - BufferSize = sizeof (Handle); - Status = gBS->LocateHandle ( - ByRegisterNotify, - &gEfiFirmwareVolumeBlockProtocolGuid, - mFvbRegistration, - &BufferSize, - &Handle - ); - if (EFI_ERROR (Status)) { - // - // Exit Path of While Loop.... - // - break; - } - - UpdateIndex = MAX_FVB_COUNT; - for (Index = 0; Index < mFvbCount; Index++) { - if (mFvbEntry[Index].Handle == Handle) { - // - // If the handle is already in the table just update the protocol - // - UpdateIndex = Index; - break; - } - } - - if (UpdateIndex == MAX_FVB_COUNT) { - // - // Use the next free slot for a new entry - // - UpdateIndex = mFvbCount++; - // - // Check the UpdateIndex whether exceed the maximum value. - // - ASSERT (UpdateIndex < MAX_FVB_COUNT); - mFvbEntry[UpdateIndex].Handle = Handle; - } - // - // The array does not have enough entries - // - ASSERT (UpdateIndex < MAX_FVB_COUNT); - - // - // Get the interface pointer and if it's ours, skip it - // - Status = gBS->HandleProtocol ( - Handle, - &gEfiFirmwareVolumeBlockProtocolGuid, - (VOID **) &mFvbEntry[UpdateIndex].Fvb - ); - ASSERT_EFI_ERROR (Status); - - Status = gBS->HandleProtocol ( - Handle, - &gEfiFvbExtensionProtocolGuid, - (VOID **) &mFvbEntry[UpdateIndex].FvbExtension - ); - if (Status != EFI_SUCCESS) { - mFvbEntry[UpdateIndex].FvbExtension = NULL; - } - - // - // Check the FVB can be accessed in RUNTIME, The FVBs in FVB handle list comes - // from two way: - // 1) Dxe Core. (FVB information is transferred from FV HOB). - // 2) FVB driver. - // The FVB produced Dxe core is used for discoverying DXE driver and dispatch. These - // FVBs can only be accessed in boot time. - // FVB driver will discovery all FV in FLASH and these FVBs can be accessed in runtime. - // The FVB itself produced by FVB driver is allocated in runtime memory. So we can - // determine the what FVB can be accessed in RUNTIME by judging whether FVB itself is allocated - // in RUNTIME memory. - // - mFvbEntry[UpdateIndex].IsRuntimeAccess = IsRuntimeMemory (mFvbEntry[UpdateIndex].Fvb); - } -} - -/** - Convert all pointers in mFvbEntry after ExitBootServices. - - @param Event The Event that is being processed - @param Context Event Context - -**/ -VOID -EFIAPI -FvbVirtualAddressChangeNotifyEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UINTN Index; - if (mFvbEntry != NULL) { - for (Index = 0; Index < MAX_FVB_COUNT; Index++) { - if (!mFvbEntry[Index].IsRuntimeAccess) { - continue; - } - - if (NULL != mFvbEntry[Index].Fvb) { - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetBlockSize); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetPhysicalAddress); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetAttributes); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->SetAttributes); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->Read); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->Write); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->EraseBlocks); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb); - } - - if (NULL != mFvbEntry[Index].FvbExtension) { - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].FvbExtension->EraseFvbCustomBlock); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].FvbExtension); - } - } - - EfiConvertPointer (0x0, (VOID **) &mFvbEntry); - } -} - -/** - Library constructor function entry. - - @param ImageHandle The handle of image who call this libary. - @param SystemTable The point of System Table. - - @retval EFI_SUCESS Sucess construct this library. - @retval Others Fail to contruct this libary. -**/ -EFI_STATUS -EFIAPI -FvbLibInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - UINTN Status; - mFvbCount = 0; - - Status = gBS->AllocatePool ( - EfiRuntimeServicesData, - (UINTN) sizeof (FVB_ENTRY) * MAX_FVB_COUNT, - (VOID *) &mFvbEntry - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - ZeroMem (mFvbEntry, sizeof (FVB_ENTRY) * MAX_FVB_COUNT); - - EfiCreateProtocolNotifyEvent ( - &gEfiFirmwareVolumeBlockProtocolGuid, - TPL_CALLBACK, - FvbNotificationEvent, - NULL, - &mFvbRegistration - ); - - // - // Register SetVirtualAddressMap () notify function - // - Status = gBS->CreateEvent ( - EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, - TPL_NOTIFY, - FvbVirtualAddressChangeNotifyEvent, - NULL, - &mSetVirtualMapChangedEvent - ); - ASSERT_EFI_ERROR (Status); - - return EFI_SUCCESS; -} - -// -// ============================================================================= -// The following functions wrap Fvb protocol in the Runtime Lib functions. -// The Instance translates into Fvb instance. The Fvb order defined by HOBs and -// thus the sequence of FVB protocol addition define Instance. -// -// EfiFvbInitialize () must be called before any of the following functions -// must be called. -// ============================================================================= -// - -/** - Reads specified number of bytes into a buffer from the specified block - - @param Instance The FV instance to be read from. - @param Lba The logical block address to be read from - @param Offset Offset into the block at which to begin reading - @param NumBytes Pointer that on input contains the total size of - the buffer. On output, it contains the total number - of bytes read - @param Buffer Pointer to a caller allocated buffer that will be - used to hold the data read - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to Read block - @retval Others Fail to read block -**/ -EFI_STATUS -EfiFvbReadBlock ( - IN UINTN Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->Read (mFvbEntry[Instance].Fvb, Lba, Offset, NumBytes, Buffer); -} - -/** - Writes specified number of bytes from the input buffer to the block - - @param Instance The FV instance to be written to - @param Lba The starting logical block index to write to - @param Offset Offset into the block at which to begin writing - @param NumBytes Pointer that on input contains the total size of - the buffer. On output, it contains the total number - of bytes actually written - @param Buffer Pointer to a caller allocated buffer that contains - the source for the write - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to write block - @retval Others Fail to write block -**/ -EFI_STATUS -EfiFvbWriteBlock ( - IN UINTN Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->Write (mFvbEntry[Instance].Fvb, Lba, Offset, NumBytes, Buffer); -} - -/** - Erases and initializes a firmware volume block - - @param Instance The FV instance to be erased - @param Lba The logical block index to be erased - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to erase block - @retval Others Fail to erase block -**/ -EFI_STATUS -EfiFvbEraseBlock ( - IN UINTN Instance, - IN EFI_LBA Lba - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->EraseBlocks (mFvbEntry[Instance].Fvb, Lba, -1); -} - -/** - Retrieves attributes, insures positive polarity of attribute bits, returns - resulting attributes in output parameter - - @param Instance The FV instance whose attributes is going to be returned - @param Attributes Output buffer which contains attributes - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to get Fv attribute - @retval Others Fail to get Fv attribute -**/ -EFI_STATUS -EfiFvbGetVolumeAttributes ( - IN UINTN Instance, - OUT EFI_FVB_ATTRIBUTES *Attributes - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->GetAttributes (mFvbEntry[Instance].Fvb, Attributes); -} - -/** - Modifies the current settings of the firmware volume according to the - input parameter, and returns the new setting of the volume - - @param Instance The FV instance whose attributes is going to be - modified - @param Attributes On input, it is a pointer to EFI_FVB_ATTRIBUTES - containing the desired firmware volume settings. - On successful return, it contains the new settings - of the firmware volume - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to set Fv attribute - @retval Others Fail to set Fv attribute -**/ -EFI_STATUS -EfiFvbSetVolumeAttributes ( - IN UINTN Instance, - IN OUT EFI_FVB_ATTRIBUTES *Attributes - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->SetAttributes (mFvbEntry[Instance].Fvb, Attributes); -} - -/** - Retrieves the physical address of a memory mapped FV - - @param Instance The FV instance whose base address is going to be - returned - @param BaseAddress Pointer to a caller allocated EFI_PHYSICAL_ADDRESS - that on successful return, contains the base address - of the firmware volume. - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to get physical address - @retval Others Fail to get physical address -**/ -EFI_STATUS -EfiFvbGetPhysicalAddress ( - IN UINTN Instance, - OUT EFI_PHYSICAL_ADDRESS *BaseAddress - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->GetPhysicalAddress (mFvbEntry[Instance].Fvb, BaseAddress); -} - -/** - Retrieve the size of a logical block - - @param Instance The FV instance whose block size is going to be - returned - @param Lba Indicates which block to return the size for. - @param BlockSize A pointer to a caller allocated UINTN in which - the size of the block is returned - @param NumOfBlocks a pointer to a caller allocated UINTN in which the - number of consecutive blocks starting with Lba is - returned. All blocks in this range have a size of - BlockSize - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to get block size - @retval Others Fail to get block size -**/ -EFI_STATUS -EfiFvbGetBlockSize ( - IN UINTN Instance, - IN EFI_LBA Lba, - OUT UINTN *BlockSize, - OUT UINTN *NumOfBlocks - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->GetBlockSize (mFvbEntry[Instance].Fvb, Lba, BlockSize, NumOfBlocks); -} - -/** - Erases and initializes a specified range of a firmware volume - - @param Instance The FV instance to be erased - @param StartLba The starting logical block index to be erased - @param OffsetStartLba Offset into the starting block at which to - begin erasing - @param LastLba The last logical block index to be erased - @param OffsetLastLba Offset into the last block at which to end erasing - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to erase custom block range - @retval Others Fail to erase custom block range -**/ -EFI_STATUS -EfiFvbEraseCustomBlockRange ( - IN UINTN Instance, - IN EFI_LBA StartLba, - IN UINTN OffsetStartLba, - IN EFI_LBA LastLba, - IN UINTN OffsetLastLba - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - if (!(mFvbEntry[Instance].FvbExtension)) { - return EFI_UNSUPPORTED; - } - - if (!(mFvbEntry[Instance].FvbExtension->EraseFvbCustomBlock)) { - return EFI_UNSUPPORTED; - } - - return mFvbEntry[Instance].FvbExtension->EraseFvbCustomBlock ( - mFvbEntry[Instance].FvbExtension, - StartLba, - OffsetStartLba, - LastLba, - OffsetLastLba - ); -} diff --git a/MdeModulePkg/Library/EdkFvbServiceLib/X64/Fvb.c b/MdeModulePkg/Library/EdkFvbServiceLib/X64/Fvb.c deleted file mode 100644 index c3459656b5..0000000000 --- a/MdeModulePkg/Library/EdkFvbServiceLib/X64/Fvb.c +++ /dev/null @@ -1,606 +0,0 @@ -/**@file - - Firmware Volume Block Protocol Runtime Abstraction - - mFvbEntry is an array of Handle Fvb pairs. The Fvb Lib Instance matches the - index in the mFvbEntry array. This should be the same sequence as the FVB's - were described in the HOB. We have to remember the handle so we can tell if - the protocol has been reinstalled and it needs updateing. - - If you are using any of these lib functions.you must first call FvbInitialize (). - -Copyright (c) 2006, 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 -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Fvb.h" - -// -// Event for Set Virtual Map Changed Event -// -STATIC EFI_EVENT mSetVirtualMapChangedEvent = NULL; - -// -// Lib will ASSERT if more FVB devices than this are added to the system. -// -STATIC FVB_ENTRY *mFvbEntry; -STATIC EFI_EVENT mFvbRegistration; -STATIC UINTN mFvbCount; - -/** - Check whether an address is runtime memory or not. - - @param Address The Address being checked. - - @retval TRUE The address is runtime memory. - @retval FALSE The address is not runtime memory. -**/ -BOOLEAN -IsRuntimeMemory ( - IN VOID *Address - ) -{ - EFI_STATUS Status; - UINT8 TmpMemoryMap[1]; - UINTN MapKey; - UINTN DescriptorSize; - UINT32 DescriptorVersion; - UINTN MemoryMapSize; - EFI_MEMORY_DESCRIPTOR *MemoryMap; - EFI_MEMORY_DESCRIPTOR *MemoryMapPtr; - BOOLEAN IsRuntime; - UINTN Index; - - IsRuntime = FALSE; - - // - // Get System MemoryMapSize - // - MemoryMapSize = 1; - Status = gBS->GetMemoryMap ( - &MemoryMapSize, - (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion - ); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); - // - // Enlarge space here, because we will allocate pool now. - // - MemoryMapSize += EFI_PAGE_SIZE; - Status = gBS->AllocatePool ( - EfiBootServicesData, - MemoryMapSize, - (VOID**)&MemoryMap - ); - ASSERT_EFI_ERROR (Status); - - // - // Get System MemoryMap - // - Status = gBS->GetMemoryMap ( - &MemoryMapSize, - MemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion - ); - ASSERT_EFI_ERROR (Status); - - MemoryMapPtr = MemoryMap; - // - // Search the request Address - // - for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) { - if (((EFI_PHYSICAL_ADDRESS)(UINTN)Address >= MemoryMap->PhysicalStart) && - ((EFI_PHYSICAL_ADDRESS)(UINTN)Address < MemoryMap->PhysicalStart - + LShiftU64 (MemoryMap->NumberOfPages, EFI_PAGE_SHIFT))) { - // - // Found it - // - if (MemoryMap->Attribute & EFI_MEMORY_RUNTIME) { - IsRuntime = TRUE; - } - break; - } - // - // Get next item - // - MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize); - } - - // - // Done - // - gBS->FreePool (MemoryMapPtr); - - return IsRuntime; -} - -/** - Update mFvbEntry. Add new entry, or update existing entry if Fvb protocol is - reinstalled. - - @param Event The Event that is being processed - @param Context Event Context - -**/ -STATIC -VOID -EFIAPI -FvbNotificationEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - UINTN BufferSize; - EFI_HANDLE Handle; - UINTN Index; - UINTN UpdateIndex; - - while (TRUE) { - BufferSize = sizeof (Handle); - Status = gBS->LocateHandle ( - ByRegisterNotify, - &gEfiFirmwareVolumeBlockProtocolGuid, - mFvbRegistration, - &BufferSize, - &Handle - ); - if (EFI_ERROR (Status)) { - // - // Exit Path of While Loop.... - // - break; - } - - UpdateIndex = MAX_FVB_COUNT; - for (Index = 0; Index < mFvbCount; Index++) { - if (mFvbEntry[Index].Handle == Handle) { - // - // If the handle is already in the table just update the protocol - // - UpdateIndex = Index; - break; - } - } - - if (UpdateIndex == MAX_FVB_COUNT) { - // - // Use the next free slot for a new entry - // - UpdateIndex = mFvbCount++; - // - // Check the UpdateIndex whether exceed the maximum value. - // - ASSERT (UpdateIndex < MAX_FVB_COUNT); - mFvbEntry[UpdateIndex].Handle = Handle; - } - // - // The array does not have enough entries - // - ASSERT (UpdateIndex < MAX_FVB_COUNT); - - // - // Get the interface pointer and if it's ours, skip it - // - Status = gBS->HandleProtocol ( - Handle, - &gEfiFirmwareVolumeBlockProtocolGuid, - (VOID **) &mFvbEntry[UpdateIndex].Fvb - ); - ASSERT_EFI_ERROR (Status); - - Status = gBS->HandleProtocol ( - Handle, - &gEfiFvbExtensionProtocolGuid, - (VOID **) &mFvbEntry[UpdateIndex].FvbExtension - ); - if (Status != EFI_SUCCESS) { - mFvbEntry[UpdateIndex].FvbExtension = NULL; - } - - // - // Check the FVB can be accessed in RUNTIME, The FVBs in FVB handle list comes - // from two way: - // 1) Dxe Core. (FVB information is transferred from FV HOB). - // 2) FVB driver. - // The FVB produced Dxe core is used for discoverying DXE driver and dispatch. These - // FVBs can only be accessed in boot time. - // FVB driver will discovery all FV in FLASH and these FVBs can be accessed in runtime. - // The FVB itself produced by FVB driver is allocated in runtime memory. So we can - // determine the what FVB can be accessed in RUNTIME by judging whether FVB itself is allocated - // in RUNTIME memory. - // - mFvbEntry[UpdateIndex].IsRuntimeAccess = IsRuntimeMemory (mFvbEntry[UpdateIndex].Fvb); - } -} - -/** - Convert all pointers in mFvbEntry after ExitBootServices. - - @param Event The Event that is being processed - @param Context Event Context - -**/ -VOID -EFIAPI -FvbVirtualAddressChangeNotifyEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UINTN Index; - if (mFvbEntry != NULL) { - for (Index = 0; Index < MAX_FVB_COUNT; Index++) { - if (!mFvbEntry[Index].IsRuntimeAccess) { - continue; - } - - if (NULL != mFvbEntry[Index].Fvb) { - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetBlockSize); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetPhysicalAddress); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->GetAttributes); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->SetAttributes); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->Read); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->Write); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb->EraseBlocks); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].Fvb); - } - - if (NULL != mFvbEntry[Index].FvbExtension) { - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].FvbExtension->EraseFvbCustomBlock); - EfiConvertPointer (0x0, (VOID **) &mFvbEntry[Index].FvbExtension); - } - } - - EfiConvertPointer (0x0, (VOID **) &mFvbEntry); - } -} - -/** - Library constructor function entry. - - @param ImageHandle The handle of image who call this libary. - @param SystemTable The point of System Table. - - @retval EFI_SUCESS Sucess construct this library. - @retval Others Fail to contruct this libary. -**/ -EFI_STATUS -EFIAPI -FvbLibInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - UINTN Status; - mFvbCount = 0; - - Status = gBS->AllocatePool ( - EfiRuntimeServicesData, - (UINTN) sizeof (FVB_ENTRY) * MAX_FVB_COUNT, - (VOID *) &mFvbEntry - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - ZeroMem (mFvbEntry, sizeof (FVB_ENTRY) * MAX_FVB_COUNT); - - EfiCreateProtocolNotifyEvent ( - &gEfiFirmwareVolumeBlockProtocolGuid, - TPL_CALLBACK, - FvbNotificationEvent, - NULL, - &mFvbRegistration - ); - - // - // Register SetVirtualAddressMap () notify function - // - Status = gBS->CreateEvent ( - EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, - TPL_NOTIFY, - FvbVirtualAddressChangeNotifyEvent, - NULL, - &mSetVirtualMapChangedEvent - ); - ASSERT_EFI_ERROR (Status); - - return EFI_SUCCESS; -} - -// -// ============================================================================= -// The following functions wrap Fvb protocol in the Runtime Lib functions. -// The Instance translates into Fvb instance. The Fvb order defined by HOBs and -// thus the sequence of FVB protocol addition define Instance. -// -// EfiFvbInitialize () must be called before any of the following functions -// must be called. -// ============================================================================= -// - -/** - Reads specified number of bytes into a buffer from the specified block - - @param Instance The FV instance to be read from. - @param Lba The logical block address to be read from - @param Offset Offset into the block at which to begin reading - @param NumBytes Pointer that on input contains the total size of - the buffer. On output, it contains the total number - of bytes read - @param Buffer Pointer to a caller allocated buffer that will be - used to hold the data read - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to Read block - @retval Others Fail to read block -**/ -EFI_STATUS -EfiFvbReadBlock ( - IN UINTN Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->Read (mFvbEntry[Instance].Fvb, Lba, Offset, NumBytes, Buffer); -} - -/** - Writes specified number of bytes from the input buffer to the block - - @param Instance The FV instance to be written to - @param Lba The starting logical block index to write to - @param Offset Offset into the block at which to begin writing - @param NumBytes Pointer that on input contains the total size of - the buffer. On output, it contains the total number - of bytes actually written - @param Buffer Pointer to a caller allocated buffer that contains - the source for the write - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to write block - @retval Others Fail to write block -**/ -EFI_STATUS -EfiFvbWriteBlock ( - IN UINTN Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->Write (mFvbEntry[Instance].Fvb, Lba, Offset, NumBytes, Buffer); -} - -/** - Erases and initializes a firmware volume block - - @param Instance The FV instance to be erased - @param Lba The logical block index to be erased - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to erase block - @retval Others Fail to erase block -**/ -EFI_STATUS -EfiFvbEraseBlock ( - IN UINTN Instance, - IN EFI_LBA Lba - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->EraseBlocks (mFvbEntry[Instance].Fvb, Lba, -1); -} - -/** - Retrieves attributes, insures positive polarity of attribute bits, returns - resulting attributes in output parameter - - @param Instance The FV instance whose attributes is going to be returned - @param Attributes Output buffer which contains attributes - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to get Fv attribute - @retval Others Fail to get Fv attribute -**/ -EFI_STATUS -EfiFvbGetVolumeAttributes ( - IN UINTN Instance, - OUT EFI_FVB_ATTRIBUTES *Attributes - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->GetAttributes (mFvbEntry[Instance].Fvb, Attributes); -} - -/** - Modifies the current settings of the firmware volume according to the - input parameter, and returns the new setting of the volume - - @param Instance The FV instance whose attributes is going to be - modified - @param Attributes On input, it is a pointer to EFI_FVB_ATTRIBUTES - containing the desired firmware volume settings. - On successful return, it contains the new settings - of the firmware volume - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to set Fv attribute - @retval Others Fail to set Fv attribute -**/ -EFI_STATUS -EfiFvbSetVolumeAttributes ( - IN UINTN Instance, - IN OUT EFI_FVB_ATTRIBUTES *Attributes - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->SetAttributes (mFvbEntry[Instance].Fvb, Attributes); -} - -/** - Retrieves the physical address of a memory mapped FV - - @param Instance The FV instance whose base address is going to be - returned - @param BaseAddress Pointer to a caller allocated EFI_PHYSICAL_ADDRESS - that on successful return, contains the base address - of the firmware volume. - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to get physical address - @retval Others Fail to get physical address -**/ -EFI_STATUS -EfiFvbGetPhysicalAddress ( - IN UINTN Instance, - OUT EFI_PHYSICAL_ADDRESS *BaseAddress - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->GetPhysicalAddress (mFvbEntry[Instance].Fvb, BaseAddress); -} - -/** - Retrieve the size of a logical block - - @param Instance The FV instance whose block size is going to be - returned - @param Lba Indicates which block to return the size for. - @param BlockSize A pointer to a caller allocated UINTN in which - the size of the block is returned - @param NumOfBlocks a pointer to a caller allocated UINTN in which the - number of consecutive blocks starting with Lba is - returned. All blocks in this range have a size of - BlockSize - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to get block size - @retval Others Fail to get block size -**/ -EFI_STATUS -EfiFvbGetBlockSize ( - IN UINTN Instance, - IN EFI_LBA Lba, - OUT UINTN *BlockSize, - OUT UINTN *NumOfBlocks - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - return mFvbEntry[Instance].Fvb->GetBlockSize (mFvbEntry[Instance].Fvb, Lba, BlockSize, NumOfBlocks); -} - -/** - Erases and initializes a specified range of a firmware volume - - @param Instance The FV instance to be erased - @param StartLba The starting logical block index to be erased - @param OffsetStartLba Offset into the starting block at which to - begin erasing - @param LastLba The last logical block index to be erased - @param OffsetLastLba Offset into the last block at which to end erasing - - @retval EFI_INVALID_PARAMETER Invalid parameter - @retval EFI_SUCESS Sucess to erase custom block range - @retval Others Fail to erase custom block range -**/ -EFI_STATUS -EfiFvbEraseCustomBlockRange ( - IN UINTN Instance, - IN EFI_LBA StartLba, - IN UINTN OffsetStartLba, - IN EFI_LBA LastLba, - IN UINTN OffsetLastLba - ) -{ - if (Instance >= mFvbCount) { - return EFI_INVALID_PARAMETER; - } - - if (EfiAtRuntime() && !mFvbEntry[Instance].IsRuntimeAccess) { - return EFI_INVALID_PARAMETER; - } - - if (!(mFvbEntry[Instance].FvbExtension)) { - return EFI_UNSUPPORTED; - } - - if (!(mFvbEntry[Instance].FvbExtension->EraseFvbCustomBlock)) { - return EFI_UNSUPPORTED; - } - - return mFvbEntry[Instance].FvbExtension->EraseFvbCustomBlock ( - mFvbEntry[Instance].FvbExtension, - StartLba, - OffsetStartLba, - LastLba, - OffsetLastLba - ); -} -- cgit v1.2.3