]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsReadWrite.c
ArmPlatformPkg: remove ArmPlatformSysConfigLib library class
[mirror_edk2.git] / ArmPlatformPkg / FileSystem / BootMonFs / BootMonFsReadWrite.c
index 358332d6582f2bbe3f9fbdf8abda95ed68c024c3..f8124e95ac0cde25c4264605a9ace9862ca31220 100644 (file)
@@ -36,6 +36,7 @@
                                   reported an error while performing the read\r
                                   operation.\r
   @retval  EFI_INVALID_PARAMETER  At least one of the parameters is invalid.\r
+\r
 **/\r
 EFIAPI\r
 EFI_STATUS\r
@@ -53,25 +54,30 @@ BootMonFsReadFile (
   EFI_STATUS            Status;\r
   UINTN                 RemainingFileSize;\r
 \r
-  // Ensure the file has been written in Flash before reading it.\r
-  // This keeps the code simple and avoids having to manage a non-flushed file.\r
-  BootMonFsFlushFile (This);\r
-\r
+  if ((This == NULL)       ||\r
+      (BufferSize == NULL) ||\r
+      (Buffer == NULL)        ) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
   File = BOOTMON_FS_FILE_FROM_FILE_THIS (This);\r
-  if (File == NULL) {\r
+  if (File->Info == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Instance = File->Instance;\r
-  DiskIo = Instance->DiskIo;\r
-  Media = Instance->Media;\r
+  // Ensure the file has been written in Flash before reading it.\r
+  // This keeps the code simple and avoids having to manage a non-flushed file.\r
+  BootMonFsFlushFile (This);\r
+\r
+  Instance  = File->Instance;\r
+  DiskIo    = Instance->DiskIo;\r
+  Media     = Instance->Media;\r
   FileStart = (Media->LowestAlignedLba + File->HwDescription.BlockStart) * Media->BlockSize;\r
 \r
-  if (File->Position >= File->HwDescription.Region[0].Size) {\r
+  if (File->Position >= File->Info->FileSize) {\r
     // The entire file has been read or the position has been\r
     // set past the end of the file.\r
     *BufferSize = 0;\r
-    if (File->Position > File->HwDescription.Region[0].Size) {\r
+    if (File->Position > File->Info->FileSize) {\r
       return EFI_DEVICE_ERROR;\r
     } else {\r
       return EFI_SUCCESS;\r
@@ -79,7 +85,7 @@ BootMonFsReadFile (
   }\r
 \r
   // This driver assumes that the entire file is in region 0.\r
-  RemainingFileSize = File->HwDescription.Region[0].Size - File->Position;\r
+  RemainingFileSize = File->Info->FileSize - File->Position;\r
 \r
   // If read would go past end of file, truncate the read\r
   if (*BufferSize > RemainingFileSize) {\r
@@ -102,7 +108,26 @@ BootMonFsReadFile (
   return Status;\r
 }\r
 \r
-// Inserts an entry into the write chain\r
+/**\r
+  Write data to an open file.\r
+\r
+  The data is not written to the flash yet. It will be written when the file\r
+  will be either read, closed or flushed.\r
+\r
+  @param[in]      This        A pointer to the EFI_FILE_PROTOCOL instance that\r
+                              is the file handle to write data to.\r
+  @param[in out]  BufferSize  On input, the size of the Buffer. On output, the\r
+                              size of the data actually written. In both cases,\r
+                              the size is measured in bytes.\r
+  @param[in]      Buffer      The buffer of data to write.\r
+\r
+  @retval  EFI_SUCCESS            The data was written.\r
+  @retval  EFI_ACCESS_DENIED      The file was opened read only.\r
+  @retval  EFI_OUT_OF_RESOURCES   Unable to allocate the buffer to store the\r
+                                  data to write.\r
+  @retval  EFI_INVALID_PARAMETER  At least one of the parameters is invalid.\r
+\r
+**/\r
 EFIAPI\r
 EFI_STATUS\r
 BootMonFsWriteFile (\r
@@ -114,38 +139,57 @@ BootMonFsWriteFile (
   BOOTMON_FS_FILE         *File;\r
   BOOTMON_FS_FILE_REGION  *Region;\r
 \r
+  if (This == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
   File = BOOTMON_FS_FILE_FROM_FILE_THIS (This);\r
-  if (File == NULL) {\r
+  if (File->Info == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!(File->OpenMode & EFI_FILE_MODE_WRITE)) {\r
+  if (File->OpenMode == EFI_FILE_MODE_READ) {\r
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
   // Allocate and initialize the memory region\r
   Region = (BOOTMON_FS_FILE_REGION*)AllocateZeroPool (sizeof (BOOTMON_FS_FILE_REGION));\r
   if (Region == NULL) {\r
+    *BufferSize = 0;\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Region->Buffer  = AllocateCopyPool (*BufferSize, Buffer);\r
+  Region->Buffer = AllocateCopyPool (*BufferSize, Buffer);\r
   if (Region->Buffer == NULL) {\r
+    *BufferSize = 0;\r
     FreePool (Region);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Region->Size    = *BufferSize;\r
-\r
+  Region->Size   = *BufferSize;\r
   Region->Offset = File->Position;\r
 \r
   InsertTailList (&File->RegionToFlushLink, &Region->Link);\r
 \r
   File->Position += *BufferSize;\r
 \r
+  if (File->Position > File->Info->FileSize) {\r
+    File->Info->FileSize = File->Position;\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Set a file's current position.\r
+\r
+  @param[in]  This      A pointer to the EFI_FILE_PROTOCOL instance that is\r
+                        the file handle to set the requested position on.\r
+  @param[in]  Position  The byte position from the start of the file to set.\r
+\r
+  @retval  EFI_SUCCESS            The position was set.\r
+  @retval  EFI_INVALID_PARAMETER  At least one of the parameters is invalid.\r
+\r
+**/\r
 EFIAPI\r
 EFI_STATUS\r
 BootMonFsSetPosition (\r
@@ -153,33 +197,63 @@ BootMonFsSetPosition (
   IN UINT64             Position\r
   )\r
 {\r
-  BOOTMON_FS_FILE         *File;\r
+  BOOTMON_FS_FILE  *File;\r
 \r
+  if (This == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
   File = BOOTMON_FS_FILE_FROM_FILE_THIS (This);\r
+  if (File->Info == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
+  //\r
   // UEFI Spec section 12.5:\r
   // "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to\r
-  //  be set to the end of the file."\r
+  // be set to the end of the file."\r
+  //\r
   if (Position == 0xFFFFFFFFFFFFFFFF) {\r
-    File->Position = BootMonFsGetImageLength (File);\r
-  } else {\r
-    // NB: Seeking past the end of the file is valid.\r
-    File->Position = Position;\r
+    Position = File->Info->FileSize;\r
   }\r
 \r
+  File->Position = Position;\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Return a file's current position.\r
+\r
+  @param[in]   This      A pointer to the EFI_FILE_PROTOCOL instance that is\r
+                         the file handle to get the current position on.\r
+  @param[out]  Position  The address to return the file's current position value.\r
+\r
+  @retval  EFI_SUCCESS            The position was returned.\r
+  @retval  EFI_INVALID_PARAMETER  At least one of the parameters is invalid.\r
+\r
+**/\r
 EFIAPI\r
 EFI_STATUS\r
 BootMonFsGetPosition (\r
   IN  EFI_FILE_PROTOCOL *This,\r
   OUT UINT64            *Position\r
-  ) {\r
+  )\r
+{\r
   BOOTMON_FS_FILE         *File;\r
 \r
+  if (This == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
   File = BOOTMON_FS_FILE_FROM_FILE_THIS (This);\r
+  if (File->Info == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Position == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   *Position = File->Position;\r
+\r
   return EFI_SUCCESS;\r
 }\r