1
1
/** @file
2
2
3
- Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
3
+ Copyright (c) 2015 - 2021 , Intel Corporation. All rights reserved.<BR>
4
4
Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>
5
5
6
6
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -63,18 +63,20 @@ CalculateHeaderChecksum (
63
63
UINT8 * ptr ;
64
64
UINTN Index ;
65
65
UINT8 Sum ;
66
+ UINTN Size ;
66
67
67
- Sum = 0 ;
68
- ptr = (UINT8 * )FileHeader ;
68
+ Sum = 0 ;
69
+ ptr = (UINT8 * )FileHeader ;
70
+ Size = IS_FFS_FILE2 (FileHeader ) ? sizeof (EFI_FFS_FILE_HEADER2 ) : sizeof (EFI_FFS_FILE_HEADER );
69
71
70
- for (Index = 0 ; Index < sizeof ( EFI_FFS_FILE_HEADER ) - 3 ; Index += 4 ) {
72
+ for (Index = 0 ; Index < Size - 3 ; Index += 4 ) {
71
73
Sum = (UINT8 )(Sum + ptr [Index ]);
72
74
Sum = (UINT8 )(Sum + ptr [Index + 1 ]);
73
75
Sum = (UINT8 )(Sum + ptr [Index + 2 ]);
74
76
Sum = (UINT8 )(Sum + ptr [Index + 3 ]);
75
77
}
76
78
77
- for ( ; Index < sizeof ( EFI_FFS_FILE_HEADER ) ; Index ++ ) {
79
+ for ( ; Index < Size ; Index ++ ) {
78
80
Sum = (UINT8 )(Sum + ptr [Index ]);
79
81
}
80
82
@@ -157,7 +159,8 @@ FfsFindNextFile (
157
159
// Length is 24 bits wide so mask upper 8 bits
158
160
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
159
161
//
160
- FileLength = FFS_FILE_SIZE (* FileHeader );
162
+ FileLength = IS_FFS_FILE2 (* FileHeader ) ?
163
+ FFS_FILE2_SIZE (* FileHeader ) : FFS_FILE_SIZE (* FileHeader );
161
164
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength , 8 );
162
165
FfsFileHeader = (EFI_FFS_FILE_HEADER * )((UINT8 * )* FileHeader + FileOccupiedSize );
163
166
}
@@ -172,14 +175,21 @@ FfsFindNextFile (
172
175
173
176
switch (FileState ) {
174
177
case EFI_FILE_HEADER_INVALID :
175
- FileOffset += sizeof (EFI_FFS_FILE_HEADER );
176
- FfsFileHeader = (EFI_FFS_FILE_HEADER * )((UINT8 * )FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER ));
178
+ if (IS_FFS_FILE2 (FfsFileHeader )) {
179
+ FileOffset += sizeof (EFI_FFS_FILE_HEADER2 );
180
+ FfsFileHeader = (EFI_FFS_FILE_HEADER * )((UINT8 * )FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER2 ));
181
+ } else {
182
+ FileOffset += sizeof (EFI_FFS_FILE_HEADER );
183
+ FfsFileHeader = (EFI_FFS_FILE_HEADER * )((UINT8 * )FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER ));
184
+ }
185
+
177
186
break ;
178
187
179
188
case EFI_FILE_DATA_VALID :
180
189
case EFI_FILE_MARKED_FOR_UPDATE :
181
190
if (CalculateHeaderChecksum (FfsFileHeader ) == 0 ) {
182
- FileLength = FFS_FILE_SIZE (FfsFileHeader );
191
+ FileLength = IS_FFS_FILE2 (FfsFileHeader ) ?
192
+ FFS_FILE2_SIZE (FfsFileHeader ) : FFS_FILE_SIZE (FfsFileHeader );
183
193
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength , 8 );
184
194
185
195
if ((SearchType == FfsFileHeader -> Type ) || (SearchType == EFI_FV_FILETYPE_ALL )) {
@@ -197,7 +207,8 @@ FfsFindNextFile (
197
207
break ;
198
208
199
209
case EFI_FILE_DELETED :
200
- FileLength = FFS_FILE_SIZE (FfsFileHeader );
210
+ FileLength = IS_FFS_FILE2 (FfsFileHeader ) ?
211
+ FFS_FILE2_SIZE (FfsFileHeader ) : FFS_FILE_SIZE (FfsFileHeader );
201
212
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength , 8 );
202
213
FileOffset += FileOccupiedSize ;
203
214
FfsFileHeader = (EFI_FFS_FILE_HEADER * )((UINT8 * )FfsFileHeader + FileOccupiedSize );
@@ -253,7 +264,7 @@ FindFfsSectionInSections (
253
264
254
265
Section = (EFI_COMMON_SECTION_HEADER * )(UINTN )CurrentAddress ;
255
266
256
- Size = SECTION_SIZE (Section );
267
+ Size = IS_SECTION2 ( Section ) ? SECTION2_SIZE ( Section ) : SECTION_SIZE (Section );
257
268
if (Size < sizeof (* Section )) {
258
269
return EFI_VOLUME_CORRUPTED ;
259
270
}
@@ -306,9 +317,13 @@ FfsFindSection (
306
317
// Does not include FfsFileHeader header size
307
318
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
308
319
//
309
- Section = (EFI_COMMON_SECTION_HEADER * )(FfsFileHeader + 1 );
310
- FileSize = FFS_FILE_SIZE (FfsFileHeader );
311
- FileSize -= sizeof (EFI_FFS_FILE_HEADER );
320
+ if (IS_FFS_FILE2 (FfsFileHeader )) {
321
+ Section = (EFI_COMMON_SECTION_HEADER * )((EFI_FFS_FILE_HEADER2 * )FfsFileHeader + 1 );
322
+ FileSize = FFS_FILE2_SIZE (FfsFileHeader ) - sizeof (EFI_FFS_FILE_HEADER2 );
323
+ } else {
324
+ Section = (EFI_COMMON_SECTION_HEADER * )(FfsFileHeader + 1 );
325
+ FileSize = FFS_FILE_SIZE (FfsFileHeader ) - sizeof (EFI_FFS_FILE_HEADER );
326
+ }
312
327
313
328
Status = FindFfsSectionInSections (
314
329
Section ,
@@ -351,16 +366,26 @@ FfsFindSectionData (
351
366
// Does not include FfsFileHeader header size
352
367
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
353
368
//
354
- Section = (EFI_COMMON_SECTION_HEADER * )(FfsFileHeader + 1 );
355
- FileSize = FFS_FILE_SIZE (FfsFileHeader );
356
- FileSize -= sizeof (EFI_FFS_FILE_HEADER );
369
+ if (IS_FFS_FILE2 (FfsFileHeader )) {
370
+ Section = (EFI_COMMON_SECTION_HEADER * )((EFI_FFS_FILE_HEADER2 * )FfsFileHeader + 1 );
371
+ FileSize = FFS_FILE2_SIZE (FfsFileHeader ) - sizeof (EFI_FFS_FILE_HEADER2 );
372
+ } else {
373
+ Section = (EFI_COMMON_SECTION_HEADER * )(FfsFileHeader + 1 );
374
+ FileSize = FFS_FILE_SIZE (FfsFileHeader ) - sizeof (EFI_FFS_FILE_HEADER );
375
+ }
357
376
358
377
* SectionData = NULL ;
359
378
ParsedLength = 0 ;
360
379
while (ParsedLength < FileSize ) {
361
380
if (Section -> Type == SectionType ) {
362
- * SectionData = (VOID * )(Section + 1 );
363
- * SectionDataSize = SECTION_SIZE (Section );
381
+ if (IS_SECTION2 (Section )) {
382
+ * SectionData = (VOID * )((EFI_COMMON_SECTION_HEADER2 * )Section + 1 );
383
+ * SectionDataSize = SECTION2_SIZE (Section );
384
+ } else {
385
+ * SectionData = (VOID * )(Section + 1 );
386
+ * SectionDataSize = SECTION_SIZE (Section );
387
+ }
388
+
364
389
return EFI_SUCCESS ;
365
390
}
366
391
@@ -369,7 +394,7 @@ FfsFindSectionData (
369
394
// SectionLength is adjusted it is 4 byte aligned.
370
395
// Go to the next section
371
396
//
372
- SectionLength = SECTION_SIZE (Section );
397
+ SectionLength = IS_SECTION2 ( Section ) ? SECTION2_SIZE ( Section ) : SECTION_SIZE (Section );
373
398
SectionLength = GET_OCCUPIED_SIZE (SectionLength , 4 );
374
399
375
400
ParsedLength += SectionLength ;
0 commit comments