EFI_SIGNATURE_16 -> SIGNATURE_16 EFI_SIGNATURE_32 -> SIGNATURE_32 EFI_SIGNATURE_64 -> SIGNATURE_64 EFI_FIELD_OFFSET -> OFFSET_OF EFI_MAX_BIT -> MAX_BIT EFI_MAX_ADDRESS -> MAX_ADDRESS These macros are not defined in UEFI spec. It makes more sense to use the equivalent macros in Base.h to avoid alias. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7056 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			459 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			459 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Firmware File System protocol. Layers on top of Firmware
 | |
|   Block protocol to produce a file abstraction of FV based files.
 | |
| 
 | |
| Copyright (c) 2006 - 2008, Intel Corporation. <BR>
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __FW_VOL_DRIVER_H_
 | |
| #define __FW_VOL_DRIVER_H_
 | |
| 
 | |
| 
 | |
| #define FV2_DEVICE_SIGNATURE SIGNATURE_32 ('_', 'F', 'V', '2')
 | |
| 
 | |
| //
 | |
| // Used to track all non-deleted files
 | |
| //
 | |
| typedef struct {
 | |
|   LIST_ENTRY                      Link;
 | |
|   EFI_FFS_FILE_HEADER             *FfsHeader;
 | |
|   UINTN                           StreamHandle;
 | |
| } FFS_FILE_LIST_ENTRY;
 | |
| 
 | |
| typedef struct {
 | |
|   UINTN                                   Signature;
 | |
|   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL      *Fvb;
 | |
|   EFI_HANDLE                              Handle;
 | |
|   EFI_FIRMWARE_VOLUME2_PROTOCOL           Fv;
 | |
| 
 | |
|   EFI_FIRMWARE_VOLUME_HEADER              *FwVolHeader;
 | |
|   UINT8                                   *CachedFv;
 | |
|   UINT8                                   *EndOfCachedFv;
 | |
| 
 | |
|   FFS_FILE_LIST_ENTRY                     *LastKey;
 | |
| 
 | |
|   LIST_ENTRY                              FfsFileListHeader;
 | |
| 
 | |
|   UINT8                                   ErasePolarity;
 | |
| } FV_DEVICE;
 | |
| 
 | |
| #define FV_DEVICE_FROM_THIS(a) CR(a, FV_DEVICE, Fv, FV2_DEVICE_SIGNATURE)
 | |
| 
 | |
| /**
 | |
|   Retrieves attributes, insures positive polarity of attribute bits, returns
 | |
|   resulting attributes in output parameter.
 | |
| 
 | |
|   @param  This             Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  Attributes       output buffer which contains attributes.
 | |
| 
 | |
|   @retval EFI_SUCCESS      Successfully got volume attributes.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvGetVolumeAttributes (
 | |
|   IN  CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
 | |
|   OUT       EFI_FV_ATTRIBUTES             *Attributes
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Sets current attributes for volume
 | |
| 
 | |
|   @param  This             Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  Attributes       At input, contains attributes to be set.  At output
 | |
|                            contains new value of FV.
 | |
| 
 | |
|   @retval EFI_UNSUPPORTED  Could not be set.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvSetVolumeAttributes (
 | |
|   IN     CONST EFI_FIRMWARE_VOLUME2_PROTOCOL  *This,
 | |
|   IN OUT       EFI_FV_ATTRIBUTES              *Attributes
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Given the input key, search for the next matching file in the volume.
 | |
| 
 | |
|   @param  This                       Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  Key                        Key is a pointer to a caller allocated
 | |
|                                      buffer that contains implementation specific
 | |
|                                      data that is used to track where to begin
 | |
|                                      the search for the next file. The size of
 | |
|                                      the buffer must be at least This->KeySize
 | |
|                                      bytes long. To reinitialize the search and
 | |
|                                      begin from the beginning of the firmware
 | |
|                                      volume, the entire buffer must be cleared to
 | |
|                                      zero. Other than clearing the buffer to
 | |
|                                      initiate a new search, the caller must not
 | |
|                                      modify the data in the buffer between calls
 | |
|                                      to GetNextFile().
 | |
|   @param  FileType                   FileType is a pointer to a caller allocated
 | |
|                                      EFI_FV_FILETYPE. The GetNextFile() API can
 | |
|                                      filter it's search for files based on the
 | |
|                                      value of *FileType input. A *FileType input
 | |
|                                      of 0 causes GetNextFile() to search for
 | |
|                                      files of all types.  If a file is found, the
 | |
|                                      file's type is returned in *FileType.
 | |
|                                      *FileType is not modified if no file is
 | |
|                                      found.
 | |
|   @param  NameGuid                   NameGuid is a pointer to a caller allocated
 | |
|                                      EFI_GUID. If a file is found, the file's
 | |
|                                      name is returned in *NameGuid.  *NameGuid is
 | |
|                                      not modified if no file is found.
 | |
|   @param  Attributes                 Attributes is a pointer to a caller
 | |
|                                      allocated EFI_FV_FILE_ATTRIBUTES.  If a file
 | |
|                                      is found, the file's attributes are returned
 | |
|                                      in *Attributes. *Attributes is not modified
 | |
|                                      if no file is found.
 | |
|   @param  Size                       Size is a pointer to a caller allocated
 | |
|                                      UINTN. If a file is found, the file's size
 | |
|                                      is returned in *Size. *Size is not modified
 | |
|                                      if no file is found.
 | |
| 
 | |
|   @retval EFI_SUCCESS                Successfully find the file.
 | |
|   @retval EFI_DEVICE_ERROR           Device error.
 | |
|   @retval EFI_ACCESS_DENIED          Fv could not read.
 | |
|   @retval EFI_NOT_FOUND              No matching file found.
 | |
|   @retval EFI_INVALID_PARAMETER      Invalid parameter
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvGetNextFile (
 | |
|   IN CONST   EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
 | |
|   IN OUT     VOID                          *Key,
 | |
|   IN OUT     EFI_FV_FILETYPE               *FileType,
 | |
|   OUT        EFI_GUID                      *NameGuid,
 | |
|   OUT        EFI_FV_FILE_ATTRIBUTES        *Attributes,
 | |
|   OUT        UINTN                         *Size
 | |
|   );
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Locates a file in the firmware volume and
 | |
|   copies it to the supplied buffer.
 | |
| 
 | |
|   @param  This                       Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  NameGuid                   Pointer to an EFI_GUID, which is the
 | |
|                                      filename.
 | |
|   @param  Buffer                     Buffer is a pointer to pointer to a buffer
 | |
|                                      in which the file or section contents or are
 | |
|                                      returned.
 | |
|   @param  BufferSize                 BufferSize is a pointer to caller allocated
 | |
|                                      UINTN. On input *BufferSize indicates the
 | |
|                                      size in bytes of the memory region pointed
 | |
|                                      to by Buffer. On output, *BufferSize
 | |
|                                      contains the number of bytes required to
 | |
|                                      read the file.
 | |
|   @param  FoundType                  FoundType is a pointer to a caller allocated
 | |
|                                      EFI_FV_FILETYPE that on successful return
 | |
|                                      from Read() contains the type of file read.
 | |
|                                      This output reflects the file type
 | |
|                                      irrespective of the value of the SectionType
 | |
|                                      input.
 | |
|   @param  FileAttributes             FileAttributes is a pointer to a caller
 | |
|                                      allocated EFI_FV_FILE_ATTRIBUTES.  On
 | |
|                                      successful return from Read(),
 | |
|                                      *FileAttributes contains the attributes of
 | |
|                                      the file read.
 | |
|   @param  AuthenticationStatus       AuthenticationStatus is a pointer to a
 | |
|                                      caller allocated UINTN in which the
 | |
|                                      authentication status is returned.
 | |
| 
 | |
|   @retval EFI_SUCCESS                Successfully read to memory buffer.
 | |
|   @retval EFI_WARN_BUFFER_TOO_SMALL  Buffer too small.
 | |
|   @retval EFI_NOT_FOUND              Not found.
 | |
|   @retval EFI_DEVICE_ERROR           Device error.
 | |
|   @retval EFI_ACCESS_DENIED          Could not read.
 | |
|   @retval EFI_INVALID_PARAMETER      Invalid parameter.
 | |
|   @retval EFI_OUT_OF_RESOURCES       Not enough buffer to be allocated.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvReadFile (
 | |
|   IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
 | |
|   IN CONST EFI_GUID                      *NameGuid,
 | |
|   IN OUT   VOID                          **Buffer,
 | |
|   IN OUT   UINTN                         *BufferSize,
 | |
|   OUT      EFI_FV_FILETYPE               *FoundType,
 | |
|   OUT      EFI_FV_FILE_ATTRIBUTES        *FileAttributes,
 | |
|   OUT      UINT32                        *AuthenticationStatus
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Locates a section in a given FFS File and
 | |
|   copies it to the supplied buffer (not including section header).
 | |
| 
 | |
|   @param  This                       Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  NameGuid                   Pointer to an EFI_GUID, which is the
 | |
|                                      filename.
 | |
|   @param  SectionType                Indicates the section type to return.
 | |
|   @param  SectionInstance            Indicates which instance of sections with a
 | |
|                                      type of SectionType to return.
 | |
|   @param  Buffer                     Buffer is a pointer to pointer to a buffer
 | |
|                                      in which the file or section contents or are
 | |
|                                      returned.
 | |
|   @param  BufferSize                 BufferSize is a pointer to caller allocated
 | |
|                                      UINTN.
 | |
|   @param  AuthenticationStatus       AuthenticationStatus is a pointer to a
 | |
|                                      caller allocated UINT32 in which the
 | |
|                                      authentication status is returned.
 | |
| 
 | |
|   @retval EFI_SUCCESS                Successfully read the file section into
 | |
|                                      buffer.
 | |
|   @retval EFI_WARN_BUFFER_TOO_SMALL  Buffer too small.
 | |
|   @retval EFI_NOT_FOUND              Section not found.
 | |
|   @retval EFI_DEVICE_ERROR           Device error.
 | |
|   @retval EFI_ACCESS_DENIED          Could not read.
 | |
|   @retval EFI_INVALID_PARAMETER      Invalid parameter.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvReadFileSection (
 | |
|   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL  *This,
 | |
|   IN CONST  EFI_GUID                       *NameGuid,
 | |
|   IN        EFI_SECTION_TYPE               SectionType,
 | |
|   IN        UINTN                          SectionInstance,
 | |
|   IN OUT    VOID                           **Buffer,
 | |
|   IN OUT    UINTN                          *BufferSize,
 | |
|   OUT       UINT32                         *AuthenticationStatus
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Writes one or more files to the firmware volume.
 | |
| 
 | |
|   @param  This                   Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  NumberOfFiles          Number of files.
 | |
|   @param  WritePolicy            WritePolicy indicates the level of reliability
 | |
|                                  for the write in the event of a power failure or
 | |
|                                  other system failure during the write operation.
 | |
|   @param  FileData               FileData is an pointer to an array of
 | |
|                                  EFI_FV_WRITE_DATA. Each element of array
 | |
|                                  FileData represents a file to be written.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Files successfully written to firmware volume
 | |
|   @retval EFI_OUT_OF_RESOURCES   Not enough buffer to be allocated.
 | |
|   @retval EFI_DEVICE_ERROR       Device error.
 | |
|   @retval EFI_WRITE_PROTECTED    Write protected.
 | |
|   @retval EFI_NOT_FOUND          Not found.
 | |
|   @retval EFI_INVALID_PARAMETER  Invalid parameter.
 | |
|   @retval EFI_UNSUPPORTED        This function not supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvWriteFile (
 | |
|   IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL  *This,
 | |
|   IN       UINT32                         NumberOfFiles,
 | |
|   IN       EFI_FV_WRITE_POLICY            WritePolicy,
 | |
|   IN       EFI_FV_WRITE_FILE_DATA         *FileData
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Return information of type InformationType for the requested firmware
 | |
|   volume.
 | |
| 
 | |
|   @param  This             Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  InformationType  InformationType for requested.
 | |
|   @param  BufferSize       On input, size of Buffer.On output, the amount of data
 | |
|                            returned in Buffer.
 | |
|   @param  Buffer           A poniter to the data buffer to return.
 | |
| 
 | |
|   @retval EFI_SUCCESS      Successfully got volume Information.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvGetVolumeInfo (
 | |
|   IN  CONST EFI_FIRMWARE_VOLUME2_PROTOCOL       *This,
 | |
|   IN  CONST EFI_GUID                            *InformationType,
 | |
|   IN OUT UINTN                                  *BufferSize,
 | |
|   OUT VOID                                      *Buffer
 | |
|   );
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Set information of type InformationType for the requested firmware
 | |
|   volume.
 | |
| 
 | |
|   @param  This             Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
 | |
|   @param  InformationType  InformationType for requested.
 | |
|   @param  BufferSize       On input, size of Buffer.On output, the amount of data
 | |
|                            returned in Buffer.
 | |
|   @param  Buffer           A poniter to the data buffer to return.
 | |
| 
 | |
|   @retval EFI_SUCCESS      Successfully set volume Information.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FvSetVolumeInfo (
 | |
|   IN  CONST EFI_FIRMWARE_VOLUME2_PROTOCOL       *This,
 | |
|   IN  CONST EFI_GUID                            *InformationType,
 | |
|   IN  UINTN                                     BufferSize,
 | |
|   IN CONST  VOID                                *Buffer
 | |
|   );
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Check if a block of buffer is erased.
 | |
| 
 | |
|   @param  ErasePolarity  Erase polarity attribute of the firmware volume
 | |
|   @param  InBuffer       The buffer to be checked
 | |
|   @param  BufferSize     Size of the buffer in bytes
 | |
| 
 | |
|   @retval TRUE           The block of buffer is erased
 | |
|   @retval FALSE          The block of buffer is not erased
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| IsBufferErased (
 | |
|   IN UINT8    ErasePolarity,
 | |
|   IN VOID     *InBuffer,
 | |
|   IN UINTN    BufferSize
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Get the FFS file state by checking the highest bit set in the header's state field.
 | |
| 
 | |
|   @param  ErasePolarity  Erase polarity attribute of the firmware volume
 | |
|   @param  FfsHeader      Points to the FFS file header
 | |
| 
 | |
|   @return FFS File state
 | |
| 
 | |
| **/
 | |
| EFI_FFS_FILE_STATE
 | |
| GetFileState (
 | |
|   IN UINT8                ErasePolarity,
 | |
|   IN EFI_FFS_FILE_HEADER  *FfsHeader
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Set the FFS file state.
 | |
| 
 | |
|   @param  State                      The state to be set.
 | |
|   @param  FfsHeader                  Points to the FFS file header
 | |
| 
 | |
|   @return None.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SetFileState (
 | |
|   IN UINT8                State,
 | |
|   IN EFI_FFS_FILE_HEADER  *FfsHeader
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Verify checksum of the firmware volume header.
 | |
| 
 | |
|   @param  FvHeader       Points to the firmware volume header to be checked
 | |
| 
 | |
|   @retval TRUE           Checksum verification passed
 | |
|   @retval FALSE          Checksum verification failed
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| VerifyFvHeaderChecksum (
 | |
|   IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Check if it's a valid FFS file header.
 | |
| 
 | |
|   @param  ErasePolarity  Erase polarity attribute of the firmware volume
 | |
|   @param  FfsHeader      Points to the FFS file header to be checked
 | |
|   @param  FileState      FFS file state to be returned
 | |
| 
 | |
|   @retval TRUE           Valid FFS file header
 | |
|   @retval FALSE          Invalid FFS file header
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| IsValidFfsHeader (
 | |
|   IN UINT8                ErasePolarity,
 | |
|   IN EFI_FFS_FILE_HEADER  *FfsHeader,
 | |
|   OUT EFI_FFS_FILE_STATE  *FileState
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Check if it's a valid FFS file.
 | |
|   Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.
 | |
| 
 | |
|   @param  ErasePolarity  Erase polarity attribute of the firmware volume
 | |
|   @param  FfsHeader      Points to the FFS file to be checked
 | |
| 
 | |
|   @retval TRUE           Valid FFS file
 | |
|   @retval FALSE          Invalid FFS file
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| IsValidFfsFile (
 | |
|   IN UINT8                ErasePolarity,
 | |
|   IN EFI_FFS_FILE_HEADER  *FfsHeader
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   given the supplied FW_VOL_BLOCK_PROTOCOL, allocate a buffer for output and
 | |
|   copy the volume header into it.
 | |
| 
 | |
|   @param  Fvb                   The FW_VOL_BLOCK_PROTOCOL instance from which to
 | |
|                                 read the volume header
 | |
|   @param  FwVolHeader           Pointer to pointer to allocated buffer in which
 | |
|                                 the volume header is returned.
 | |
| 
 | |
|   @retval EFI_OUT_OF_RESOURCES  No enough buffer could be allocated.
 | |
|   @retval EFI_SUCCESS           Successfully read volume header to the allocated
 | |
|                                 buffer.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| GetFwVolHeader (
 | |
|   IN     EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *Fvb,
 | |
|   OUT    EFI_FIRMWARE_VOLUME_HEADER             **FwVolHeader
 | |
|   );
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Check if an FV is consistent and allocate cache for it.
 | |
| 
 | |
|   @param  FvDevice              A pointer to the FvDevice to be checked.
 | |
| 
 | |
|   @retval EFI_OUT_OF_RESOURCES  No enough buffer could be allocated.
 | |
|   @retval EFI_SUCCESS           FV is consistent and cache is allocated.
 | |
|   @retval EFI_VOLUME_CORRUPTED  File system is corrupted.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| FvCheck (
 | |
|   IN OUT FV_DEVICE  *FvDevice
 | |
|   );
 | |
| 
 | |
| #endif
 |