return TRUE;\r
}\r
\r
+STATIC\r
EFI_STATUS\r
BootMonFsDiscoverNextImage (\r
- IN BOOTMON_FS_INSTANCE *Instance,\r
- IN EFI_LBA *LbaStart,\r
- OUT HW_IMAGE_DESCRIPTION *ImageDescription\r
+ IN BOOTMON_FS_INSTANCE *Instance,\r
+ IN OUT EFI_LBA *LbaStart,\r
+ IN OUT BOOTMON_FS_FILE *File\r
)\r
{\r
EFI_DISK_IO_PROTOCOL *DiskIo;\r
Instance->Media->MediaId,\r
DescOffset,\r
sizeof (HW_IMAGE_DESCRIPTION),\r
- ImageDescription\r
+ &File->HwDescription\r
);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
// If we found a valid image description...\r
- if (BootMonFsIsImageValid (ImageDescription, (CurrentLba - Instance->Media->LowestAlignedLba))) {\r
- DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n", &(ImageDescription->Footer.Filename), (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba)));\r
-\r
- *LbaStart = ImageDescription->BlockEnd + 1;\r
+ if (BootMonFsIsImageValid (&File->HwDescription, (CurrentLba - Instance->Media->LowestAlignedLba))) {\r
+ DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n",\r
+ &(File->HwDescription.Footer.Filename),\r
+ (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba)\r
+ ));\r
+ File->HwDescAddress = DescOffset;\r
+\r
+ *LbaStart = CurrentLba + 1;\r
return EFI_SUCCESS;\r
} else {\r
CurrentLba++;\r
return Status;\r
}\r
\r
- Status = BootMonFsDiscoverNextImage (Instance, &Lba, &(NewFile->HwDescription));\r
+ Status = BootMonFsDiscoverNextImage (Instance, &Lba, NewFile);\r
if (EFI_ERROR (Status)) {\r
// Free NewFile allocated by BootMonFsCreateFile ()\r
FreePool (NewFile);\r
EFI_DISK_IO_PROTOCOL *DiskIo;\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
UINT32 MediaId;\r
- UINT32 BlockSize;\r
VOID *Buffer;\r
EFI_STATUS Status;\r
- UINT64 DescriptionAddress;\r
\r
DiskIo = File->Instance->DiskIo;\r
BlockIo = File->Instance->BlockIo;\r
MediaId = BlockIo->Media->MediaId;\r
- BlockSize = BlockIo->Media->BlockSize;\r
-\r
- DescriptionAddress = (File->HwDescription.BlockEnd * BlockSize)\r
- - sizeof (HW_IMAGE_DESCRIPTION);\r
\r
Buffer = AllocateZeroPool (sizeof (HW_IMAGE_DESCRIPTION));\r
\r
Status = DiskIo->WriteDisk (DiskIo,\r
MediaId,\r
- DescriptionAddress,\r
+ File->HwDescAddress,\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Buffer\r
);\r
\r
// Only invalidate the Image Description of files that have already been\r
// written in Flash\r
- if (File->HwDescription.RegionCount > 0) {\r
+ if (File->HwDescAddress != 0) {\r
Status = InvalidateImageDescription (File);\r
ASSERT_EFI_ERROR (Status);\r
}\r
if ((NewFileSize % BlockSize) > 0) {\r
NewFileSize += BlockSize - (NewFileSize % BlockSize);\r
}\r
+\r
+ File->HwDescAddress = (FileStart + NewFileSize) - sizeof (HW_IMAGE_DESCRIPTION);\r
+\r
// Update the file description on the media\r
Status = DiskIo->WriteDisk (\r
DiskIo,\r
File->Instance->Media->MediaId,\r
- (FileStart + NewFileSize) - sizeof (HW_IMAGE_DESCRIPTION),\r
+ File->HwDescAddress,\r
sizeof (HW_IMAGE_DESCRIPTION),\r
Description\r
);\r
BOOTMON_FS_FILE *File;\r
LIST_ENTRY *RegionToFlushLink;\r
BOOTMON_FS_FILE_REGION *Region;\r
- HW_IMAGE_DESCRIPTION *Description;\r
EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
UINT8 *EmptyBuffer;\r
\r
\r
// If (RegionCount is greater than 0) then the file already exists\r
if (File->HwDescription.RegionCount > 0) {\r
- Description = &File->HwDescription;\r
BlockIo = File->Instance->BlockIo;\r
\r
// Create an empty buffer\r
}\r
\r
// Invalidate the last Block\r
- Status = BlockIo->WriteBlocks (BlockIo, BlockIo->Media->MediaId, Description->BlockEnd, BlockIo->Media->BlockSize, EmptyBuffer);\r
+ Status = InvalidateImageDescription (File);\r
ASSERT_EFI_ERROR (Status);\r
\r
FreePool (EmptyBuffer);\r