2 FFS file access utilities.
4 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include "FwVolDriver.h"
15 Get the FFS file state by checking the highest bit set in the header's state field.
17 @param ErasePolarity Erase polarity attribute of the firmware volume
18 @param FfsHeader Points to the FFS file header
20 @return FFS File state
25 IN UINT8 ErasePolarity
,
26 IN EFI_FFS_FILE_HEADER
*FfsHeader
29 EFI_FFS_FILE_STATE FileState
;
32 FileState
= FfsHeader
->State
;
34 if (ErasePolarity
!= 0) {
35 FileState
= (EFI_FFS_FILE_STATE
)~FileState
;
39 while (HighestBit
!= 0 && ((HighestBit
& FileState
) == 0)) {
43 return (EFI_FFS_FILE_STATE
) HighestBit
;
49 Check if a block of buffer is erased.
51 @param ErasePolarity Erase polarity attribute of the firmware volume
52 @param InBuffer The buffer to be checked
53 @param BufferSize Size of the buffer in bytes
55 @retval TRUE The block of buffer is erased
56 @retval FALSE The block of buffer is not erased
61 IN UINT8 ErasePolarity
,
70 if(ErasePolarity
== 1) {
77 for (Count
= 0; Count
< BufferSize
; Count
++) {
78 if (Buffer
[Count
] != EraseByte
) {
89 Verify checksum of the firmware volume header.
91 @param FvHeader Points to the firmware volume header to be checked
93 @retval TRUE Checksum verification passed
94 @retval FALSE Checksum verification failed
98 VerifyFvHeaderChecksum (
99 IN EFI_FIRMWARE_VOLUME_HEADER
*FvHeader
104 Checksum
= CalculateSum16 ((UINT16
*) FvHeader
, FvHeader
->HeaderLength
);
115 Verify checksum of the FFS file header.
117 @param FfsHeader Points to the FFS file header to be checked
119 @retval TRUE Checksum verification passed
120 @retval FALSE Checksum verification failed
124 VerifyHeaderChecksum (
125 IN EFI_FFS_FILE_HEADER
*FfsHeader
128 UINT8 HeaderChecksum
;
130 if (IS_FFS_FILE2 (FfsHeader
)) {
131 HeaderChecksum
= CalculateSum8 ((UINT8
*) FfsHeader
, sizeof (EFI_FFS_FILE_HEADER2
));
133 HeaderChecksum
= CalculateSum8 ((UINT8
*) FfsHeader
, sizeof (EFI_FFS_FILE_HEADER
));
135 HeaderChecksum
= (UINT8
) (HeaderChecksum
- FfsHeader
->State
- FfsHeader
->IntegrityCheck
.Checksum
.File
);
137 if (HeaderChecksum
== 0) {
147 Check if it's a valid FFS file header.
149 @param ErasePolarity Erase polarity attribute of the firmware volume
150 @param FfsHeader Points to the FFS file header to be checked
151 @param FileState FFS file state to be returned
153 @retval TRUE Valid FFS file header
154 @retval FALSE Invalid FFS file header
159 IN UINT8 ErasePolarity
,
160 IN EFI_FFS_FILE_HEADER
*FfsHeader
,
161 OUT EFI_FFS_FILE_STATE
*FileState
164 *FileState
= GetFileState (ErasePolarity
, FfsHeader
);
166 switch (*FileState
) {
167 case EFI_FILE_HEADER_VALID
:
168 case EFI_FILE_DATA_VALID
:
169 case EFI_FILE_MARKED_FOR_UPDATE
:
170 case EFI_FILE_DELETED
:
172 // Here we need to verify header checksum
174 return VerifyHeaderChecksum (FfsHeader
);
176 case EFI_FILE_HEADER_CONSTRUCTION
:
177 case EFI_FILE_HEADER_INVALID
:
185 Check if it's a valid FFS file.
186 Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.
188 @param ErasePolarity Erase polarity attribute of the firmware volume
189 @param FfsHeader Points to the FFS file to be checked
191 @retval TRUE Valid FFS file
192 @retval FALSE Invalid FFS file
197 IN UINT8 ErasePolarity
,
198 IN EFI_FFS_FILE_HEADER
*FfsHeader
201 EFI_FFS_FILE_STATE FileState
;
204 FileState
= GetFileState (ErasePolarity
, FfsHeader
);
207 case EFI_FILE_DELETED
:
208 case EFI_FILE_DATA_VALID
:
209 case EFI_FILE_MARKED_FOR_UPDATE
:
210 DataCheckSum
= FFS_FIXED_CHECKSUM
;
211 if ((FfsHeader
->Attributes
& FFS_ATTRIB_CHECKSUM
) == FFS_ATTRIB_CHECKSUM
) {
212 if (IS_FFS_FILE2 (FfsHeader
)) {
213 DataCheckSum
= CalculateCheckSum8 ((CONST UINT8
*) FfsHeader
+ sizeof (EFI_FFS_FILE_HEADER2
), FFS_FILE2_SIZE (FfsHeader
) - sizeof(EFI_FFS_FILE_HEADER2
));
215 DataCheckSum
= CalculateCheckSum8 ((CONST UINT8
*) FfsHeader
+ sizeof (EFI_FFS_FILE_HEADER
), FFS_FILE_SIZE (FfsHeader
) - sizeof(EFI_FFS_FILE_HEADER
));
218 if (FfsHeader
->IntegrityCheck
.Checksum
.File
== DataCheckSum
) {