Check in DxeCore for Nt32 platform. Currently, it does not follow PI/UEFI2.1.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3045 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
466
MdeModulePkg/Core/Dxe/FwVolDriver.h
Normal file
466
MdeModulePkg/Core/Dxe/FwVolDriver.h
Normal file
@ -0,0 +1,466 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006, 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.
|
||||
|
||||
Module Name:
|
||||
|
||||
FwVolDriver.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Firmware File System protocol. Layers on top of Firmware
|
||||
Block protocol to produce a file abstraction of FV based files.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef __FWVOL_H
|
||||
#define __FWVOL_H
|
||||
|
||||
|
||||
//
|
||||
// Used to track all non-deleted files
|
||||
//
|
||||
typedef struct {
|
||||
LIST_ENTRY Link;
|
||||
EFI_FFS_FILE_HEADER *FfsHeader;
|
||||
UINTN StreamHandle;
|
||||
EFI_SECTION_EXTRACTION_PROTOCOL *Sep;
|
||||
} FFS_FILE_LIST_ENTRY;
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_FIRMWARE_VOLUME_PROTOCOL Fv;
|
||||
|
||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||
UINT8 *CachedFv;
|
||||
UINT8 *EndOfCachedFv;
|
||||
|
||||
FFS_FILE_LIST_ENTRY *LastKey;
|
||||
|
||||
LIST_ENTRY FfsFileListHeader;
|
||||
|
||||
UINT8 ErasePolarity;
|
||||
} FV_DEVICE;
|
||||
|
||||
#define FV_DEVICE_FROM_THIS(a) CR(a, FV_DEVICE, Fv, FV_DEVICE_SIGNATURE)
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FvGetVolumeAttributes (
|
||||
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
|
||||
OUT EFI_FV_ATTRIBUTES *Attributes
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Retrieves attributes, insures positive polarity of attribute bits, returns
|
||||
resulting attributes in output parameter
|
||||
|
||||
Arguments:
|
||||
This - Calling context
|
||||
Attributes - output buffer which contains attributes
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - Successfully got volume attributes
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FvSetVolumeAttributes (
|
||||
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
|
||||
IN OUT EFI_FV_ATTRIBUTES *Attributes
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Sets current attributes for volume
|
||||
|
||||
Arguments:
|
||||
This - Calling context
|
||||
Attributes - At input, contains attributes to be set. At output contains
|
||||
new value of FV
|
||||
|
||||
Returns:
|
||||
EFI_UNSUPPORTED - Could not be set.
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FvGetNextFile (
|
||||
IN EFI_FIRMWARE_VOLUME_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
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Given the input key, search for the next matching file in the volume.
|
||||
|
||||
Arguments:
|
||||
This - Indicates the calling context.
|
||||
FileType - FileType is a pointer to a caller allocated
|
||||
EFI_FV_FILETYPE. The GetNextFile() API can filter it's
|
||||
search for files based on the value of *FileType input.
|
||||
A *FileType input of 0 causes GetNextFile() to search for
|
||||
files of all types. If a file is found, the file's type
|
||||
is returned in *FileType. *FileType is not modified if
|
||||
no file is found.
|
||||
Key - Key is a pointer to a caller allocated buffer that
|
||||
contains implementation specific data that is used to
|
||||
track where to begin the search for the next file.
|
||||
The size of the buffer must be at least This->KeySize
|
||||
bytes long. To reinitialize the search and begin from
|
||||
the beginning of the firmware volume, the entire buffer
|
||||
must be cleared to zero. Other than clearing the buffer
|
||||
to initiate a new search, the caller must not modify the
|
||||
data in the buffer between calls to GetNextFile().
|
||||
NameGuid - NameGuid is a pointer to a caller allocated EFI_GUID.
|
||||
If a file is found, the file's name is returned in
|
||||
*NameGuid. *NameGuid is not modified if no file is
|
||||
found.
|
||||
Attributes - Attributes is a pointer to a caller allocated
|
||||
EFI_FV_FILE_ATTRIBUTES. If a file is found, the file's
|
||||
attributes are returned in *Attributes. *Attributes is
|
||||
not modified if no file is found.
|
||||
Size - Size is a pointer to a caller allocated UINTN.
|
||||
If a file is found, the file's size is returned in *Size.
|
||||
*Size is not modified if no file is found.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - Successfully find the file.
|
||||
EFI_DEVICE_ERROR - Device error.
|
||||
EFI_ACCESS_DENIED - Fv could not read.
|
||||
EFI_NOT_FOUND - No matching file found.
|
||||
EFI_INVALID_PARAMETER - Invalid parameter
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FvReadFile (
|
||||
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
|
||||
IN 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
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Locates a file in the firmware volume and
|
||||
copies it to the supplied buffer.
|
||||
|
||||
Arguments:
|
||||
This - Indicates the calling context.
|
||||
NameGuid - Pointer to an EFI_GUID, which is the filename.
|
||||
Buffer - Buffer is a pointer to pointer to a buffer in
|
||||
which the file or section contents or are returned.
|
||||
BufferSize - BufferSize is a pointer to caller allocated
|
||||
UINTN. On input *BufferSize indicates the size
|
||||
in bytes of the memory region pointed to by
|
||||
Buffer. On output, *BufferSize contains the number
|
||||
of bytes required to read the file.
|
||||
FoundType - FoundType is a pointer to a caller allocated
|
||||
EFI_FV_FILETYPE that on successful return from Read()
|
||||
contains the type of file read. This output reflects
|
||||
the file type irrespective of the value of the
|
||||
SectionType input.
|
||||
FileAttributes - FileAttributes is a pointer to a caller allocated
|
||||
EFI_FV_FILE_ATTRIBUTES. On successful return from
|
||||
Read(), *FileAttributes contains the attributes of
|
||||
the file read.
|
||||
AuthenticationStatus - AuthenticationStatus is a pointer to a caller
|
||||
allocated UINTN in which the authentication status
|
||||
is returned.
|
||||
Returns:
|
||||
EFI_SUCCESS - Successfully read to memory buffer.
|
||||
EFI_WARN_BUFFER_TOO_SMALL - Buffer too small.
|
||||
EFI_NOT_FOUND - Not found.
|
||||
EFI_DEVICE_ERROR - Device error.
|
||||
EFI_ACCESS_DENIED - Could not read.
|
||||
EFI_INVALID_PARAMETER - Invalid parameter.
|
||||
EFI_OUT_OF_RESOURCES - Not enough buffer to be allocated.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FvReadFileSection (
|
||||
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
|
||||
IN EFI_GUID *NameGuid,
|
||||
IN EFI_SECTION_TYPE SectionType,
|
||||
IN UINTN SectionInstance,
|
||||
IN OUT VOID **Buffer,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT UINT32 *AuthenticationStatus
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Locates a section in a given FFS File and
|
||||
copies it to the supplied buffer (not including section header).
|
||||
|
||||
Arguments:
|
||||
This - Indicates the calling context.
|
||||
NameGuid - Pointer to an EFI_GUID, which is the filename.
|
||||
SectionType - Indicates the section type to return.
|
||||
SectionInstance - Indicates which instance of sections with a type of
|
||||
SectionType to return.
|
||||
Buffer - Buffer is a pointer to pointer to a buffer in which
|
||||
the file or section contents or are returned.
|
||||
BufferSize - BufferSize is a pointer to caller allocated UINTN.
|
||||
AuthenticationStatus -AuthenticationStatus is a pointer to a caller
|
||||
allocated UINT32 in which the authentication status
|
||||
is returned.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - Successfully read the file section into buffer.
|
||||
EFI_WARN_BUFFER_TOO_SMALL - Buffer too small.
|
||||
EFI_NOT_FOUND - Section not found.
|
||||
EFI_DEVICE_ERROR - Device error.
|
||||
EFI_ACCESS_DENIED - Could not read.
|
||||
EFI_INVALID_PARAMETER - Invalid parameter.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FvWriteFile (
|
||||
IN EFI_FIRMWARE_VOLUME_PROTOCOL *This,
|
||||
IN UINT32 NumberOfFiles,
|
||||
IN EFI_FV_WRITE_POLICY WritePolicy,
|
||||
IN EFI_FV_WRITE_FILE_DATA *FileData
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Writes one or more files to the firmware volume.
|
||||
|
||||
Arguments:
|
||||
This - Indicates the calling context.
|
||||
WritePolicy - WritePolicy indicates the level of reliability for
|
||||
the write in the event of a power failure or other
|
||||
system failure during the write operation.
|
||||
FileData - FileData is an pointer to an array of EFI_FV_WRITE_DATA.
|
||||
Each element of FileData[] represents a file to be written.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - Files successfully written to firmware volume
|
||||
EFI_OUT_OF_RESOURCES - Not enough buffer to be allocated.
|
||||
EFI_DEVICE_ERROR - Device error.
|
||||
EFI_WRITE_PROTECTED - Write protected.
|
||||
EFI_NOT_FOUND - Not found.
|
||||
EFI_INVALID_PARAMETER - Invalid parameter.
|
||||
EFI_UNSUPPORTED - This function not supported.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
|
||||
|
||||
//
|
||||
//Internal functions
|
||||
//
|
||||
typedef enum {
|
||||
EfiCheckSumUint8 = 0,
|
||||
EfiCheckSumUint16 = 1,
|
||||
EfiCheckSumUint32 = 2,
|
||||
EfiCheckSumUint64 = 3,
|
||||
EfiCheckSumMaximum = 4
|
||||
} EFI_CHECKSUM_TYPE;
|
||||
|
||||
|
||||
BOOLEAN
|
||||
IsBufferErased (
|
||||
IN UINT8 ErasePolarity,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Check if a block of buffer is erased
|
||||
|
||||
Arguments:
|
||||
ErasePolarity - Erase polarity attribute of the firmware volume
|
||||
Buffer - The buffer to be checked
|
||||
BufferSize - Size of the buffer in bytes
|
||||
|
||||
Returns:
|
||||
TRUE - The block of buffer is erased
|
||||
FALSE - The block of buffer is not erased
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_FFS_FILE_STATE
|
||||
GetFileState (
|
||||
IN UINT8 ErasePolarity,
|
||||
IN EFI_FFS_FILE_HEADER *FfsHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Get the FFS file state by checking the highest bit set in the header's state field
|
||||
|
||||
Arguments:
|
||||
ErasePolarity - Erase polarity attribute of the firmware volume
|
||||
FfsHeader - Points to the FFS file header
|
||||
|
||||
Returns:
|
||||
FFS File state
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
VOID
|
||||
SetFileState (
|
||||
IN UINT8 State,
|
||||
IN EFI_FFS_FILE_HEADER *FfsHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Set the FFS file state.
|
||||
|
||||
Arguments:
|
||||
State - The state to be set.
|
||||
FfsHeader - Points to the FFS file header
|
||||
|
||||
Returns:
|
||||
None.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
BOOLEAN
|
||||
VerifyFvHeaderChecksum (
|
||||
IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Verify checksum of the firmware volume header
|
||||
|
||||
Arguments:
|
||||
FvHeader - Points to the firmware volume header to be checked
|
||||
|
||||
Returns:
|
||||
TRUE - Checksum verification passed
|
||||
FALSE - Checksum verification failed
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
BOOLEAN
|
||||
IsValidFfsHeader (
|
||||
IN UINT8 ErasePolarity,
|
||||
IN EFI_FFS_FILE_HEADER *FfsHeader,
|
||||
OUT EFI_FFS_FILE_STATE *FileState
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Check if it's a valid FFS file header
|
||||
|
||||
Arguments:
|
||||
ErasePolarity - Erase polarity attribute of the firmware volume
|
||||
FfsHeader - Points to the FFS file header to be checked
|
||||
FileState - FFS file state to be returned
|
||||
|
||||
Returns:
|
||||
TRUE - Valid FFS file header
|
||||
FALSE - Invalid FFS file header
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
BOOLEAN
|
||||
IsValidFfsFile (
|
||||
IN UINT8 ErasePolarity,
|
||||
IN EFI_FFS_FILE_HEADER *FfsHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Check if it's a valid FFS file.
|
||||
Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.
|
||||
|
||||
Arguments:
|
||||
ErasePolarity - Erase polarity attribute of the firmware volume
|
||||
FfsHeader - Points to the FFS file to be checked
|
||||
|
||||
Returns:
|
||||
TRUE - Valid FFS file
|
||||
FALSE - Invalid FFS file
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
GetFwVolHeader (
|
||||
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb,
|
||||
OUT EFI_FIRMWARE_VOLUME_HEADER **FwVolHeader
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
given the supplied FW_VOL_BLOCK_PROTOCOL, allocate a buffer for output and
|
||||
copy the volume header into it.
|
||||
|
||||
Arguments:
|
||||
Fvb - The FW_VOL_BLOCK_PROTOCOL instance from which to read the volume
|
||||
header
|
||||
FwVolHeader - Pointer to pointer to allocated buffer in which the volume
|
||||
header is returned.
|
||||
|
||||
Returns:
|
||||
Status code.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
FvCheck (
|
||||
IN OUT FV_DEVICE *FvDevice
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Check if a FV is consistent and allocate cache
|
||||
|
||||
Arguments:
|
||||
FvDevice - pointer to the FvDevice to be checked.
|
||||
|
||||
Returns:
|
||||
EFI_OUT_OF_RESOURCES - Not enough buffer to be allocated.
|
||||
EFI_SUCCESS - FV is consistent and cache is allocated.
|
||||
EFI_VOLUME_CORRUPTED - File system is corrupted.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user