mirror of https://github.com/acidanthera/audk.git
1544 lines
62 KiB
C
1544 lines
62 KiB
C
/** @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 - 2010, 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.
|
|
|
|
@retval 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. 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.
|
|
|
|
@param 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.
|
|
|
|
@param 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
|
|
//
|
|
/**
|
|
This notification function is invoked when an instance of the
|
|
EFI_FIRMWARE_VOLUME_PROTOCOL is produced. It installs another instance of the
|
|
EFI_FIRMWARE_VOLUME2_PROTOCOL on the same handle.
|
|
|
|
@param Event The event that occured
|
|
@param Context Context of event. Not used in this nofication function.
|
|
|
|
**/
|
|
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)) != 0) {
|
|
//
|
|
// 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.
|
|
|
|
@retval 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.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.
|
|
|
|
@param 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.
|
|
|
|
@param 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;
|
|
}
|