4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This file provides control over block-oriented firmware devices.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials are licensed and made available under
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncthe terms and conditions of the BSD License that accompanies this distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @par Revision Reference: PI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Version 1.0 and 1.2.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef __FIRMWARE_VOLUME_BLOCK_H__
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define __FIRMWARE_VOLUME_BLOCK_H__
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL is defined in PI 1.0 spec and its GUID value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// is later updated to be the same as that of EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// defined in PI 1.2 spec.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 0x8f644fa9, 0xe850, 0x4db1, {0x9c, 0xe2, 0xb, 0x44, 0x69, 0x8e, 0x8d, 0xa4 } }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL_GUID \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 0x8f644fa9, 0xe850, 0x4db1, {0x9c, 0xe2, 0xb, 0x44, 0x69, 0x8e, 0x8d, 0xa4 } }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The GetAttributes() function retrieves the attributes and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current settings of the block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Attributes Pointer to EFI_FVB_ATTRIBUTES_2 in which the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync attributes and current settings are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. Type EFI_FVB_ATTRIBUTES_2 is defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in EFI_FIRMWARE_VOLUME_HEADER.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The firmware volume attributes were
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI * EFI_FVB_GET_ATTRIBUTES)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_FVB_ATTRIBUTES_2 *Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The SetAttributes() function sets configurable firmware volume
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync attributes and returns the new settings of the firmware volume.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Attributes On input, Attributes is a pointer to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_ATTRIBUTES_2 that contains the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync desired firmware volume settings. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successful return, it contains the new
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync settings of the firmware volume. Type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_ATTRIBUTES_2 is defined in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FIRMWARE_VOLUME_HEADER.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The firmware volume attributes were returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The attributes requested are in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync conflict with the capabilities
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync as declared in the firmware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync volume header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI * EFI_FVB_SET_ATTRIBUTES)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The GetPhysicalAddress() function retrieves the base address of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a memory-mapped firmware volume. This function should be called
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync only for memory-mapped firmware volumes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Pointer to a caller-allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_PHYSICAL_ADDRESS that, on successful
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return from GetPhysicalAddress(), contains the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync base address of the firmware volume.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The firmware volume base address was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The firmware volume is not memory mapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI * EFI_FVB_GET_PHYSICAL_ADDRESS)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_PHYSICAL_ADDRESS *Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The GetBlockSize() function retrieves the size of the requested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync block. It also returns the number of additional blocks with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the identical size. The GetBlockSize() function is used to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieve the block map (see EFI_FIRMWARE_VOLUME_HEADER).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Lba Indicates the block for which to return the size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockSize Pointer to a caller-allocated UINTN in which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the size of the block is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumberOfBlocks Pointer to a caller-allocated UINTN in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which the number of consecutive blocks,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync starting with Lba, is returned. All
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blocks in this range have a size of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The firmware volume base address was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The requested LBA is out of range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI * EFI_FVB_GET_BLOCK_SIZE)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_LBA Lba,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *BlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *NumberOfBlocks
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the specified number of bytes into a buffer from the specified block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Read() function reads the requested number of bytes from the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync requested block and stores them in the provided buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Implementations should be mindful that the firmware volume
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync might be in the ReadDisabled state. If it is in this state,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the Read() function must return the status code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_ACCESS_DENIED without modifying the contents of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer. The Read() function must also prevent spanning block
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync boundaries. If a read is requested that would span a block
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync boundary, the read must read up to the boundary but not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync beyond. The output parameter NumBytes must be set to correctly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync indicate the number of bytes actually read. The caller must be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync aware that a read may be partially completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Lba The starting logical block index
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from which to read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Offset Offset into the block at which to begin reading.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumBytes Pointer to a UINTN. At entry, *NumBytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the total size of the buffer. At
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exit, *NumBytes contains the total number of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bytes read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to a caller-allocated buffer that will
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be used to hold the data that is read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The firmware volume was read successfully,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and contents are in Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE Read attempted across an LBA
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync boundary. On output, NumBytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the total number of bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned in Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The firmware volume is in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReadDisabled state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The block device is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync functioning correctly and could
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not be read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_FVB_READ)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_LBA Lba,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *NumBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes the specified number of bytes from the input buffer to the block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Write() function writes the specified number of bytes from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the provided buffer to the specified block and offset. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync firmware volume is sticky write, the caller must ensure that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync all the bits of the specified range to write are in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_ERASE_POLARITY state before calling the Write()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function, or else the result will be unpredictable. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unpredictability arises because, for a sticky-write firmware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync volume, a write may negate a bit in the EFI_FVB_ERASE_POLARITY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync state but cannot flip it back again. Before calling the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Write() function, it is recommended for the caller to first call
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the EraseBlocks() function to erase the specified block to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync write. A block erase cycle will transition bits from the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (NOT)EFI_FVB_ERASE_POLARITY state back to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_ERASE_POLARITY state. Implementations should be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mindful that the firmware volume might be in the WriteDisabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync state. If it is in this state, the Write() function must
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return the status code EFI_ACCESS_DENIED without modifying the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contents of the firmware volume. The Write() function must
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync also prevent spanning block boundaries. If a write is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync requested that spans a block boundary, the write must store up
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the boundary but not beyond. The output parameter NumBytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must be set to correctly indicate the number of bytes actually
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync written. The caller must be aware that a write may be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync partially completed. All writes, partial or otherwise, must be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fully flushed to the hardware before the Write() service
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returns.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Lba The starting logical block index to write to.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Offset Offset into the block at which to begin writing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumBytes The pointer to a UINTN. At entry, *NumBytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the total size of the buffer. At
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exit, *NumBytes contains the total number of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bytes actually written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The pointer to a caller-allocated buffer that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the source for the write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The firmware volume was written successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The write was attempted across an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LBA boundary. On output, NumBytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the total number of bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync actually written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The firmware volume is in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WriteDisabled state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The block device is malfunctioning
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and could not be written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI * EFI_FVB_WRITE)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_LBA Lba,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *NumBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// EFI_LBA_LIST_TERMINATOR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_LBA_LIST_TERMINATOR 0xFFFFFFFFFFFFFFFFULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Erases and initializes a firmware volume block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The EraseBlocks() function erases one or more blocks as denoted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by the variable argument list. The entire parameter list of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blocks must be verified before erasing any blocks. If a block is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync requested that does not exist within the associated firmware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync volume (it has a larger index than the last block of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync firmware volume), the EraseBlocks() function must return the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status code EFI_INVALID_PARAMETER without modifying the contents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the firmware volume. Implementations should be mindful that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the firmware volume might be in the WriteDisabled state. If it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is in this state, the EraseBlocks() function must return the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status code EFI_ACCESS_DENIED without modifying the contents of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the firmware volume. All calls to EraseBlocks() must be fully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync flushed to the hardware before the EraseBlocks() service
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returns.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ... The variable argument list is a list of tuples.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Each tuple describes a range of LBAs to erase
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and consists of the following:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - An EFI_LBA that indicates the starting LBA
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - A UINTN that indicates the number of blocks to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync erase.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The list is terminated with an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LBA_LIST_TERMINATOR. For example, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync following indicates that two ranges of blocks
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (5-7 and 10-11) are to be erased: EraseBlocks
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (This, 5, 3, 10, 2, EFI_LBA_LIST_TERMINATOR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The erase request successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The firmware volume is in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WriteDisabled state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The block device is not functioning
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync correctly and could not be written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The firmware device may have been
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync partially erased.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One or more of the LBAs listed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the variable argument list do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not exist in the firmware volume.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI * EFI_FVB_ERASE_BLOCKS)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// The Firmware Volume Block Protocol is the low-level interface
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// to a firmware volume. File-level access to a firmware volume
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// should not be done using the Firmware Volume Block Protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Normal access to a firmware volume must use the Firmware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Volume Protocol. Typically, only the file system driver that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// produces the Firmware Volume Protocol will bind to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Firmware Volume Block Protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_GET_ATTRIBUTES GetAttributes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_SET_ATTRIBUTES SetAttributes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_GET_PHYSICAL_ADDRESS GetPhysicalAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_GET_BLOCK_SIZE GetBlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_READ Read;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_WRITE Write;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FVB_ERASE_BLOCKS EraseBlocks;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// The handle of the parent firmware volume.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE ParentHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern EFI_GUID gEfiFirmwareVolumeBlockProtocolGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern EFI_GUID gEfiFirmwareVolumeBlock2ProtocolGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif