]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c
ArmPlatformPkg: remove ArmPlatformSysConfigLib library class
[mirror_edk2.git] / ArmPlatformPkg / FileSystem / BootMonFs / BootMonFsImages.c
index 7d3e9019039fd3796c06d584ad1f01a5fc677f4a..346c360292eb1ec0b65b54f14e9a066814706a9d 100644 (file)
@@ -89,86 +89,95 @@ BootMonFsComputeFooterChecksum (
 }\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
-    return FALSE;\r
-  }\r
-\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 (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
+STATIC\r
 EFI_STATUS\r
 BootMonFsDiscoverNextImage (\r
-  IN BOOTMON_FS_INSTANCE      *Instance,\r
-  IN EFI_LBA                  *LbaStart,\r
-  OUT HW_IMAGE_DESCRIPTION    *Image\r
+  IN     BOOTMON_FS_INSTANCE      *Instance,\r
+  IN OUT EFI_LBA                  *LbaStart,\r
+  IN OUT BOOTMON_FS_FILE          *File\r
   )\r
 {\r
-  EFI_BLOCK_IO_PROTOCOL *Blocks;\r
+  EFI_DISK_IO_PROTOCOL  *DiskIo;\r
   EFI_LBA                CurrentLba;\r
-  VOID                  *Out;\r
-\r
-  Blocks = Instance->BlockIo;\r
+  UINT64                 DescOffset;\r
+  EFI_STATUS             Status;\r
 \r
-  // Allocate an output buffer\r
-  Out = AllocatePool (Instance->Media->BlockSize);\r
-  if (Out == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
+  DiskIo = Instance->DiskIo;\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
+                       &File->HwDescription\r
+                       );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    // If we found a valid image description...\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
@@ -176,7 +185,6 @@ BootMonFsDiscoverNextImage (
   }\r
 \r
   *LbaStart = CurrentLba;\r
-  FreePool (Out);\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
@@ -199,7 +207,7 @@ BootMonFsInitialize (
       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