3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Pei Core Firmware File System service routines.
24 STATIC EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnFvInfoList
= {
25 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
26 &gEfiPeiFirmwareVolumeInfoPpiGuid
,
27 FirmwareVolmeInfoPpiNotifyCallback
31 #define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
32 (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
37 IN UINT8 ErasePolarity
,
38 IN EFI_FFS_FILE_HEADER
*FfsHeader
44 Returns the highest bit set of the State field
48 ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
49 in the Attributes field.
50 FfsHeader - Pointer to FFS File Header.
53 Returns the highest bit in the State field
57 EFI_FFS_FILE_STATE FileState
;
58 EFI_FFS_FILE_STATE HighestBit
;
60 FileState
= FfsHeader
->State
;
62 if (ErasePolarity
!= 0) {
63 FileState
= (EFI_FFS_FILE_STATE
)~FileState
;
67 while (HighestBit
!= 0 && (HighestBit
& FileState
) == 0) {
76 CalculateHeaderChecksum (
77 IN EFI_FFS_FILE_HEADER
*FileHeader
83 Calculates the checksum of the header of a file.
87 FileHeader - Pointer to FFS File Header.
90 Checksum of the header.
92 The header is zero byte checksum.
93 - Zero means the header is good.
94 - Non-zero means the header is bad.
97 Bugbug: For PEI performance reason, we comments this code at this time.
105 ptr
= (UINT8
*)FileHeader
;
107 for (Index
= 0; Index
< sizeof(EFI_FFS_FILE_HEADER
) - 3; Index
+= 4) {
108 Sum
= (UINT8
)(Sum
+ ptr
[Index
]);
109 Sum
= (UINT8
)(Sum
+ ptr
[Index
+1]);
110 Sum
= (UINT8
)(Sum
+ ptr
[Index
+2]);
111 Sum
= (UINT8
)(Sum
+ ptr
[Index
+3]);
114 for (; Index
< sizeof(EFI_FFS_FILE_HEADER
); Index
++) {
115 Sum
= (UINT8
)(Sum
+ ptr
[Index
]);
119 // State field (since this indicates the different state of file).
121 Sum
= (UINT8
)(Sum
- FileHeader
->State
);
123 // Checksum field of the file is not part of the header checksum.
125 Sum
= (UINT8
)(Sum
- FileHeader
->IntegrityCheck
.Checksum
.File
);
133 PeiFileHandleToVolume (
134 IN EFI_PEI_FILE_HANDLE FileHandle
,
135 OUT EFI_PEI_FV_HANDLE
*VolumeHandle
139 PEI_CORE_INSTANCE
*PrivateData
;
140 EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
;
142 PrivateData
= PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer ());
143 for (Index
= 0; Index
< PrivateData
->FvCount
; Index
++) {
144 FwVolHeader
= PrivateData
->Fv
[Index
].FvHeader
;
145 if (((UINT64
) (UINTN
) FileHandle
> (UINT64
) (UINTN
) FwVolHeader
) && \
146 ((UINT64
) (UINTN
) FileHandle
<= ((UINT64
) (UINTN
) FwVolHeader
+ FwVolHeader
->FvLength
- 1))) {
147 *VolumeHandle
= (EFI_PEI_FV_HANDLE
)FwVolHeader
;
157 IN CONST EFI_PEI_FV_HANDLE FvHandle
,
158 IN CONST EFI_GUID
*FileName
, OPTIONAL
159 IN EFI_FV_FILETYPE SearchType
,
160 IN OUT EFI_PEI_FILE_HANDLE
*FileHandle
,
161 IN OUT EFI_PEI_FV_HANDLE
*AprioriFile OPTIONAL
166 Given the input file pointer, search for the next matching file in the
167 FFS volume as defined by SearchType. The search starts from FileHeader inside
168 the Firmware Volume defined by FwVolHeader.
171 PeiServices - Pointer to the PEI Core Services Table.
172 SearchType - Filter to find only files of this type.
173 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
174 FwVolHeader - Pointer to the FV header of the volume to search.
175 This parameter must point to a valid FFS volume.
176 FileHeader - Pointer to the current file from which to begin searching.
177 This pointer will be updated upon return to reflect the file found.
178 Flag - Indicator for if this is for PEI Dispath search
181 EFI_NOT_FOUND - No files matching the search criteria were found
186 EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
;
187 EFI_FFS_FILE_HEADER
**FileHeader
;
188 EFI_FFS_FILE_HEADER
*FfsFileHeader
;
189 EFI_FIRMWARE_VOLUME_EXT_HEADER
*FwVolExHeaderInfo
;
191 UINT32 FileOccupiedSize
;
197 FwVolHeader
= (EFI_FIRMWARE_VOLUME_HEADER
*)FvHandle
;
198 FileHeader
= (EFI_FFS_FILE_HEADER
**)FileHandle
;
200 FvLength
= FwVolHeader
->FvLength
;
201 if (FwVolHeader
->Attributes
& EFI_FVB_ERASE_POLARITY
) {
208 // If FileHeader is not specified (NULL) or FileName is not NULL,
209 // start with the first file in the firmware volume. Otherwise,
210 // start from the FileHeader.
212 if ((*FileHeader
== NULL
) || (FileName
!= NULL
)) {
213 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)((UINT8
*)FwVolHeader
+ FwVolHeader
->HeaderLength
);
214 if (FwVolHeader
->ExtHeaderOffset
!= 0) {
215 FwVolExHeaderInfo
= (EFI_FIRMWARE_VOLUME_EXT_HEADER
*)(((UINT8
*)FwVolHeader
) + FwVolHeader
->ExtHeaderOffset
);
216 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)(((UINT8
*)FwVolExHeaderInfo
) + FwVolExHeaderInfo
->ExtHeaderSize
);
220 // Length is 24 bits wide so mask upper 8 bits
221 // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
223 FileLength
= *(UINT32
*)(*FileHeader
)->Size
& 0x00FFFFFF;
224 FileOccupiedSize
= GET_OCCUPIED_SIZE (FileLength
, 8);
225 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)((UINT8
*)*FileHeader
+ FileOccupiedSize
);
228 FileOffset
= (UINT32
) ((UINT8
*)FfsFileHeader
- (UINT8
*)FwVolHeader
);
229 ASSERT (FileOffset
<= 0xFFFFFFFF);
231 while (FileOffset
< (FvLength
- sizeof (EFI_FFS_FILE_HEADER
))) {
233 // Get FileState which is the highest bit of the State
235 FileState
= GetFileState (ErasePolarity
, FfsFileHeader
);
238 case EFI_FILE_HEADER_INVALID
:
239 FileOffset
+= sizeof(EFI_FFS_FILE_HEADER
);
240 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)((UINT8
*)FfsFileHeader
+ sizeof(EFI_FFS_FILE_HEADER
));
243 case EFI_FILE_DATA_VALID
:
244 case EFI_FILE_MARKED_FOR_UPDATE
:
245 if (CalculateHeaderChecksum (FfsFileHeader
) != 0) {
247 return EFI_NOT_FOUND
;
250 FileLength
= *(UINT32
*)(FfsFileHeader
->Size
) & 0x00FFFFFF;
251 FileOccupiedSize
= GET_OCCUPIED_SIZE(FileLength
, 8);
253 if (FileName
!= NULL
) {
254 if (CompareGuid (&FfsFileHeader
->Name
, (EFI_GUID
*)FileName
)) {
255 *FileHeader
= FfsFileHeader
;
258 } else if (SearchType
== PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE
) {
259 if ((FfsFileHeader
->Type
== EFI_FV_FILETYPE_PEIM
) ||
260 (FfsFileHeader
->Type
== EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER
)) {
262 *FileHeader
= FfsFileHeader
;
264 } else if (AprioriFile
!= NULL
) {
265 if (FfsFileHeader
->Type
== EFI_FV_FILETYPE_FREEFORM
) {
266 if (CompareGuid (&FfsFileHeader
->Name
, &gPeiAprioriFileNameGuid
)) {
267 *AprioriFile
= FfsFileHeader
;
271 } else if ((SearchType
== FfsFileHeader
->Type
) || (SearchType
== EFI_FV_FILETYPE_ALL
)) {
272 *FileHeader
= FfsFileHeader
;
276 FileOffset
+= FileOccupiedSize
;
277 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)((UINT8
*)FfsFileHeader
+ FileOccupiedSize
);
280 case EFI_FILE_DELETED
:
281 FileLength
= *(UINT32
*)(FfsFileHeader
->Size
) & 0x00FFFFFF;
282 FileOccupiedSize
= GET_OCCUPIED_SIZE(FileLength
, 8);
283 FileOffset
+= FileOccupiedSize
;
284 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)((UINT8
*)FfsFileHeader
+ FileOccupiedSize
);
288 return EFI_NOT_FOUND
;
293 return EFI_NOT_FOUND
;
298 IN PEI_CORE_INSTANCE
*PrivateData
,
299 IN CONST EFI_SEC_PEI_HAND_OFF
*SecCoreData
305 Initialize PeiCore Fv List.
308 PrivateData - Pointer to PEI_CORE_INSTANCE.
309 SecCoreData - Pointer to EFI_SEC_PEI_HAND_OFF.
318 // The BFV must be the first entry. The Core FV support is stateless
319 // The AllFV list has a single entry per FV in PEI.
320 // The Fv list only includes FV that PEIMs will be dispatched from and
321 // its File System Format is PI 1.0 definition.
323 PrivateData
->FvCount
= 1;
324 PrivateData
->Fv
[0].FvHeader
= (EFI_FIRMWARE_VOLUME_HEADER
*)SecCoreData
->BootFirmwareVolumeBase
;
326 PrivateData
->AllFvCount
= 1;
327 PrivateData
->AllFv
[0] = (EFI_PEI_FV_HANDLE
)PrivateData
->Fv
[0].FvHeader
;
331 // Post a call-back for the FvInfoPPI services to expose
332 // additional Fvs to PeiCore.
334 Status
= PeiServicesNotifyPpi (&mNotifyOnFvInfoList
);
335 ASSERT_EFI_ERROR (Status
);
341 FirmwareVolmeInfoPpiNotifyCallback (
342 IN EFI_PEI_SERVICES
**PeiServices
,
343 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDescriptor
,
350 Process Firmware Volum Information once FvInfoPPI install.
354 PeiServices - General purpose services available to every PEIM.
358 Status - EFI_SUCCESS if the interface could be successfully
364 EFI_PEI_FIRMWARE_VOLUME_INFO_PPI
*Fv
;
365 PEI_CORE_INSTANCE
*PrivateData
;
367 PrivateData
= PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices
);
369 if (PrivateData
->FvCount
>= PEI_CORE_MAX_FV_SUPPORTED
) {
373 Fv
= (EFI_PEI_FIRMWARE_VOLUME_INFO_PPI
*)Ppi
;
375 if (CompareGuid (&Fv
->FvFormat
, &gEfiFirmwareFileSystem2Guid
)) {
376 for (FvCount
= 0; FvCount
< PrivateData
->FvCount
; FvCount
++) {
377 if ((UINTN
)PrivateData
->Fv
[FvCount
].FvHeader
== (UINTN
)Fv
->FvInfo
) {
381 PrivateData
->Fv
[PrivateData
->FvCount
++].FvHeader
= (EFI_FIRMWARE_VOLUME_HEADER
*)Fv
->FvInfo
;
382 BuildFvHob ((EFI_PHYSICAL_ADDRESS
) (UINTN
) Fv
->FvInfo
, (UINT64
) Fv
->FvInfoSize
);
386 // Allways add to the All list
388 PrivateData
->AllFv
[PrivateData
->AllFvCount
++] = (EFI_PEI_FV_HANDLE
)Fv
->FvInfo
;
394 PeiFfsProcessSection (
395 IN CONST EFI_PEI_SERVICES
**PeiServices
,
396 IN EFI_SECTION_TYPE SectionType
,
397 IN EFI_COMMON_SECTION_HEADER
*Section
,
398 IN UINTN SectionSize
,
399 OUT VOID
**OutputBuffer
,
400 OUT UINTN
*OutputSize
,
401 OUT UINT32
*Authentication
407 Go through the file to search SectionType section,
408 when meeting an encapsuled section, search recursively.
411 PeiServices - Pointer to the PEI Core Services Table.
412 SearchType - Filter to find only section of this type.
413 Section - From where to search.
414 SectionSize - The file size to search.
415 OutputBuffer - Pointer to the section to search.
416 OutputSize - The size of the section to search.
417 Authentication - Authenticate the section.
425 UINT32 SectionLength
;
427 EFI_GUID_DEFINED_SECTION
*GuidSection
;
428 EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
*GuidSectionPpi
;
429 EFI_COMPRESSION_SECTION
*CompressionSection
;
430 EFI_PEI_DECOMPRESS_PPI
*DecompressPpi
;
434 *OutputBuffer
= NULL
;
436 while (ParsedLength
< SectionSize
) {
437 if (Section
->Type
== SectionType
) {
438 *OutputBuffer
= (VOID
*)(Section
+ 1);
440 } else if (Section
->Type
== EFI_SECTION_GUID_DEFINED
) {
441 GuidSection
= (EFI_GUID_DEFINED_SECTION
*)Section
;
442 Status
= PeiServicesLocatePpi (&GuidSection
->SectionDefinitionGuid
, 0, NULL
, (VOID
**) &GuidSectionPpi
);
443 if (!EFI_ERROR (Status
)) {
444 Status
= GuidSectionPpi
->ExtractSection (
451 if (!EFI_ERROR (Status
)) {
452 return PeiFfsProcessSection (
463 } else if (Section
->Type
== EFI_SECTION_COMPRESSION
) {
464 CompressionSection
= (EFI_COMPRESSION_SECTION
*)Section
;
465 Status
= PeiServicesLocatePpi (&gEfiPeiDecompressPpiGuid
, 0, NULL
, (VOID
**) &DecompressPpi
);
466 if (!EFI_ERROR (Status
)) {
467 Status
= DecompressPpi
->Decompress (
473 if (!EFI_ERROR (Status
)) {
474 return PeiFfsProcessSection (
475 PeiServices
, SectionType
, PpiOutput
, PpiOutputSize
, OutputBuffer
, OutputSize
, Authentication
482 // Size is 24 bits wide so mask upper 8 bits.
483 // SectionLength is adjusted it is 4 byte aligned.
484 // Go to the next section
486 SectionLength
= *(UINT32
*)Section
->Size
& 0x00FFFFFF;
487 SectionLength
= GET_OCCUPIED_SIZE (SectionLength
, 4);
488 ASSERT (SectionLength
!= 0);
489 ParsedLength
+= SectionLength
;
490 Section
= (EFI_COMMON_SECTION_HEADER
*)((UINT8
*)Section
+ SectionLength
);
493 return EFI_NOT_FOUND
;
499 PeiFfsFindSectionData (
500 IN CONST EFI_PEI_SERVICES
**PeiServices
,
501 IN EFI_SECTION_TYPE SectionType
,
502 IN EFI_PEI_FILE_HANDLE FileHandle
,
503 IN OUT VOID
**SectionData
508 Given the input file pointer, search for the next matching section in the
512 PeiServices - Pointer to the PEI Core Services Table.
513 SearchType - Filter to find only sections of this type.
514 FfsFileHeader - Pointer to the current file to search.
515 SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
516 - NULL if section not found
519 EFI_NOT_FOUND - No files matching the search criteria were found
524 EFI_FFS_FILE_HEADER
*FfsFileHeader
;
526 EFI_COMMON_SECTION_HEADER
*Section
;
528 UINT32 AuthenticationStatus
;
531 FfsFileHeader
= (EFI_FFS_FILE_HEADER
*)(FileHandle
);
534 // Size is 24 bits wide so mask upper 8 bits.
535 // Does not include FfsFileHeader header size
536 // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
538 Section
= (EFI_COMMON_SECTION_HEADER
*)(FfsFileHeader
+ 1);
539 FileSize
= *(UINT32
*)(FfsFileHeader
->Size
) & 0x00FFFFFF;
540 FileSize
-= sizeof (EFI_FFS_FILE_HEADER
);
542 return PeiFfsProcessSection (
549 &AuthenticationStatus
556 IN EFI_PEI_SERVICES
**PeiServices
,
557 IN EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
,
558 IN OUT EFI_FFS_FILE_HEADER
**PeimFileHeader
563 Given the input file pointer, search for the next matching file in the
564 FFS volume. The search starts from FileHeader inside
565 the Firmware Volume defined by FwVolHeader.
568 PeiServices - Pointer to the PEI Core Services Table.
570 FwVolHeader - Pointer to the FV header of the volume to search.
571 This parameter must point to a valid FFS volume.
573 PeimFileHeader - Pointer to the current file from which to begin searching.
574 This pointer will be updated upon return to reflect the file found.
577 EFI_NOT_FOUND - No files matching the search criteria were found
582 return PeiFindFileEx (
583 (EFI_PEI_FV_HANDLE
) FwVolHeader
,
585 EFI_FV_FILETYPE_PEIM
,
586 (EFI_PEI_FILE_HANDLE
*)PeimFileHeader
,
594 IN CONST EFI_PEI_SERVICES
**PeiServices
,
596 IN EFI_PEI_FV_HANDLE VolumeHandle
,
597 IN OUT EFI_PEI_FILE_HANDLE
*FileHandle
602 Given the input file pointer, search for the next matching file in the
603 FFS volume as defined by SearchType. The search starts from FileHeader inside
604 the Firmware Volume defined by FwVolHeader.
607 PeiServices - Pointer to the PEI Core Services Table.
609 SearchType - Filter to find only files of this type.
610 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
612 FwVolHeader - Pointer to the FV header of the volume to search.
613 This parameter must point to a valid FFS volume.
615 FileHeader - Pointer to the current file from which to begin searching.
616 This pointer will be updated upon return to reflect the file found.
619 EFI_NOT_FOUND - No files matching the search criteria were found
624 return PeiFindFileEx (VolumeHandle
, NULL
, SearchType
, FileHandle
, NULL
);
630 PeiFvFindNextVolume (
631 IN CONST EFI_PEI_SERVICES
**PeiServices
,
633 IN OUT EFI_PEI_FV_HANDLE
*VolumeHandle
639 Return the BFV location
641 BugBug -- Move this to the location of this code to where the
642 other FV and FFS support code lives.
643 Also, update to use FindFV for instances #'s >= 1.
647 PeiServices - The PEI core services table.
648 Instance - Instance of FV to find
649 FwVolHeader - Pointer to contain the data to return
652 Pointer to the Firmware Volume instance requested
654 EFI_INVALID_PARAMETER - FwVolHeader is NULL
656 EFI_SUCCESS - Firmware volume instance successfully found.
660 PEI_CORE_INSTANCE
*Private
;
662 Private
= PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices
);
663 if (VolumeHandle
== NULL
) {
664 return EFI_INVALID_PARAMETER
;
667 if (Instance
>= Private
->AllFvCount
) {
669 return EFI_NOT_FOUND
;
672 *VolumeHandle
= Private
->AllFv
[Instance
];
679 PeiFfsFindFileByName (
680 IN CONST EFI_GUID
*FileName
,
681 IN EFI_PEI_FV_HANDLE VolumeHandle
,
682 OUT EFI_PEI_FILE_HANDLE
*FileHandle
688 Given the input VolumeHandle, search for the next matching name file.
692 FileName - File name to search.
693 VolumeHandle - The current FV to search.
694 FileHandle - Pointer to the file matching name in VolumeHandle.
695 - NULL if file not found
702 if ((VolumeHandle
== NULL
) || (FileName
== NULL
) || (FileHandle
== NULL
)) {
703 return EFI_INVALID_PARAMETER
;
705 Status
= PeiFindFileEx (VolumeHandle
, FileName
, 0, FileHandle
, NULL
);
706 if (Status
== EFI_NOT_FOUND
) {
715 IN EFI_PEI_FILE_HANDLE FileHandle
,
716 OUT EFI_FV_FILE_INFO
*FileInfo
722 Collect information of given file.
725 FileHandle - The handle to file.
726 FileInfo - Pointer to the file information.
735 EFI_FFS_FILE_HEADER
*FileHeader
;
736 EFI_PEI_FV_HANDLE VolumeHandle
;
738 if ((FileHandle
== NULL
) || (FileInfo
== NULL
)) {
739 return EFI_INVALID_PARAMETER
;
743 // Retrieve the FirmwareVolume which the file resides in.
745 if (!PeiFileHandleToVolume(FileHandle
, &VolumeHandle
)) {
746 return EFI_INVALID_PARAMETER
;
749 if (((EFI_FIRMWARE_VOLUME_HEADER
*)VolumeHandle
)->Attributes
& EFI_FVB_ERASE_POLARITY
) {
756 // Get FileState which is the highest bit of the State
758 FileState
= GetFileState (ErasePolarity
, (EFI_FFS_FILE_HEADER
*)FileHandle
);
761 case EFI_FILE_DATA_VALID
:
762 case EFI_FILE_MARKED_FOR_UPDATE
:
765 return EFI_INVALID_PARAMETER
;
768 FileHeader
= (EFI_FFS_FILE_HEADER
*)FileHandle
;
769 CopyMem (&FileInfo
->FileName
, &FileHeader
->Name
, sizeof(EFI_GUID
));
770 FileInfo
->FileType
= FileHeader
->Type
;
771 FileInfo
->FileAttributes
= FileHeader
->Attributes
;
772 FileInfo
->BufferSize
= ((*(UINT32
*)FileHeader
->Size
) & 0x00FFFFFF) - sizeof (EFI_FFS_FILE_HEADER
);
773 FileInfo
->Buffer
= (FileHeader
+ 1);
780 PeiFfsGetVolumeInfo (
781 IN EFI_PEI_FV_HANDLE VolumeHandle
,
782 OUT EFI_FV_INFO
*VolumeInfo
788 Collect information of given Fv Volume.
791 VolumeHandle - The handle to Fv Volume.
792 VolumeInfo - The pointer to volume information.
799 EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
;
800 EFI_FIRMWARE_VOLUME_EXT_HEADER
*FwVolExHeaderInfo
;
802 if (VolumeInfo
== NULL
) {
803 return EFI_INVALID_PARAMETER
;
806 FwVolHeader
= (EFI_FIRMWARE_VOLUME_HEADER
*)(VolumeHandle
);
807 VolumeInfo
->FvAttributes
= FwVolHeader
->Attributes
;
808 VolumeInfo
->FvStart
= FwVolHeader
;
809 VolumeInfo
->FvSize
= FwVolHeader
->FvLength
;
810 CopyMem (&VolumeInfo
->FvFormat
, &FwVolHeader
->FileSystemGuid
,sizeof(EFI_GUID
));
812 if (FwVolHeader
->ExtHeaderOffset
!= 0) {
813 FwVolExHeaderInfo
= (EFI_FIRMWARE_VOLUME_EXT_HEADER
*)(((UINT8
*)FwVolHeader
) + FwVolHeader
->ExtHeaderOffset
);
814 CopyMem (&VolumeInfo
->FvName
, &FwVolExHeaderInfo
->FvName
, sizeof(EFI_GUID
));