+ EFI_STATUS Status;\r
+ \r
+ ASSERT (FvHandle != NULL);\r
+ \r
+ if (Buffer == NULL) {\r
+ return EFI_VOLUME_CORRUPTED;\r
+ }\r
+ \r
+ //\r
+ // The build-in EFI_PEI_FIRMWARE_VOLUME_PPI for FFS2 support memory-mapped\r
+ // FV image and the handle is pointed to Fv image's buffer.\r
+ //\r
+ *FvHandle = (EFI_PEI_FV_HANDLE) Buffer;\r
+ \r
+ //\r
+ // Do verify for given FV buffer.\r
+ //\r
+ Status = VerifyFv ((EFI_FIRMWARE_VOLUME_HEADER*) Buffer);\r
+ if (EFI_ERROR(Status)) {\r
+ DEBUG ((EFI_D_ERROR, "Fail to verify FV which address is 0x%11p", Buffer));\r
+ return EFI_VOLUME_CORRUPTED;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+} \r
+\r
+/**\r
+ Finds the next file of the specified type.\r
+\r
+ This service enables PEI modules to discover additional firmware files. \r
+ The FileHandle must be unique within the system.\r
+\r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param SearchType A filter to find only files of this type. Type\r
+ EFI_FV_FILETYPE_ALL causes no filtering to be\r
+ done.\r
+ @param FvHandle Handle of firmware volume in which to\r
+ search.\r
+ @param FileHandle Points to the current handle from which to\r
+ begin searching or NULL to start at the\r
+ beginning of the firmware volume. Updated\r
+ upon return to reflect the file found.\r
+\r
+ @retval EFI_SUCCESS The file was found.\r
+ @retval EFI_NOT_FOUND The file was not found. FileHandle contains NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfs2FvPpiFindFileByType (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This,\r
+ IN EFI_FV_FILETYPE SearchType,\r
+ IN EFI_PEI_FV_HANDLE FvHandle,\r
+ IN OUT EFI_PEI_FILE_HANDLE *FileHandle\r
+ )\r
+{ \r
+ return FindFileEx (FvHandle, NULL, SearchType, FileHandle, NULL);\r
+}\r
+\r
+/**\r
+ Find a file within a volume by its name. \r
+ \r
+ This service searches for files with a specific name, within\r
+ either the specified firmware volume or all firmware volumes.\r
+\r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param FileName A pointer to the name of the file to find\r
+ within the firmware volume.\r
+ @param FvHandle Upon entry, the pointer to the firmware\r
+ volume to search or NULL if all firmware\r
+ volumes should be searched. Upon exit, the\r
+ actual firmware volume in which the file was\r
+ found.\r
+ @param FileHandle Upon exit, points to the found file's\r
+ handle or NULL if it could not be found.\r
+\r
+ @retval EFI_SUCCESS File was found.\r
+ @retval EFI_NOT_FOUND File was not found.\r
+ @retval EFI_INVALID_PARAMETER FvHandle or FileHandle or\r
+ FileName was NULL.\r
+\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfs2FvPpiFindFileByName (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This,\r
+ IN CONST EFI_GUID *FileName,\r
+ IN EFI_PEI_FV_HANDLE *FvHandle,\r
+ OUT EFI_PEI_FILE_HANDLE *FileHandle \r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PEI_CORE_INSTANCE *PrivateData;\r
+ UINTN Index;\r
+ \r
+ if ((FvHandle == NULL) || (FileName == NULL) || (FileHandle == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ if (*FvHandle != NULL) {\r
+ Status = FindFileEx (*FvHandle, FileName, 0, FileHandle, NULL);\r
+ if (Status == EFI_NOT_FOUND) {\r
+ *FileHandle = NULL;\r
+ }\r
+ } else { \r
+ //\r
+ // If *FvHandle = NULL, so search all FV for given filename\r
+ //\r
+ Status = EFI_NOT_FOUND;\r
+ \r
+ PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer());\r
+ for (Index = 0; Index < PrivateData->FvCount; Index ++) {\r
+ //\r
+ // Only search the FV which is associated with a EFI_PEI_FIRMWARE_VOLUME_PPI instance.\r
+ //\r
+ if (PrivateData->Fv[Index].FvPpi != NULL) {\r
+ Status = FindFileEx (PrivateData->Fv[Index].FvHandle, FileName, 0, FileHandle, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ *FvHandle = PrivateData->Fv[Index].FvHandle;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ return Status; \r
+} \r
+\r
+/**\r
+ Returns information about a specific file.\r
+\r
+ This function returns information about a specific\r
+ file, including its file name, type, attributes, starting\r
+ address and size. \r
+ \r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param FileHandle Handle of the file.\r
+ @param FileInfo Upon exit, points to the file's\r
+ information.\r
+\r
+ @retval EFI_SUCCESS File information returned.\r
+ @retval EFI_INVALID_PARAMETER If FileHandle does not\r
+ represent a valid file.\r
+ @retval EFI_INVALID_PARAMETER If FileInfo is NULL.\r
+ \r
+**/ \r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfs2FvPpiGetFileInfo (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, \r
+ IN EFI_PEI_FILE_HANDLE FileHandle, \r
+ OUT EFI_FV_FILE_INFO *FileInfo\r
+ )\r
+{\r
+ UINT8 FileState;\r
+ UINT8 ErasePolarity;\r
+ EFI_FFS_FILE_HEADER *FileHeader;\r
+ PEI_CORE_FV_HANDLE *CoreFvHandle;\r
+ \r
+ if ((FileHandle == NULL) || (FileInfo == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Retrieve the FirmwareVolume which the file resides in.\r
+ //\r
+ CoreFvHandle = FileHandleToVolume (FileHandle);\r
+ if (CoreFvHandle == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if ((CoreFvHandle->FvHeader->Attributes & EFI_FVB2_ERASE_POLARITY) != 0) {\r
+ ErasePolarity = 1;\r
+ } else {\r
+ ErasePolarity = 0;\r
+ }\r
+\r
+ //\r
+ // Get FileState which is the highest bit of the State \r
+ //\r
+ FileState = GetFileState (ErasePolarity, (EFI_FFS_FILE_HEADER*)FileHandle);\r
+\r
+ switch (FileState) {\r
+ case EFI_FILE_DATA_VALID:\r
+ case EFI_FILE_MARKED_FOR_UPDATE:\r
+ break; \r
+ default:\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ FileHeader = (EFI_FFS_FILE_HEADER *)FileHandle;\r
+ CopyMem (&FileInfo->FileName, &FileHeader->Name, sizeof(EFI_GUID));\r
+ FileInfo->FileType = FileHeader->Type;\r
+ FileInfo->FileAttributes = FileHeader->Attributes;\r
+ FileInfo->BufferSize = ((*(UINT32 *)FileHeader->Size) & 0x00FFFFFF) - sizeof (EFI_FFS_FILE_HEADER);\r
+ FileInfo->Buffer = (FileHeader + 1);\r
+ return EFI_SUCCESS; \r
+} \r
+ \r
+/**\r
+ This function returns information about the firmware volume.\r
+ \r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param FvHandle Handle to the firmware handle.\r
+ @param VolumeInfo Points to the returned firmware volume\r
+ information.\r
+\r
+ @retval EFI_SUCCESS Information returned successfully.\r
+ @retval EFI_INVALID_PARAMETER FvHandle does not indicate a valid\r
+ firmware volume or VolumeInfo is NULL.\r
+\r
+**/ \r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfs2FvPpiGetVolumeInfo (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, \r
+ IN EFI_PEI_FV_HANDLE FvHandle, \r
+ OUT EFI_FV_INFO *VolumeInfo\r
+ )\r
+{\r
+ EFI_FIRMWARE_VOLUME_HEADER FwVolHeader;\r