}\r
\r
BOOLEAN\r
-BootMonFsImageInThisBlock (\r
- IN VOID *Buf,\r
- IN UINTN Size,\r
- IN UINT32 Block,\r
- OUT HW_IMAGE_DESCRIPTION *Image\r
+BootMonFsIsImageValid (\r
+ IN HW_IMAGE_DESCRIPTION *Desc,\r
+ IN EFI_LBA Lba\r
)\r
{\r
EFI_STATUS Status;\r
- HW_IMAGE_FOOTER *Ptr;\r
- HW_IMAGE_DESCRIPTION *Footer;\r
+ HW_IMAGE_FOOTER *Footer;\r
UINT32 Checksum;\r
\r
- // The footer is stored as the last thing in the block\r
- Ptr = (HW_IMAGE_FOOTER *)((UINT8 *)Buf + Size - sizeof (HW_IMAGE_FOOTER));\r
+ Footer = &Desc->Footer;\r
\r
// Check that the verification bytes are present\r
- if ((Ptr->FooterSignature1 != HW_IMAGE_FOOTER_SIGNATURE_1) || (Ptr->FooterSignature2 != HW_IMAGE_FOOTER_SIGNATURE_2)) {\r
+ if ((Footer->FooterSignature1 != HW_IMAGE_FOOTER_SIGNATURE_1) ||\r
+ (Footer->FooterSignature2 != HW_IMAGE_FOOTER_SIGNATURE_2)) {\r
return FALSE;\r
}\r
\r
- if (Ptr->Version == HW_IMAGE_FOOTER_VERSION) {\r
- if (Ptr->Offset != HW_IMAGE_FOOTER_OFFSET) {\r
+ if (Footer->Version == HW_IMAGE_FOOTER_VERSION) {\r
+ if (Footer->Offset != HW_IMAGE_FOOTER_OFFSET) {\r
return FALSE;\r
}\r
- } else if (Ptr->Version == HW_IMAGE_FOOTER_VERSION2) {\r
- if (Ptr->Offset != HW_IMAGE_FOOTER_OFFSET2) {\r
+ } else if (Footer->Version == HW_IMAGE_FOOTER_VERSION2) {\r
+ if (Footer->Offset != HW_IMAGE_FOOTER_OFFSET2) {\r
return FALSE;\r
}\r
} else {\r
return FALSE;\r
}\r
\r
- Footer = (HW_IMAGE_DESCRIPTION *)(((UINT8 *)Buf + Size - sizeof (HW_IMAGE_DESCRIPTION)));\r
- Checksum = Footer->FooterChecksum;\r
- Status = BootMonFsComputeFooterChecksum (Footer);\r
+ Checksum = Desc->FooterChecksum;\r
+ Status = BootMonFsComputeFooterChecksum (Desc);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Warning: failed to compute checksum for image '%a'\n", Footer->Footer.Filename));\r
+ DEBUG ((DEBUG_ERROR, "Warning: failed to compute checksum for image '%a'\n", Desc->Footer.Filename));\r
}\r
\r
- if (Footer->FooterChecksum != Checksum) {\r
- DEBUG ((DEBUG_ERROR, "Warning: image '%a' checksum mismatch.\n", Footer->Footer.Filename));\r
+ if (Desc->FooterChecksum != Checksum) {\r
+ DEBUG ((DEBUG_ERROR, "Warning: image '%a' checksum mismatch.\n", Desc->Footer.Filename));\r
}\r
\r
- if ((Footer->BlockEnd != Block) || (Footer->BlockStart > Footer->BlockEnd)) {\r
+ if ((Desc->BlockEnd != Lba) || (Desc->BlockStart > Desc->BlockEnd)) {\r
return FALSE;\r
}\r
\r
- // Copy the image out\r
- CopyMem (Image, Footer, sizeof (HW_IMAGE_DESCRIPTION));\r
-\r
return TRUE;\r
}\r
\r
BootMonFsDiscoverNextImage (\r
IN BOOTMON_FS_INSTANCE *Instance,\r
IN EFI_LBA *LbaStart,\r
- OUT HW_IMAGE_DESCRIPTION *Image\r
+ OUT HW_IMAGE_DESCRIPTION *ImageDescription\r
)\r
{\r
- EFI_BLOCK_IO_PROTOCOL *Blocks;\r
+ EFI_DISK_IO_PROTOCOL *DiskIo;\r
EFI_LBA CurrentLba;\r
- VOID *Out;\r
+ UINT64 DescOffset;\r
+ EFI_STATUS Status;\r
\r
- Blocks = Instance->BlockIo;\r
+ DiskIo = Instance->DiskIo;\r
\r
- // Allocate an output buffer\r
- Out = AllocatePool (Instance->Media->BlockSize);\r
- if (Out == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Blocks->Reset (Blocks, FALSE);\r
CurrentLba = *LbaStart;\r
\r
// Look for images in the rest of this block\r
while (CurrentLba <= Instance->Media->LastBlock) {\r
- // Read in the next block\r
- Blocks->ReadBlocks (Blocks, Instance->Media->MediaId, CurrentLba, Instance->Media->BlockSize, Out);\r
- // Check for an image in the current block\r
- if (BootMonFsImageInThisBlock (Out, Instance->Media->BlockSize, (CurrentLba - Instance->Media->LowestAlignedLba), Image)) {\r
- DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n", &(Image->Footer.Filename), (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba)));\r
- FreePool (Out);\r
- *LbaStart = Image->BlockEnd + 1;\r
+ // Work out the byte offset into media of the image description in this block\r
+ // If present, the image description is at the very end of the block.\r
+ DescOffset = ((CurrentLba + 1) * Instance->Media->BlockSize) - sizeof (HW_IMAGE_DESCRIPTION);\r
+\r
+ // Read the image description from media\r
+ Status = DiskIo->ReadDisk (DiskIo,\r
+ Instance->Media->MediaId,\r
+ DescOffset,\r
+ sizeof (HW_IMAGE_DESCRIPTION),\r
+ ImageDescription\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
return EFI_SUCCESS;\r
} else {\r
CurrentLba++;\r
}\r
\r
*LbaStart = CurrentLba;\r
- FreePool (Out);\r
return EFI_NOT_FOUND;\r
}\r
\r