2 FFS file access utilities.
4 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "FwVolDriver.h"
13 Get the FFS file state by checking the highest bit set in the header's state field.
15 @param ErasePolarity Erase polarity attribute of the firmware volume
16 @param FfsHeader Points to the FFS file header
18 @return FFS File state
23 IN UINT8 ErasePolarity
,
24 IN EFI_FFS_FILE_HEADER
*FfsHeader
27 EFI_FFS_FILE_STATE FileState
;
30 FileState
= FfsHeader
->State
;
32 if (ErasePolarity
!= 0) {
33 FileState
= (EFI_FFS_FILE_STATE
) ~FileState
;
37 while (HighestBit
!= 0 && ((HighestBit
& FileState
) == 0)) {
41 return (EFI_FFS_FILE_STATE
)HighestBit
;
45 Check if a block of buffer is erased.
47 @param ErasePolarity Erase polarity attribute of the firmware volume
48 @param InBuffer The buffer to be checked
49 @param BufferSize Size of the buffer in bytes
51 @retval TRUE The block of buffer is erased
52 @retval FALSE The block of buffer is not erased
57 IN UINT8 ErasePolarity
,
66 if (ErasePolarity
== 1) {
73 for (Count
= 0; Count
< BufferSize
; Count
++) {
74 if (Buffer
[Count
] != EraseByte
) {
83 Verify checksum of the firmware volume header.
85 @param FvHeader Points to the firmware volume header to be checked
87 @retval TRUE Checksum verification passed
88 @retval FALSE Checksum verification failed
92 VerifyFvHeaderChecksum (
93 IN EFI_FIRMWARE_VOLUME_HEADER
*FvHeader
98 Checksum
= CalculateSum16 ((UINT16
*)FvHeader
, FvHeader
->HeaderLength
);
108 Verify checksum of the FFS file header.
110 @param FfsHeader Points to the FFS file header to be checked
112 @retval TRUE Checksum verification passed
113 @retval FALSE Checksum verification failed
117 VerifyHeaderChecksum (
118 IN EFI_FFS_FILE_HEADER
*FfsHeader
121 UINT8 HeaderChecksum
;
123 if (IS_FFS_FILE2 (FfsHeader
)) {
124 HeaderChecksum
= CalculateSum8 ((UINT8
*)FfsHeader
, sizeof (EFI_FFS_FILE_HEADER2
));
126 HeaderChecksum
= CalculateSum8 ((UINT8
*)FfsHeader
, sizeof (EFI_FFS_FILE_HEADER
));
129 HeaderChecksum
= (UINT8
)(HeaderChecksum
- FfsHeader
->State
- FfsHeader
->IntegrityCheck
.Checksum
.File
);
131 if (HeaderChecksum
== 0) {
139 Check if it's a valid FFS file header.
141 @param ErasePolarity Erase polarity attribute of the firmware volume
142 @param FfsHeader Points to the FFS file header to be checked
143 @param FileState FFS file state to be returned
145 @retval TRUE Valid FFS file header
146 @retval FALSE Invalid FFS file header
151 IN UINT8 ErasePolarity
,
152 IN EFI_FFS_FILE_HEADER
*FfsHeader
,
153 OUT EFI_FFS_FILE_STATE
*FileState
156 *FileState
= GetFileState (ErasePolarity
, FfsHeader
);
158 switch (*FileState
) {
159 case EFI_FILE_HEADER_VALID
:
160 case EFI_FILE_DATA_VALID
:
161 case EFI_FILE_MARKED_FOR_UPDATE
:
162 case EFI_FILE_DELETED
:
164 // Here we need to verify header checksum
166 return VerifyHeaderChecksum (FfsHeader
);
168 case EFI_FILE_HEADER_CONSTRUCTION
:
169 case EFI_FILE_HEADER_INVALID
:
176 Check if it's a valid FFS file.
177 Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.
179 @param ErasePolarity Erase polarity attribute of the firmware volume
180 @param FfsHeader Points to the FFS file to be checked
182 @retval TRUE Valid FFS file
183 @retval FALSE Invalid FFS file
188 IN UINT8 ErasePolarity
,
189 IN EFI_FFS_FILE_HEADER
*FfsHeader
192 EFI_FFS_FILE_STATE FileState
;
195 FileState
= GetFileState (ErasePolarity
, FfsHeader
);
197 case EFI_FILE_DELETED
:
198 case EFI_FILE_DATA_VALID
:
199 case EFI_FILE_MARKED_FOR_UPDATE
:
200 DataCheckSum
= FFS_FIXED_CHECKSUM
;
201 if ((FfsHeader
->Attributes
& FFS_ATTRIB_CHECKSUM
) == FFS_ATTRIB_CHECKSUM
) {
202 if (IS_FFS_FILE2 (FfsHeader
)) {
203 DataCheckSum
= CalculateCheckSum8 ((CONST UINT8
*)FfsHeader
+ sizeof (EFI_FFS_FILE_HEADER2
), FFS_FILE2_SIZE (FfsHeader
) - sizeof (EFI_FFS_FILE_HEADER2
));
205 DataCheckSum
= CalculateCheckSum8 ((CONST UINT8
*)FfsHeader
+ sizeof (EFI_FFS_FILE_HEADER
), FFS_FILE_SIZE (FfsHeader
) - sizeof (EFI_FFS_FILE_HEADER
));
209 if (FfsHeader
->IntegrityCheck
.Checksum
.File
== DataCheckSum
) {