4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handles non-volatile variable store garbage collection, using FTW
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Fault Tolerant Write) protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Gets LBA of block and offset by given address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function gets the Logical Block Address (LBA) of a firmware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync volume block containing the given address, and the offset of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync address on the block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address which should be contained
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by returned FVB handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Lba Pointer to LBA for output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Offset Pointer to offset for output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS LBA and offset successfully returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Fail to find FVB handle by address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED Fail to find valid LBA and offset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the proper FVB protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFvbInfoByAddress (Address, NULL, &Fvb);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the Base Address of FV.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Fvb->GetPhysicalAddress (Fvb, &FvbBaseAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) FvbBaseAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the (LBA, Offset) of Address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((FwVolHeader->FvLength) > (FwVolHeader->HeaderLength)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BUGBUG: Assume one FV has one type of BlockLength.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LbaIndex = 1; LbaIndex <= FvbMapEntry->NumBlocks; LbaIndex += 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Address < (FvbBaseAddress + FvbMapEntry->Length * LbaIndex)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Found the (Lba, Offset).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Offset = (UINTN) (Address - (FvbBaseAddress + FvbMapEntry->Length * (LbaIndex - 1)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes a buffer to variable storage space, in the working block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function writes a buffer to variable storage space into a firmware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync volume block device. The destination is specified by parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableBase. Fault Tolerant Write protocol is used for writing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VariableBase Base address of variable to write
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Point to the data buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize The number of bytes of the data Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The function completed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Fail to locate Fault Tolerant Write protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The function could not complete successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate fault tolerant write protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate Fvb handle by address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFvbInfoByAddress (VariableBase, &FvbHandle, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get LBA and Offset by address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetLbaAndOffsetByAddress (VariableBase, &VarLba, &VarOffset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare for the variable data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FtwBufferSize = ((VARIABLE_STORE_HEADER *) ((UINTN) VariableBase))->Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // FTW write record.