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
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
}\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
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
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
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