Previous DxeCore FwVol code will cache whole FvMain FV from flash that may be uncached if platform reports FvMain FVB, it will impact DXE performance. The code already has file level cache, so don’t need to cache memory mapped IO FV. It can also reduce memory consumption of caching memory mapped IO FVs. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15916 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			430 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			430 lines
		
	
	
		
			16 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 - 2014, Intel Corporation. All rights reserved.<BR>
 | |
| 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;
 | |
|   BOOLEAN                         FileCached;
 | |
| } 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;
 | |
| 
 | |
|   UINT32                                  AuthenticationStatus;
 | |
|   UINT8                                   ErasePolarity;
 | |
|   BOOLEAN                                 IsFfs3Fv;
 | |
|   BOOLEAN                                 IsMemoryMapped;
 | |
| } 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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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
 | |
|   );
 | |
| 
 | |
| #endif
 |