]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/BootMonFs: Cache the HW Description address
authorBrendan Jackman <brendan.jackman@arm.com>
Thu, 8 May 2014 15:08:39 +0000 (15:08 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 8 May 2014 15:08:39 +0000 (15:08 +0000)
This fixes a bug whereby the image description is written over file data when
the file's size is close to a multiple of the block size.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brendan Jackman <brendan.jackman@arm.com>
Reviewed-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15517 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsApi.h
ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c
ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsInternal.h
ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsOpenClose.c

index 4f0122e32b8e9e945044b3e4b0cb15eaf1b691a6..9c1daa523bd3c64aed214330c89d0ba1ef8ecece 100644 (file)
 \r
 #include <Protocol/SimpleFileSystem.h>\r
 \r
-EFI_STATUS\r
-BootMonFsDiscoverNextImage (\r
-  IN BOOTMON_FS_INSTANCE      *Flash,\r
-  IN EFI_LBA                  *LbaStart,\r
-  OUT HW_IMAGE_DESCRIPTION    *Image\r
-  );\r
-\r
 EFI_STATUS\r
 BootMonFsInitialize (\r
   IN BOOTMON_FS_INSTANCE *Instance\r
index c362b384f2ceafd54b9b04902575e5692c2412b8..346c360292eb1ec0b65b54f14e9a066814706a9d 100644 (file)
@@ -135,11 +135,12 @@ BootMonFsIsImageValid (
   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
@@ -162,17 +163,21 @@ BootMonFsDiscoverNextImage (
                        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
@@ -202,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
index 8bcbac6433b6ae40e7a62298cd7231476121e666..3167bba00ae830d4b3235db46fef583788754a2e 100644 (file)
@@ -48,6 +48,7 @@ typedef struct {
   LIST_ENTRY            Link;\r
   BOOTMON_FS_INSTANCE   *Instance;\r
 \r
+  UINTN                 HwDescAddress;\r
   HW_IMAGE_DESCRIPTION  HwDescription;\r
 \r
   EFI_FILE_PROTOCOL     File;\r
index 702538971437aa5a31220a40a72aac3216dc3133..6616b4f694f550863a1f9040c14db536bc768dd2 100644 (file)
@@ -29,24 +29,18 @@ InvalidateImageDescription (
   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
@@ -86,7 +80,7 @@ FlushAppendRegion (
 \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
@@ -131,11 +125,14 @@ FlushAppendRegion (
   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
@@ -585,7 +582,6 @@ BootMonFsDelete (
   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
@@ -613,7 +609,6 @@ BootMonFsDelete (
 \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
@@ -624,7 +619,7 @@ BootMonFsDelete (
     }\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