summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2009-01-21 09:47:43 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2009-01-21 09:47:43 +0000
commit4c9c0f719df00f211790eadf04d21a93a0cdf76c (patch)
tree90a4d5a29da41787f75ac11191f707e8f2215f5e /EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk
parent96827f17562a5f055b7e14817f3388e881f33020 (diff)
downloadedk2-platforms-4c9c0f719df00f211790eadf04d21a93a0cdf76c.tar.xz
Rename module name from ***To*** to ***On***. AAAOnBBB means this module produce AAA Protocol/PPI based on BBB. This change improves the readability.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7328 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk')
-rw-r--r--EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.c1533
-rw-r--r--EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.inf60
2 files changed, 1593 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.c b/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.c
new file mode 100644
index 0000000000..5c6fd2a9e7
--- /dev/null
+++ b/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.c
@@ -0,0 +1,1533 @@
+/**
+Module produce FV2 on top of FV.
+
+UEFI PI specification supersedes Inte's Framework Specification.
+EFI_FIRMWARE_VOLUME_PROTOCOL defined in Intel Framework Pkg is replaced by
+EFI_FIRMWARE_VOLUME2_PROTOCOL in MdePkg.
+This module produces FV2 on top of FV. This module is used on platform when both of
+these two conditions are true:
+1) Framework module producing FV is present
+2) And the rest of modules on the platform consume FV2
+
+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.
+Module Name:
+
+**/
+
+#include <PiDxe.h>
+#include <Protocol/FirmwareVolume2.h>
+#include <Protocol/FirmwareVolume.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+/**
+
+ Because of constraints imposed by the underlying firmware
+ storage, an instance of the Firmware Volume Protocol may not
+ be to able to support all possible variations of this
+ architecture. These constraints and the current state of the
+ firmware volume are exposed to the caller using the
+ GetVolumeAttributes() function. GetVolumeAttributes() is
+ callable only from TPL_NOTIFY and below. Behavior of
+ GetVolumeAttributes() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param FvAttributes Pointer to an EFI_FV_ATTRIBUTES in which
+ the attributes and current settings are
+ returned.
+
+
+ @retval EFI_SUCCESS The firmware volume attributes were
+ returned.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2GetVolumeAttributes (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ OUT EFI_FV_ATTRIBUTES *FvAttributes
+ );
+
+
+/**
+ The SetVolumeAttributes() function is used to set configurable
+ firmware volume attributes. Only EFI_FV_READ_STATUS,
+ EFI_FV_WRITE_STATUS, and EFI_FV_LOCK_STATUS may be modified, and
+ then only in accordance with the declared capabilities. All
+ other bits of FvAttributes are ignored on input. On successful
+ return, all bits of *FvAttributes are valid and it contains the
+ completed EFI_FV_ATTRIBUTES for the volume. To modify an
+ attribute, the corresponding status bit in the EFI_FV_ATTRIBUTES
+ is set to the desired value on input. The EFI_FV_LOCK_STATUS bit
+ does not affect the ability to read or write the firmware
+ volume. Rather, once the EFI_FV_LOCK_STATUS bit is set, it
+ prevents further modification to all the attribute bits.
+ SetVolumeAttributes() is callable only from TPL_NOTIFY and
+ below. Behavior of SetVolumeAttributes() at any EFI_TPL above
+ TPL_NOTIFY is undefined. Type EFI_TPL is defined in
+ RaiseTPL() in the UEFI 2.0 specification.
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param FvAttributes On input, FvAttributes is a pointer to
+ an EFI_FV_ATTRIBUTES containing the
+ desired firmware volume settings. On
+ successful return, it contains the new
+ settings of the firmware volume. On
+ unsuccessful return, FvAttributes is not
+ modified and the firmware volume
+ settings are not changed.
+
+ @retval EFI_SUCCESS The requested firmware volume attributes
+ were set and the resulting
+ EFI_FV_ATTRIBUTES is returned in
+ FvAttributes.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
+ is set to 1 on input, but the
+ device does not support enabling
+ reads
+ (FvAttributes:EFI_FV_READ_ENABLE
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
+ is cleared to 0 on input, but
+ the device does not support
+ disabling reads
+ (FvAttributes:EFI_FV_READ_DISABL
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
+ is set to 1 on input, but the
+ device does not support enabling
+ writes
+ (FvAttributes:EFI_FV_WRITE_ENABL
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
+ is cleared to 0 on input, but
+ the device does not support
+ disabling writes
+ (FvAttributes:EFI_FV_WRITE_DISAB
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_LOCK_STATUS
+ is set on input, but the device
+ does not support locking
+ (FvAttributes:EFI_FV_LOCK_CAP is
+ clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_ACCESS_DENIED Device is locked and does not
+ allow attribute modification
+ (FvAttributes:EFI_FV_LOCK_STATUS
+ is set on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2SetVolumeAttributes (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN OUT EFI_FV_ATTRIBUTES *FvAttributes
+ );
+
+
+/**
+ ReadFile() is used to retrieve any file from a firmware volume
+ during the DXE phase. The actual binary encoding of the file in
+ the firmware volume media may be in any arbitrary format as long
+ as it does the following: ?It is accessed using the Firmware
+ Volume Protocol. ?The image that is returned follows the image
+ format defined in Code Definitions: PI Firmware File Format.
+ If the input value of Buffer==NULL, it indicates the caller is
+ requesting only that the type, attributes, and size of the
+ file be returned and that there is no output buffer. In this
+ case, the following occurs:
+ - BufferSize is returned with the size that is required to
+ successfully complete the read.
+ - The output parameters FoundType and *FileAttributes are
+ returned with valid values.
+ - The returned value of *AuthenticationStatus is undefined.
+
+ If the input value of Buffer!=NULL, the output buffer is
+ specified by a double indirection of the Buffer parameter. The
+ input value of *Buffer is used to determine if the output
+ buffer is caller allocated or is dynamically allocated by
+ ReadFile(). If the input value of *Buffer!=NULL, it indicates
+ the output buffer is caller allocated. In this case, the input
+ value of *BufferSize indicates the size of the
+ caller-allocated output buffer. If the output buffer is not
+ large enough to contain the entire requested output, it is
+ filled up to the point that the output buffer is exhausted and
+ EFI_WARN_BUFFER_TOO_SMALL is returned, and then BufferSize is
+ returned with the size required to successfully complete the
+ read. All other output parameters are returned with valid
+ values. If the input value of *Buffer==NULL, it indicates the
+ output buffer is to be allocated by ReadFile(). In this case,
+ ReadFile() will allocate an appropriately sized buffer from
+ boot services pool memory, which will be returned in Buffer.
+ The size of the new buffer is returned in BufferSize and all
+ other output parameters are returned with valid values.
+ ReadFile() is callable only from TPL_NOTIFY and below.
+ Behavior of ReadFile() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param NameGuid Pointer to an EFI_GUID, which is the file
+ name. All firmware file names are EFI_GUIDs.
+ A single firmware volume must not have two
+ valid files with the same file name
+ EFI_GUID.
+
+ @param Buffer Pointer to a pointer to a buffer in which the
+ file contents are returned, not including the
+ file header.
+ @param BufferSize Pointer to a caller-allocated UINTN. It
+ indicates the size of the memory
+ represented by Buffer.
+
+ @param FoundType Pointer to a caller-allocated
+ EFI_FV_FILETYPE.
+
+ @param FileAttributes Pointer to a caller-allocated
+ EFI_FV_FILE_ATTRIBUTES.
+
+ @param AuthenticationStatus Pointer to a caller-allocated
+ UINT32 in which the
+ authentication status is
+ returned.
+
+ @retval EFI_SUCCESS The call completed successfully.
+
+ @retval EFI_WARN_BUFFER_TOO_SMALL The buffer is too small to
+ contain the requested
+ output. The buffer is
+ filled and the output is
+ truncated.
+
+ @retval EFI_OUT_OF_RESOURCES An allocation failure occurred.
+
+ @retavl EFI_NOT_FOUND Name was not found in the firmware
+ volume.
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware
+ volume.
+
+ @retval EFI_ACCESS_DENIED The firmware volume is configured to
+ isallow reads.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2ReadFile (
+ 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
+ );
+
+/**
+ ReadSection() is used to retrieve a specific section from a file
+ within a firmware volume. The section returned is determined
+ using a depth-first, left-to-right search algorithm through all
+ sections found in the specified file. See
+ ????Firmware File Sections???? on page 9 for more details about
+ sections. The output buffer is specified by a double indirection
+ of the Buffer parameter. The input value of Buffer is used to
+ determine if the output buffer is caller allocated or is
+ dynamically allocated by ReadSection(). If the input value of
+ Buffer!=NULL, it indicates that the output buffer is caller
+ allocated. In this case, the input value of *BufferSize
+ indicates the size of the caller-allocated output buffer. If
+ the output buffer is not large enough to contain the entire
+ requested output, it is filled up to the point that the output
+ buffer is exhausted and EFI_WARN_BUFFER_TOO_SMALL is returned,
+ and then BufferSize is returned with the size that is required
+ to successfully complete the read. All other
+ output parameters are returned with valid values. If the input
+ value of *Buffer==NULL, it indicates the output buffer is to
+ be allocated by ReadSection(). In this case, ReadSection()
+ will allocate an appropriately sized buffer from boot services
+ pool memory, which will be returned in *Buffer. The size of
+ the new buffer is returned in *BufferSize and all other output
+ parameters are returned with valid values. ReadSection() is
+ callable only from TPL_NOTIFY and below. Behavior of
+ ReadSection() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param NameGuid Pointer to an EFI_GUID, which indicates the
+ file name from which the requested section
+ will be read.
+
+ @param SectionType Indicates the section type to return.
+ SectionType in conjunction with
+ SectionInstance indicates which section to
+ return.
+
+ @param SectionInstance Indicates which instance of sections
+ with a type of SectionType to return.
+ SectionType in conjunction with
+ SectionInstance indicates which
+ section to return. SectionInstance is
+ zero based.
+
+ @param Buffer Pointer to a pointer to a buffer in which the
+ section contents are returned, not including
+ the section header.
+
+ @param BufferSize Pointer to a caller-allocated UINTN. It
+ indicates the size of the memory
+ represented by Buffer.
+
+ @param AuthenticationStatus Pointer to a caller-allocated
+ UINT32 in which the authentication
+ status is returned.
+
+
+ @retval EFI_SUCCESS The call completed successfully.
+
+ @retval EFI_WARN_BUFFER_TOO_SMALL The caller-allocated
+ buffer is too small to
+ contain the requested
+ output. The buffer is
+ filled and the output is
+ truncated.
+
+ @retval EFI_OUT_OF_RESOURCES An allocation failure occurred.
+
+ @retval EFI_NOT_FOUND The requested file was not found in
+ the firmware volume. EFI_NOT_FOUND The
+ requested section was not found in the
+ specified file.
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware
+ volume.
+
+ @retval EFI_ACCESS_DENIED The firmware volume is configured to
+ disallow reads. EFI_PROTOCOL_ERROR
+ The requested section was not found,
+ but the file could not be fully
+ parsed because a required
+ GUIDED_SECTION_EXTRACTION_PROTOCOL
+ was not found. It is possible the
+ requested section exists within the
+ file and could be successfully
+ extracted once the required
+ GUIDED_SECTION_EXTRACTION_PROTOCOL
+ is published.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2ReadSection (
+ 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
+ );
+
+/**
+ WriteFile() is used to write one or more files to a firmware
+ volume. Each file to be written is described by an
+ EFI_FV_WRITE_FILE_DATA structure. The caller must ensure that
+ any required alignment for all files listed in the FileData
+ array is compatible with the firmware volume. Firmware volume
+ capabilities can be determined using the GetVolumeAttributes()
+ call. Similarly, if the WritePolicy is set to
+ EFI_FV_RELIABLE_WRITE, the caller must check the firmware volume
+ capabilities to ensure EFI_FV_RELIABLE_WRITE is supported by the
+ firmware volume. EFI_FV_UNRELIABLE_WRITE must always be
+ supported. Writing a file with a size of zero
+ (FileData[n].BufferSize == 0) deletes the file from the firmware
+ volume if it exists. Deleting a file must be done one at a time.
+ Deleting a file as part of a multiple file write is not allowed.
+ Platform Initialization Specification VOLUME 3 Shared
+ Architectural Elements 84 August 21, 2006 Version 1.0
+ WriteFile() is callable only from TPL_NOTIFY and below.
+ Behavior of WriteFile() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI 2.0
+ specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance. NumberOfFiles Indicates the number of
+ elements in the array pointed to by FileData.
+
+
+ @param 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 Pointer to an array of
+ EFI_FV_WRITE_FILE_DATA. Each element of
+ FileData[] represents a file to be written.
+
+
+ @retval EFI_SUCCESS The write completed successfully.
+
+ @retval EFI_OUT_OF_RESOURCES The firmware volume does not
+ have enough free space to
+ storefile(s).
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware volume.
+
+ @retval EFI_WRITE_PROTECTED The firmware volume is
+ configured to disallow writes.
+
+ @retval EFI_NOT_FOUND A delete was requested, but the
+ requested file was not found in the
+ firmware volume.
+
+ @retval EFI_INVALID_PARAMETER A delete was requested with a
+ multiple file write.
+
+ @retval EFI_INVALID_PARAMETER An unsupported WritePolicy was
+ requested.
+
+ @retval EFI_INVALID_PARAMETER An unknown file type was
+ specified.
+
+ @retval EFI_INVALID_PARAMETER A file system specific error
+ has occurred.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2WriteFile (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN UINT32 NumberOfFiles,
+ IN EFI_FV_WRITE_POLICY WritePolicy,
+ IN EFI_FV_WRITE_FILE_DATA *FileData
+ );
+
+/**
+ GetNextFile() is the interface that is used to search a firmware
+ volume for a particular file. It is called successively until
+ the desired file is located or the function returns
+ EFI_NOT_FOUND. To filter uninteresting files from the output,
+ the type of file to search for may be specified in FileType. For
+ example, if *FileType is EFI_FV_FILETYPE_DRIVER, only files of
+ this type will be returned in the output. If *FileType is
+ EFI_FV_FILETYPE_ALL, no filtering of file types is done. The Key
+ parameter is used to indicate a starting point of the search. If
+ the buffer *Key is completely initialized to zero, the search
+ re-initialized and starts at the beginning. Subsequent calls to
+ GetNextFile() must maintain the value of *Key returned by the
+ immediately previous call. The actual contents of *Key are
+ implementation specific and no semantic content is implied.
+ GetNextFile() is callable only from TPL_NOTIFY and below.
+ Behavior of GetNextFile() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI 2.0
+ specification. Status Codes Returned
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance. Key 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 re-initialize 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 Pointer to a caller-allocated
+ EFI_FV_FILETYPE. The GetNextFile() API can
+ filter its search for files based on the
+ value of the FileType input. A *FileType
+ input of EFI_FV_FILETYPE_ALL 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 Pointer to a caller-allocated EFI_GUID. If a
+ matching file is found, the file's name is
+ returned in NameGuid. If no matching file is
+ found, *NameGuid is not modified.
+
+ @param Attributes Pointer to a caller-allocated
+ EFI_FV_FILE_ATTRIBUTES. If a matching file
+ is found, the file's attributes are returned
+ in Attributes. If no matching file is found,
+ Attributes is not modified. Type
+ EFI_FV_FILE_ATTRIBUTES is defined in
+ ReadFile().
+
+ @param Size Pointer to a caller-allocated UINTN. If a
+ matching file is found, the file's size is
+ returned in *Size. If no matching file is found,
+ Size is not modified.
+
+ @retval EFI_SUCCESS The output parameters are filled with data
+ obtained from the first matching file that
+ was found.
+
+ @retval FI_NOT_FOUND No files of type FileType were found.
+
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware
+ volume.
+
+ @retval EFI_ACCESS_DENIED The firmware volume is configured to
+ disallow reads.
+
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2GetNextFile (
+ 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
+ );
+
+/**
+ The GetInfo() function returns information of type
+ InformationType for the requested firmware volume. If the volume
+ does not support the requested information type, then
+ EFI_UNSUPPORTED is returned. If the buffer is not large enough
+ to hold the requested structure, EFI_BUFFER_TOO_SMALL is
+ returned and the BufferSize is set to the size of buffer that is
+ required to make the request. The information types defined by
+ this specification are required information types that all file
+ systems must support.
+
+ @param This A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance that is the file handle the requested
+ information is for.
+
+ @param InformationType The type identifier for the
+ information being requested.
+
+ @param BufferSize On input, the size of Buffer. On output,
+ the amount of data returned in Buffer. In
+ both cases, the size is measured in bytes.
+
+ @param Buffer A pointer to the data buffer to return. The
+ buffer's type is indicated by InformationType.
+
+
+ @retval EFI_SUCCESS The information was retrieved.
+
+ @retval EFI_UNSUPPORTED The InformationType is not known.
+
+ @retval EFI_NO_MEDIA The device has no medium.
+
+ @retval EFI_DEVICE_ERROR The device reported an error.
+
+ @retval EFI_VOLUME_CORRUPTED The file system structures are
+ corrupted.
+
+ @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to
+ read the current directory
+ entry. BufferSize has been
+ updated with the size needed to
+ complete the request.
+
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2GetInfo (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN CONST EFI_GUID *InformationType,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ );
+
+/**
+
+ The SetInfo() function sets information of type InformationType
+ on the requested firmware volume.
+
+
+ @param This A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance that is the file handle the information
+ is for.
+
+ @param InformationType The type identifier for the
+ information being set.
+
+ @param BufferSize The size, in bytes, of Buffer.
+
+ @param Buffer A pointer to the data buffer to write. The
+ buffer's type is indicated by InformationType.
+
+ @retval EFI_SUCCESS The information was set.
+
+ @retval EFI_UNSUPPORTED The InformationType is not known.
+
+ @retval EFI_NO_MEDIA The device has no medium.
+
+ @retval EFI_DEVICE_ERROR The device reported an error.
+
+ @retval EFI_VOLUME_CORRUPTED The file system structures are
+ corrupted.
+
+
+ @retval EFI_WRITE_PROTECTED The media is read only.
+
+ @retval EFI_VOLUME_FULL The volume is full.
+
+ @retval EFI_BAD_BUFFER_SIZE BufferSize is smaller than the
+ size of the type indicated by
+ InformationType.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2SetInfo (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN CONST EFI_GUID *InformationType,
+ IN UINTN BufferSize,
+ IN CONST VOID *Buffer
+ );
+
+//
+//
+//
+#define FIRMWARE_VOLUME2_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('f', 'v', '2', 't')
+
+typedef struct {
+ UINTN Signature;
+ EFI_FIRMWARE_VOLUME2_PROTOCOL FirmwareVolume2;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+} FIRMWARE_VOLUME2_PRIVATE_DATA;
+
+#define FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS(a) CR (a, FIRMWARE_VOLUME2_PRIVATE_DATA, FirmwareVolume2, FIRMWARE_VOLUME2_PRIVATE_DATA_SIGNATURE)
+
+//
+// Firmware Volume Protocol template
+//
+EFI_EVENT mFv2Registration;
+
+FIRMWARE_VOLUME2_PRIVATE_DATA gFirmwareVolume2PrivateDataTemplate = {
+ FIRMWARE_VOLUME2_PRIVATE_DATA_SIGNATURE,
+ {
+ Fv2GetVolumeAttributes,
+ Fv2SetVolumeAttributes,
+ Fv2ReadFile,
+ Fv2ReadSection,
+ Fv2WriteFile,
+ Fv2GetNextFile,
+ 0,
+ NULL,
+ Fv2GetInfo,
+ Fv2SetInfo
+ },
+ NULL
+};
+
+//
+// Module globals
+//
+
+VOID
+EFIAPI
+Fv2NotificationEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ UINTN BufferSize;
+ EFI_HANDLE Handle;
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2;
+
+ while (TRUE) {
+ BufferSize = sizeof (Handle);
+ Status = gBS->LocateHandle (
+ ByRegisterNotify,
+ &gEfiFirmwareVolumeProtocolGuid,
+ mFv2Registration,
+ &BufferSize,
+ &Handle
+ );
+ if (EFI_ERROR (Status)) {
+ //
+ // Exit Path of While Loop....
+ //
+ break;
+ }
+
+ //
+ // Skip this handle if the Firmware Volume Protocol is already installed
+ //
+ Status = gBS->HandleProtocol (
+ Handle,
+ &gEfiFirmwareVolume2ProtocolGuid,
+ (VOID **)&FirmwareVolume2
+ );
+ if (!EFI_ERROR (Status)) {
+ continue;
+ }
+
+ //
+ // Allocate private data structure
+ //
+ Private = AllocateCopyPool (sizeof (FIRMWARE_VOLUME2_PRIVATE_DATA), &gFirmwareVolume2PrivateDataTemplate);
+ if (Private == NULL) {
+ continue;
+ }
+
+ //
+ // Retrieve the Firmware Volume2 Protocol
+ //
+ Status = gBS->HandleProtocol (
+ Handle,
+ &gEfiFirmwareVolumeProtocolGuid,
+ (VOID **)&Private->FirmwareVolume
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Fill in rest of private data structure
+ //
+ Private->FirmwareVolume2.KeySize = Private->FirmwareVolume->KeySize;
+ Private->FirmwareVolume2.ParentHandle = Private->FirmwareVolume->ParentHandle;
+
+ //
+ // Install Firmware Volume Protocol onto same handle
+ //
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &Handle,
+ &gEfiFirmwareVolume2ProtocolGuid,
+ &Private->FirmwareVolume2,
+ NULL
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+}
+
+
+/**
+ The user Entry Point for DXE driver. The user code starts with this function
+ as the real entry point for the image goes into a library that calls this
+ function.
+
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.
+ @param[in] SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The entry point is executed successfully.
+ @retval other Some error occurs when executing this entry point.
+
+**/
+EFI_STATUS
+EFIAPI
+InitializeFirmwareVolume (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EfiCreateProtocolNotifyEvent (
+ &gEfiFirmwareVolumeProtocolGuid,
+ TPL_CALLBACK,
+ Fv2NotificationEvent,
+ NULL,
+ &mFv2Registration
+ );
+ return EFI_SUCCESS;
+}
+
+/**
+ Convert FV attributes defined in Framework Specification
+ to FV attributes defined in PI specification.
+
+ @param FvAttributes The FV attributes defined in Framework Specification.
+
+ @retval The FV attributes defined in PI Specification.
+**/
+EFI_FV_ATTRIBUTES
+FvAttributesToFv2Attributes (
+ EFI_FV_ATTRIBUTES FvAttributes
+ )
+{
+ INTN Alignment;
+
+ Alignment = LowBitSet64 (RShiftU64 (FvAttributes, 16) & 0xffff);
+ if (Alignment != -1) {
+ Alignment = Alignment << 16;
+ } else {
+ Alignment = 0;
+ }
+ FvAttributes = (FvAttributes & 0x1ff) | Alignment;
+
+ return FvAttributes;
+}
+
+/**
+
+ Because of constraints imposed by the underlying firmware
+ storage, an instance of the Firmware Volume Protocol may not
+ be to able to support all possible variations of this
+ architecture. These constraints and the current state of the
+ firmware volume are exposed to the caller using the
+ GetVolumeAttributes() function. GetVolumeAttributes() is
+ callable only from TPL_NOTIFY and below. Behavior of
+ GetVolumeAttributes() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param FvAttributes Pointer to an EFI_FV_ATTRIBUTES in which
+ the attributes and current settings are
+ returned.
+
+
+ @retval EFI_SUCCESS The firmware volume attributes were
+ returned.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2GetVolumeAttributes (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ OUT EFI_FV_ATTRIBUTES *FvAttributes
+ )
+{
+ EFI_STATUS Status;
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+
+ Private = FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS (This);
+ FirmwareVolume = Private->FirmwareVolume;
+ Status = FirmwareVolume->GetVolumeAttributes (
+ FirmwareVolume,
+ (FRAMEWORK_EFI_FV_ATTRIBUTES *)FvAttributes
+ );
+ if (!EFI_ERROR (Status)) {
+ *FvAttributes = FvAttributesToFv2Attributes (*FvAttributes);
+ }
+ return Status;
+}
+
+/**
+ The SetVolumeAttributes() function is used to set configurable
+ firmware volume attributes. Only EFI_FV_READ_STATUS,
+ EFI_FV_WRITE_STATUS, and EFI_FV_LOCK_STATUS may be modified, and
+ then only in accordance with the declared capabilities. All
+ other bits of FvAttributes are ignored on input. On successful
+ return, all bits of *FvAttributes are valid and it contains the
+ completed EFI_FV_ATTRIBUTES for the volume. To modify an
+ attribute, the corresponding status bit in the EFI_FV_ATTRIBUTES
+ is set to the desired value on input. The EFI_FV_LOCK_STATUS bit
+ does not affect the ability to read or write the firmware
+ volume. Rather, once the EFI_FV_LOCK_STATUS bit is set, it
+ prevents further modification to all the attribute bits.
+ SetVolumeAttributes() is callable only from TPL_NOTIFY and
+ below. Behavior of SetVolumeAttributes() at any EFI_TPL above
+ TPL_NOTIFY is undefined. Type EFI_TPL is defined in
+ RaiseTPL() in the UEFI 2.0 specification.
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param FvAttributes On input, FvAttributes is a pointer to
+ an EFI_FV_ATTRIBUTES containing the
+ desired firmware volume settings. On
+ successful return, it contains the new
+ settings of the firmware volume. On
+ unsuccessful return, FvAttributes is not
+ modified and the firmware volume
+ settings are not changed.
+
+ @retval EFI_SUCCESS The requested firmware volume attributes
+ were set and the resulting
+ EFI_FV_ATTRIBUTES is returned in
+ FvAttributes.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
+ is set to 1 on input, but the
+ device does not support enabling
+ reads
+ (FvAttributes:EFI_FV_READ_ENABLE
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
+ is cleared to 0 on input, but
+ the device does not support
+ disabling reads
+ (FvAttributes:EFI_FV_READ_DISABL
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
+ is set to 1 on input, but the
+ device does not support enabling
+ writes
+ (FvAttributes:EFI_FV_WRITE_ENABL
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
+ is cleared to 0 on input, but
+ the device does not support
+ disabling writes
+ (FvAttributes:EFI_FV_WRITE_DISAB
+ is clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_LOCK_STATUS
+ is set on input, but the device
+ does not support locking
+ (FvAttributes:EFI_FV_LOCK_CAP is
+ clear on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+ @retval EFI_ACCESS_DENIED Device is locked and does not
+ allow attribute modification
+ (FvAttributes:EFI_FV_LOCK_STATUS
+ is set on return from
+ GetVolumeAttributes()). Actual
+ volume attributes are unchanged.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2SetVolumeAttributes (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN OUT EFI_FV_ATTRIBUTES *FvAttributes
+ )
+{
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+ FRAMEWORK_EFI_FV_ATTRIBUTES FrameworkFvAttributes;
+ EFI_STATUS Status;
+ UINTN Shift;
+
+ if (*FvAttributes & (EFI_FV2_READ_LOCK_STATUS | EFI_FV2_WRITE_LOCK_STATUS)) {
+ //
+ // Framework FV protocol does not support EFI_FV2_READ_LOCK_* | EFI_FV2_WRITE_LOCK_*
+ //
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *FvAttributes = *FvAttributes & (EFI_FV2_READ_STATUS | EFI_FV2_WRITE_STATUS | EFI_FV2_LOCK_STATUS);
+
+ Private = FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS (This);
+ FirmwareVolume = Private->FirmwareVolume;
+
+ FrameworkFvAttributes = (*FvAttributes & 0x1ff);
+ Shift = (UINTN) RShiftU64(*FvAttributes & EFI_FV2_ALIGNMENT, 16);
+ FrameworkFvAttributes = FrameworkFvAttributes | LShiftU64 (EFI_FV_ALIGNMENT_2, Shift);
+
+ Status = FirmwareVolume->SetVolumeAttributes (
+ FirmwareVolume,
+ &FrameworkFvAttributes
+ );
+
+ if (!EFI_ERROR (Status)) {
+ *FvAttributes = FvAttributesToFv2Attributes (FrameworkFvAttributes);
+ }
+
+ return Status;
+}
+
+/**
+ ReadFile() is used to retrieve any file from a firmware volume
+ during the DXE phase. The actual binary encoding of the file in
+ the firmware volume media may be in any arbitrary format as long
+ as it does the following: ?It is accessed using the Firmware
+ Volume Protocol. ?The image that is returned follows the image
+ format defined in Code Definitions: PI Firmware File Format.
+ If the input value of Buffer==NULL, it indicates the caller is
+ requesting only that the type, attributes, and size of the
+ file be returned and that there is no output buffer. In this
+ case, the following occurs:
+ - BufferSize is returned with the size that is required to
+ successfully complete the read.
+ - The output parameters FoundType and *FileAttributes are
+ returned with valid values.
+ - The returned value of *AuthenticationStatus is undefined.
+
+ If the input value of Buffer!=NULL, the output buffer is
+ specified by a double indirection of the Buffer parameter. The
+ input value of *Buffer is used to determine if the output
+ buffer is caller allocated or is dynamically allocated by
+ ReadFile(). If the input value of *Buffer!=NULL, it indicates
+ the output buffer is caller allocated. In this case, the input
+ value of *BufferSize indicates the size of the
+ caller-allocated output buffer. If the output buffer is not
+ large enough to contain the entire requested output, it is
+ filled up to the point that the output buffer is exhausted and
+ EFI_WARN_BUFFER_TOO_SMALL is returned, and then BufferSize is
+ returned with the size required to successfully complete the
+ read. All other output parameters are returned with valid
+ values. If the input value of *Buffer==NULL, it indicates the
+ output buffer is to be allocated by ReadFile(). In this case,
+ ReadFile() will allocate an appropriately sized buffer from
+ boot services pool memory, which will be returned in Buffer.
+ The size of the new buffer is returned in BufferSize and all
+ other output parameters are returned with valid values.
+ ReadFile() is callable only from TPL_NOTIFY and below.
+ Behavior of ReadFile() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param NameGuid Pointer to an EFI_GUID, which is the file
+ name. All firmware file names are EFI_GUIDs.
+ A single firmware volume must not have two
+ valid files with the same file name
+ EFI_GUID.
+
+ @param Buffer Pointer to a pointer to a buffer in which the
+ file contents are returned, not including the
+ file header.
+ @param BufferSize Pointer to a caller-allocated UINTN. It
+ indicates the size of the memory
+ represented by Buffer.
+
+ @param FoundType Pointer to a caller-allocated
+ EFI_FV_FILETYPE.
+
+ @param FileAttributes Pointer to a caller-allocated
+ EFI_FV_FILE_ATTRIBUTES.
+
+ @param AuthenticationStatus Pointer to a caller-allocated
+ UINT32 in which the
+ authentication status is
+ returned.
+
+ @retval EFI_SUCCESS The call completed successfully.
+
+ @retval EFI_WARN_BUFFER_TOO_SMALL The buffer is too small to
+ contain the requested
+ output. The buffer is
+ filled and the output is
+ truncated.
+
+ @retval EFI_OUT_OF_RESOURCES An allocation failure occurred.
+
+ @retavl EFI_NOT_FOUND Name was not found in the firmware
+ volume.
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware
+ volume.
+
+ @retval EFI_ACCESS_DENIED The firmware volume is configured to
+ isallow reads.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2ReadFile (
+ 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
+ )
+{
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+
+ Private = FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS (This);
+ FirmwareVolume = Private->FirmwareVolume;
+
+ return FirmwareVolume->ReadFile (
+ FirmwareVolume,
+ (EFI_GUID *)NameGuid,
+ Buffer,
+ BufferSize,
+ FoundType,
+ FileAttributes,
+ AuthenticationStatus
+ );
+}
+
+/**
+ ReadSection() is used to retrieve a specific section from a file
+ within a firmware volume. The section returned is determined
+ using a depth-first, left-to-right search algorithm through all
+ sections found in the specified file. See
+ ????Firmware File Sections???? on page 9 for more details about
+ sections. The output buffer is specified by a double indirection
+ of the Buffer parameter. The input value of Buffer is used to
+ determine if the output buffer is caller allocated or is
+ dynamically allocated by ReadSection(). If the input value of
+ Buffer!=NULL, it indicates that the output buffer is caller
+ allocated. In this case, the input value of *BufferSize
+ indicates the size of the caller-allocated output buffer. If
+ the output buffer is not large enough to contain the entire
+ requested output, it is filled up to the point that the output
+ buffer is exhausted and EFI_WARN_BUFFER_TOO_SMALL is returned,
+ and then BufferSize is returned with the size that is required
+ to successfully complete the read. All other
+ output parameters are returned with valid values. If the input
+ value of *Buffer==NULL, it indicates the output buffer is to
+ be allocated by ReadSection(). In this case, ReadSection()
+ will allocate an appropriately sized buffer from boot services
+ pool memory, which will be returned in *Buffer. The size of
+ the new buffer is returned in *BufferSize and all other output
+ parameters are returned with valid values. ReadSection() is
+ callable only from TPL_NOTIFY and below. Behavior of
+ ReadSection() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance.
+
+ @param NameGuid Pointer to an EFI_GUID, which indicates the
+ file name from which the requested section
+ will be read.
+
+ @param SectionType Indicates the section type to return.
+ SectionType in conjunction with
+ SectionInstance indicates which section to
+ return.
+
+ @param SectionInstance Indicates which instance of sections
+ with a type of SectionType to return.
+ SectionType in conjunction with
+ SectionInstance indicates which
+ section to return. SectionInstance is
+ zero based.
+
+ @param Buffer Pointer to a pointer to a buffer in which the
+ section contents are returned, not including
+ the section header.
+
+ @param BufferSize Pointer to a caller-allocated UINTN. It
+ indicates the size of the memory
+ represented by Buffer.
+
+ @param AuthenticationStatus Pointer to a caller-allocated
+ UINT32 in which the authentication
+ status is returned.
+
+
+ @retval EFI_SUCCESS The call completed successfully.
+
+ @retval EFI_WARN_BUFFER_TOO_SMALL The caller-allocated
+ buffer is too small to
+ contain the requested
+ output. The buffer is
+ filled and the output is
+ truncated.
+
+ @retval EFI_OUT_OF_RESOURCES An allocation failure occurred.
+
+ @retval EFI_NOT_FOUND The requested file was not found in
+ the firmware volume. EFI_NOT_FOUND The
+ requested section was not found in the
+ specified file.
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware
+ volume.
+
+ @retval EFI_ACCESS_DENIED The firmware volume is configured to
+ disallow reads. EFI_PROTOCOL_ERROR
+ The requested section was not found,
+ but the file could not be fully
+ parsed because a required
+ GUIDED_SECTION_EXTRACTION_PROTOCOL
+ was not found. It is possible the
+ requested section exists within the
+ file and could be successfully
+ extracted once the required
+ GUIDED_SECTION_EXTRACTION_PROTOCOL
+ is published.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2ReadSection (
+ 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
+ )
+{
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+
+ Private = FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS (This);
+ FirmwareVolume = Private->FirmwareVolume;
+
+ return FirmwareVolume->ReadSection (
+ FirmwareVolume,
+ (EFI_GUID *)NameGuid,
+ SectionType,
+ SectionInstance,
+ Buffer,
+ BufferSize,
+ AuthenticationStatus
+ );
+}
+
+/**
+ WriteFile() is used to write one or more files to a firmware
+ volume. Each file to be written is described by an
+ EFI_FV_WRITE_FILE_DATA structure. The caller must ensure that
+ any required alignment for all files listed in the FileData
+ array is compatible with the firmware volume. Firmware volume
+ capabilities can be determined using the GetVolumeAttributes()
+ call. Similarly, if the WritePolicy is set to
+ EFI_FV_RELIABLE_WRITE, the caller must check the firmware volume
+ capabilities to ensure EFI_FV_RELIABLE_WRITE is supported by the
+ firmware volume. EFI_FV_UNRELIABLE_WRITE must always be
+ supported. Writing a file with a size of zero
+ (FileData[n].BufferSize == 0) deletes the file from the firmware
+ volume if it exists. Deleting a file must be done one at a time.
+ Deleting a file as part of a multiple file write is not allowed.
+ Platform Initialization Specification VOLUME 3 Shared
+ Architectural Elements 84 August 21, 2006 Version 1.0
+ WriteFile() is callable only from TPL_NOTIFY and below.
+ Behavior of WriteFile() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI 2.0
+ specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance. NumberOfFiles Indicates the number of
+ elements in the array pointed to by FileData.
+
+
+ @param 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 Pointer to an array of
+ EFI_FV_WRITE_FILE_DATA. Each element of
+ FileData[] represents a file to be written.
+
+
+ @retval EFI_SUCCESS The write completed successfully.
+
+ @retval EFI_OUT_OF_RESOURCES The firmware volume does not
+ have enough free space to
+ storefile(s).
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware volume.
+
+ @retval EFI_WRITE_PROTECTED The firmware volume is
+ configured to disallow writes.
+
+ @retval EFI_NOT_FOUND A delete was requested, but the
+ requested file was not found in the
+ firmware volume.
+
+ @retval EFI_INVALID_PARAMETER A delete was requested with a
+ multiple file write.
+
+ @retval EFI_INVALID_PARAMETER An unsupported WritePolicy was
+ requested.
+
+ @retval EFI_INVALID_PARAMETER An unknown file type was
+ specified.
+
+ @retval EFI_INVALID_PARAMETER A file system specific error
+ has occurred.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2WriteFile (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN UINT32 NumberOfFiles,
+ IN EFI_FV_WRITE_POLICY WritePolicy,
+ IN EFI_FV_WRITE_FILE_DATA *FileData
+ )
+{
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+
+ Private = FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS (This);
+ FirmwareVolume = Private->FirmwareVolume;
+
+ return FirmwareVolume->WriteFile (
+ FirmwareVolume,
+ NumberOfFiles,
+ WritePolicy,
+ (FRAMEWORK_EFI_FV_WRITE_FILE_DATA *)FileData
+ );
+}
+
+/**
+ GetNextFile() is the interface that is used to search a firmware
+ volume for a particular file. It is called successively until
+ the desired file is located or the function returns
+ EFI_NOT_FOUND. To filter uninteresting files from the output,
+ the type of file to search for may be specified in FileType. For
+ example, if *FileType is EFI_FV_FILETYPE_DRIVER, only files of
+ this type will be returned in the output. If *FileType is
+ EFI_FV_FILETYPE_ALL, no filtering of file types is done. The Key
+ parameter is used to indicate a starting point of the search. If
+ the buffer *Key is completely initialized to zero, the search
+ re-initialized and starts at the beginning. Subsequent calls to
+ GetNextFile() must maintain the value of *Key returned by the
+ immediately previous call. The actual contents of *Key are
+ implementation specific and no semantic content is implied.
+ GetNextFile() is callable only from TPL_NOTIFY and below.
+ Behavior of GetNextFile() at any EFI_TPL above TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI 2.0
+ specification. Status Codes Returned
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance. Key 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 re-initialize 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 Pointer to a caller-allocated
+ EFI_FV_FILETYPE. The GetNextFile() API can
+ filter its search for files based on the
+ value of the FileType input. A *FileType
+ input of EFI_FV_FILETYPE_ALL 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 Pointer to a caller-allocated EFI_GUID. If a
+ matching file is found, the file's name is
+ returned in NameGuid. If no matching file is
+ found, *NameGuid is not modified.
+
+ @param Attributes Pointer to a caller-allocated
+ EFI_FV_FILE_ATTRIBUTES. If a matching file
+ is found, the file's attributes are returned
+ in Attributes. If no matching file is found,
+ Attributes is not modified. Type
+ EFI_FV_FILE_ATTRIBUTES is defined in
+ ReadFile().
+
+ @param Size Pointer to a caller-allocated UINTN. If a
+ matching file is found, the file's size is
+ returned in *Size. If no matching file is found,
+ Size is not modified.
+
+ @retval EFI_SUCCESS The output parameters are filled with data
+ obtained from the first matching file that
+ was found.
+
+ @retval FI_NOT_FOUND No files of type FileType were found.
+
+
+ @retval EFI_DEVICE_ERROR A hardware error occurred when
+ attempting to access the firmware
+ volume.
+
+ @retval EFI_ACCESS_DENIED The firmware volume is configured to
+ disallow reads.
+
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2GetNextFile (
+ 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
+ )
+{
+ FIRMWARE_VOLUME2_PRIVATE_DATA *Private;
+ EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolume;
+
+ Private = FIRMWARE_VOLUME2_PRIVATE_DATA_FROM_THIS (This);
+ FirmwareVolume = Private->FirmwareVolume;
+
+ return FirmwareVolume->GetNextFile (
+ FirmwareVolume,
+ Key,
+ FileType,
+ NameGuid,
+ Attributes,
+ Size
+ );
+}
+
+/**
+ The GetInfo() function returns information of type
+ InformationType for the requested firmware volume. If the volume
+ does not support the requested information type, then
+ EFI_UNSUPPORTED is returned. If the buffer is not large enough
+ to hold the requested structure, EFI_BUFFER_TOO_SMALL is
+ returned and the BufferSize is set to the size of buffer that is
+ required to make the request. The information types defined by
+ this specification are required information types that all file
+ systems must support.
+
+ @param This A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance that is the file handle the requested
+ information is for.
+
+ @param InformationType The type identifier for the
+ information being requested.
+
+ @param BufferSize On input, the size of Buffer. On output,
+ the amount of data returned in Buffer. In
+ both cases, the size is measured in bytes.
+
+ @param Buffer A pointer to the data buffer to return. The
+ buffer's type is indicated by InformationType.
+
+
+ @retval EFI_SUCCESS The information was retrieved.
+
+ @retval EFI_UNSUPPORTED The InformationType is not known.
+
+ @retval EFI_NO_MEDIA The device has no medium.
+
+ @retval EFI_DEVICE_ERROR The device reported an error.
+
+ @retval EFI_VOLUME_CORRUPTED The file system structures are
+ corrupted.
+
+ @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to
+ read the current directory
+ entry. BufferSize has been
+ updated with the size needed to
+ complete the request.
+
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2GetInfo (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN CONST EFI_GUID *InformationType,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+/**
+
+ The SetInfo() function sets information of type InformationType
+ on the requested firmware volume.
+
+
+ @param This A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance that is the file handle the information
+ is for.
+
+ @param InformationType The type identifier for the
+ information being set.
+
+ @param BufferSize The size, in bytes, of Buffer.
+
+ @param Buffer A pointer to the data buffer to write. The
+ buffer's type is indicated by InformationType.
+
+ @retval EFI_SUCCESS The information was set.
+
+ @retval EFI_UNSUPPORTED The InformationType is not known.
+
+ @retval EFI_NO_MEDIA The device has no medium.
+
+ @retval EFI_DEVICE_ERROR The device reported an error.
+
+ @retval EFI_VOLUME_CORRUPTED The file system structures are
+ corrupted.
+
+
+ @retval EFI_WRITE_PROTECTED The media is read only.
+
+ @retval EFI_VOLUME_FULL The volume is full.
+
+ @retval EFI_BAD_BUFFER_SIZE BufferSize is smaller than the
+ size of the type indicated by
+ InformationType.
+
+**/
+EFI_STATUS
+EFIAPI
+Fv2SetInfo (
+ IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
+ IN CONST EFI_GUID *InformationType,
+ IN UINTN BufferSize,
+ IN CONST VOID *Buffer
+ )
+{
+ return EFI_UNSUPPORTED;
+}
diff --git a/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.inf b/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.inf
new file mode 100644
index 0000000000..c023df78e5
--- /dev/null
+++ b/EdkCompatibilityPkg/Compatibility/Fv2OnFvThunk/Fv2ToFvThunk.inf
@@ -0,0 +1,60 @@
+#/** @file
+# Module produce FV2 on top of FV.
+#
+# UEFI PI specification supersedes Inte's Framework Specification.
+# EFI_FIRMWARE_VOLUME_PROTOCOL defined in Intel Framework Pkg is replaced by
+# EFI_FIRMWARE_VOLUME2_PROTOCOL in MdePkg.
+# This module produces FV2 on top of FV. This module is used on platform when both of
+# these two conditions are true:
+# 1) Framework module producing FV is present
+# 2) And the rest of modules on the platform consume FV2
+#
+# Copyright (c) 2006 - 2007, 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.
+#
+#
+#**/
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = Fv2ToFvThunk
+ FILE_GUID = D8A6F4A6-0E97-4a8b-A475-39F1B28B5AEC
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ EDK_RELEASE_VERSION = 0x00020000
+ EFI_SPECIFICATION_VERSION = 0x00020000
+ ENTRY_POINT = InitializeFirmwareVolume
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+ Fv2ToFvThunk.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ IntelFrameworkPkg/IntelFrameworkPkg.dec
+
+[LibraryClasses]
+ UefiDriverEntryPoint
+ UefiBootServicesTableLib
+ BaseLib
+ DebugLib
+ UefiLib
+ MemoryAllocationLib
+
+[Protocols]
+ gEfiFirmwareVolume2ProtocolGuid
+ gEfiFirmwareVolumeProtocolGuid
+
+[Depex]
+ TRUE