From 7e05ba1227ee2531cfb156b06f23a28d7ab8ef57 Mon Sep 17 00:00:00 2001 From: Guo Mang Date: Thu, 27 Apr 2017 11:26:47 +0800 Subject: ArmPlatformPkg: Remove unused Package Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Mang --- ArmPlatformPkg/FileSystem/BootMonFs/BootMonFs.inf | 61 -- ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsApi.h | 388 ---------- ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsDir.c | 766 -------------------- .../FileSystem/BootMonFs/BootMonFsEntryPoint.c | 529 -------------- ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsHw.h | 57 -- .../FileSystem/BootMonFs/BootMonFsImages.c | 222 ------ .../FileSystem/BootMonFs/BootMonFsInternal.h | 101 --- .../FileSystem/BootMonFs/BootMonFsOpenClose.c | 795 --------------------- .../FileSystem/BootMonFs/BootMonFsReadWrite.c | 259 ------- .../FileSystem/BootMonFs/BootMonFsUnsupported.c | 37 - 10 files changed, 3215 deletions(-) delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFs.inf delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsApi.h delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsDir.c delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsEntryPoint.c delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsHw.h delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsInternal.h delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsOpenClose.c delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsReadWrite.c delete mode 100644 ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsUnsupported.c (limited to 'ArmPlatformPkg/FileSystem') diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFs.inf b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFs.inf deleted file mode 100644 index b42d205a2b..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFs.inf +++ /dev/null @@ -1,61 +0,0 @@ -#/** @file -# Support for ARM Boot Monitor File System -# -# Copyright (c) 2012-2015, ARM Ltd. All rights reserved.
-# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -#**/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = BootMonFs - FILE_GUID = 7abbc454-f737-4322-931c-b1bb62a01d6f - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - - ENTRY_POINT = BootMonFsEntryPoint - -[Sources] - BootMonFsEntryPoint.c - BootMonFsOpenClose.c - BootMonFsDir.c - BootMonFsImages.c - BootMonFsReadWrite.c - BootMonFsUnsupported.c - -[Packages] - ArmPlatformPkg/ArmPlatformPkg.dec - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - BaseLib - DevicePathLib - MemoryAllocationLib - PrintLib - UefiDriverEntryPoint - UefiLib - -[Guids] - gArmBootMonFsFileInfoGuid - gEfiFileSystemInfoGuid - gEfiFileInfoGuid - gEfiFileSystemVolumeLabelInfoIdGuid - -[Pcd] - gArmPlatformTokenSpaceGuid.PcdBootMonFsSupportedDevicePaths - -[Protocols] - gEfiDiskIoProtocolGuid - gEfiBlockIoProtocolGuid - gEfiSimpleFileSystemProtocolGuid - gEfiDevicePathProtocolGuid - gEfiDevicePathFromTextProtocolGuid - diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsApi.h b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsApi.h deleted file mode 100644 index d690520a0f..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsApi.h +++ /dev/null @@ -1,388 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#ifndef __BOOTMON_FS_API_H -#define __BOOTMON_FS_API_H - -#include - -EFI_STATUS -BootMonFsInitialize ( - IN BOOTMON_FS_INSTANCE *Instance - ); - -UINT32 -BootMonFsChecksum ( - IN VOID *Data, - IN UINT32 Size - ); - -EFI_STATUS -BootMonFsComputeFooterChecksum ( - IN OUT HW_IMAGE_DESCRIPTION *Footer - ); - -EFIAPI -EFI_STATUS -OpenBootMonFsOpenVolume ( - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **Root - ); - -UINT32 -BootMonFsGetImageLength ( - IN BOOTMON_FS_FILE *File - ); - -UINTN -BootMonFsGetPhysicalSize ( - IN BOOTMON_FS_FILE* File - ); - -EFI_STATUS -BootMonFsCreateFile ( - IN BOOTMON_FS_INSTANCE *Instance, - OUT BOOTMON_FS_FILE **File - ); - -EFIAPI -EFI_STATUS -BootMonFsGetInfo ( - IN EFI_FILE_PROTOCOL *This, - IN EFI_GUID *InformationType, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -EFIAPI -EFI_STATUS -BootMonFsReadDirectory ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -EFIAPI -EFI_STATUS -BootMonFsFlushDirectory ( - IN EFI_FILE_PROTOCOL *This - ); - -/** - Flush all modified data associated with a file to a device. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the - file handle to flush. - - @retval EFI_SUCCESS The data was flushed. - @retval EFI_ACCESS_DENIED The file was opened read-only. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_FULL The volume is full. - @retval EFI_OUT_OF_RESOURCES Not enough resources were available to flush the data. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsFlushFile ( - IN EFI_FILE_PROTOCOL *This - ); - -/** - Close a specified file handle. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the file - handle to close. - - @retval EFI_SUCCESS The file was closed. - @retval EFI_INVALID_PARAMETER The parameter "This" is NULL or is not an open - file handle. - -**/ -EFIAPI -EFI_STATUS -BootMonFsCloseFile ( - IN EFI_FILE_PROTOCOL *This - ); - -/** - Open a file on the boot monitor file system. - - The boot monitor file system does not allow for sub-directories. There is only - one directory, the root one. On any attempt to create a directory, the function - returns in error with the EFI_WRITE_PROTECTED error code. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is - the file handle to source location. - @param[out] NewHandle A pointer to the location to return the opened - handle for the new file. - @param[in] FileName The Null-terminated string of the name of the file - to be opened. - @param[in] OpenMode The mode to open the file : Read or Read/Write or - Read/Write/Create - @param[in] Attributes Attributes of the file in case of a file creation - - @retval EFI_SUCCESS The file was open. - @retval EFI_NOT_FOUND The specified file could not be found or the specified - directory in which to create a file could not be found. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_WRITE_PROTECTED Attempt to create a directory. This is not possible - with the Boot Monitor file system. - @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the file. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsOpenFile ( - IN EFI_FILE_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes - ); - -/** - Read data from an open file. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that - is the file handle to read data from. - @param[in out] BufferSize On input, the size of the Buffer. On output, the - amount of data returned in Buffer. In both cases, - the size is measured in bytes. - @param[out] Buffer The buffer into which the data is read. - - @retval EFI_SUCCESS The data was read. - @retval EFI_DEVICE_ERROR On entry, the current file position is - beyond the end of the file, or the device - reported an error while performing the read - operation. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsReadFile ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -EFIAPI -EFI_STATUS -BootMonFsSetDirPosition ( - IN EFI_FILE_PROTOCOL *This, - IN UINT64 Position - ); - -EFIAPI -EFI_STATUS -BootMonFsGetPosition ( - IN EFI_FILE_PROTOCOL *This, - OUT UINT64 *Position - ); - -/** - Write data to an open file. - - The data is not written to the flash yet. It will be written when the file - will be either read, closed or flushed. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that - is the file handle to write data to. - @param[in out] BufferSize On input, the size of the Buffer. On output, the - size of the data actually written. In both cases, - the size is measured in bytes. - @param[in] Buffer The buffer of data to write. - - @retval EFI_SUCCESS The data was written. - @retval EFI_ACCESS_DENIED The file was opened read only. - @retval EFI_OUT_OF_RESOURCES Unable to allocate the buffer to store the - data to write. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsWriteFile ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -EFIAPI -EFI_STATUS -BootMonFsDeleteFail ( - IN EFI_FILE_PROTOCOL *This - ); - -/** - Close and delete a file from the boot monitor file system. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the file - handle to delete. - - @retval EFI_SUCCESS The file was closed and deleted. - @retval EFI_INVALID_PARAMETER The parameter "This" is NULL or is not an open - file handle. - @retval EFI_WARN_DELETE_FAILURE The handle was closed, but the file was not deleted. - -**/ -EFIAPI -EFI_STATUS -BootMonFsDelete ( - IN EFI_FILE_PROTOCOL *This - ); - -/** - Set a file's current position. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is - the file handle to set the requested position on. - @param[in] Position The byte position from the start of the file to set. - - @retval EFI_SUCCESS The position was set. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsSetPosition ( - IN EFI_FILE_PROTOCOL *This, - IN UINT64 Position - ); - -/** - Return a file's current position. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is - the file handle to get the current position on. - @param[out] Position The address to return the file's current position value. - - @retval EFI_SUCCESS The position was returned. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsGetPosition( - IN EFI_FILE_PROTOCOL *This, - OUT UINT64 *Position - ); - -// -// UNSUPPORTED OPERATIONS -// - -EFIAPI -EFI_STATUS -BootMonFsGetPositionUnsupported ( - IN EFI_FILE_PROTOCOL *This, - OUT UINT64 *Position - ); - -/** - Set information about a file or a volume. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that - is the file handle the information is for. - @param[in] InformationType The type identifier for the information being set : - EFI_FILE_INFO_ID or EFI_FILE_SYSTEM_INFO_ID or - EFI_FILE_SYSTEM_VOLUME_LABEL_ID - @param[in] BufferSize The size, in bytes, of Buffer. - @param[in] Buffer A pointer to the data buffer to write. The type of the - data inside the buffer is indicated by InformationType. - - @retval EFI_SUCCESS The information was set. - @retval EFI_UNSUPPORTED The InformationType is not known. - @retval EFI_DEVICE_ERROR The last issued semi-hosting operation failed. - @retval EFI_ACCESS_DENIED An attempt is made to change the name of a file - to a file that is already present. - @retval EFI_ACCESS_DENIED An attempt is being made to change the - EFI_FILE_DIRECTORY Attribute. - @retval EFI_ACCESS_DENIED InformationType is EFI_FILE_INFO_ID and - the file was opened in read-only mode and an - attempt is being made to modify a field other - than Attribute. - @retval EFI_WRITE_PROTECTED An attempt is being made to modify a read-only - attribute. - @retval EFI_BAD_BUFFER_SIZE The size of the buffer is lower than that indicated by - the data inside the buffer. - @retval EFI_OUT_OF_RESOURCES A allocation needed to process the request failed. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsSetInfo ( - IN EFI_FILE_PROTOCOL *This, - IN EFI_GUID *InformationType, - IN UINTN BufferSize, - IN VOID *Buffer - ); - -// -// Directory API -// - -EFI_STATUS -BootMonFsOpenDirectory ( - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN BOOTMON_FS_INSTANCE *Volume - ); - -// -// Internal API -// - -/** - Search for a file given its name coded in Ascii. - - When searching through the files of the volume, if a file is currently not - open, its name was written on the media and is kept in RAM in the - "HwDescription.Footer.Filename[]" field of the file's description. - - If a file is currently open, its name might not have been written on the - media yet, and as the "HwDescription" is a mirror in RAM of what is on the - media the "HwDescription.Footer.Filename[]" might be outdated. In that case, - the up to date name of the file is stored in the "Info" field of the file's - description. - - @param[in] Instance Pointer to the description of the volume in which - the file has to be search for. - @param[in] AsciiFileName Name of the file. - - @param[out] File Pointer to the description of the file if the - file was found. - - @retval EFI_SUCCESS The file was found. - @retval EFI_NOT_FOUND The file was not found. - -**/ -EFI_STATUS -BootMonGetFileFromAsciiFileName ( - IN BOOTMON_FS_INSTANCE *Instance, - IN CHAR8* AsciiFileName, - OUT BOOTMON_FS_FILE **File - ); - -EFI_STATUS -BootMonGetFileFromPosition ( - IN BOOTMON_FS_INSTANCE *Instance, - IN UINTN Position, - OUT BOOTMON_FS_FILE **File - ); - -#endif diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsDir.c b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsDir.c deleted file mode 100644 index 64ea0ec680..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsDir.c +++ /dev/null @@ -1,766 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BootMonFsInternal.h" - -EFIAPI -EFI_STATUS -OpenBootMonFsOpenVolume ( - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **Root - ) -{ - BOOTMON_FS_INSTANCE *Instance; - - Instance = BOOTMON_FS_FROM_FS_THIS (This); - if (Instance == NULL) { - return EFI_DEVICE_ERROR; - } - - Instance->RootFile->Info->Attribute = EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY; - - *Root = &Instance->RootFile->File; - - return EFI_SUCCESS; -} - -UINT32 -BootMonFsGetImageLength ( - IN BOOTMON_FS_FILE *File - ) -{ - UINT32 Index; - UINT32 FileSize; - LIST_ENTRY *RegionToFlushLink; - BOOTMON_FS_FILE_REGION *Region; - - FileSize = 0; - - // Look at all Flash areas to determine file size - for (Index = 0; Index < HW_IMAGE_DESCRIPTION_REGION_MAX; Index++) { - FileSize += File->HwDescription.Region[Index].Size; - } - - // Add the regions that have not been flushed yet - for (RegionToFlushLink = GetFirstNode (&File->RegionToFlushLink); - !IsNull (&File->RegionToFlushLink, RegionToFlushLink); - RegionToFlushLink = GetNextNode (&File->RegionToFlushLink, RegionToFlushLink) - ) - { - Region = (BOOTMON_FS_FILE_REGION*)RegionToFlushLink; - if (Region->Offset + Region->Size > FileSize) { - FileSize += Region->Offset + Region->Size; - } - } - - return FileSize; -} - -UINTN -BootMonFsGetPhysicalSize ( - IN BOOTMON_FS_FILE* File - ) -{ - // Return 0 for files that haven't yet been flushed to media - if (File->HwDescription.RegionCount == 0) { - return 0; - } - - return ((File->HwDescription.BlockEnd - File->HwDescription.BlockStart) + 1 ) - * File->Instance->Media->BlockSize; -} - -EFIAPI -EFI_STATUS -BootMonFsSetDirPosition ( - IN EFI_FILE_PROTOCOL *This, - IN UINT64 Position - ) -{ - BOOTMON_FS_FILE *File; - - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File == NULL) { - return EFI_INVALID_PARAMETER; - } - - // UEFI Spec section 12.5: - // "The seek request for nonzero is not valid on open directories." - if (Position != 0) { - return EFI_UNSUPPORTED; - } - File->Position = Position; - - return EFI_SUCCESS; -} - -EFI_STATUS -BootMonFsOpenDirectory ( - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN BOOTMON_FS_INSTANCE *Volume - ) -{ - ASSERT(0); - - return EFI_UNSUPPORTED; -} - -STATIC -EFI_STATUS -GetFileSystemVolumeLabelInfo ( - IN BOOTMON_FS_INSTANCE *Instance, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - UINTN Size; - EFI_FILE_SYSTEM_VOLUME_LABEL *Label; - EFI_STATUS Status; - - Label = Buffer; - - // Value returned by StrSize includes null terminator. - Size = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL - + StrSize (Instance->FsInfo.VolumeLabel); - - if (*BufferSize >= Size) { - CopyMem (&Label->VolumeLabel, &Instance->FsInfo.VolumeLabel, Size); - Status = EFI_SUCCESS; - } else { - Status = EFI_BUFFER_TOO_SMALL; - } - *BufferSize = Size; - return Status; -} - -// Helper function that calculates a rough "free space" by: -// - Taking the media size -// - Subtracting the sum of all file sizes -// - Subtracting the block size times the number of files -// (To account for the blocks containing the HW_IMAGE_INFO -STATIC -UINT64 -ComputeFreeSpace ( - IN BOOTMON_FS_INSTANCE *Instance - ) -{ - LIST_ENTRY *FileLink; - UINT64 FileSizeSum; - UINT64 MediaSize; - UINTN NumFiles; - EFI_BLOCK_IO_MEDIA *Media; - BOOTMON_FS_FILE *File; - - Media = Instance->BlockIo->Media; - MediaSize = Media->BlockSize * (Media->LastBlock + 1); - - NumFiles = 0; - FileSizeSum = 0; - for (FileLink = GetFirstNode (&Instance->RootFile->Link); - !IsNull (&Instance->RootFile->Link, FileLink); - FileLink = GetNextNode (&Instance->RootFile->Link, FileLink) - ) - { - File = BOOTMON_FS_FILE_FROM_LINK_THIS (FileLink); - FileSizeSum += BootMonFsGetImageLength (File); - - NumFiles++; - } - - return MediaSize - (FileSizeSum + (Media->BlockSize + NumFiles)); -} - -STATIC -EFI_STATUS -GetFilesystemInfo ( - IN BOOTMON_FS_INSTANCE *Instance, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - - if (*BufferSize >= Instance->FsInfo.Size) { - Instance->FsInfo.FreeSpace = ComputeFreeSpace (Instance); - CopyMem (Buffer, &Instance->FsInfo, Instance->FsInfo.Size); - Status = EFI_SUCCESS; - } else { - Status = EFI_BUFFER_TOO_SMALL; - } - - *BufferSize = Instance->FsInfo.Size; - return Status; -} - -STATIC -EFI_STATUS -GetFileInfo ( - IN BOOTMON_FS_INSTANCE *Instance, - IN BOOTMON_FS_FILE *File, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_FILE_INFO *Info; - UINTN ResultSize; - - ResultSize = SIZE_OF_EFI_FILE_INFO + StrSize (File->Info->FileName); - - if (*BufferSize < ResultSize) { - *BufferSize = ResultSize; - return EFI_BUFFER_TOO_SMALL; - } - - Info = Buffer; - - CopyMem (Info, File->Info, ResultSize); - // Size of the information - Info->Size = ResultSize; - - *BufferSize = ResultSize; - - return EFI_SUCCESS; -} - -STATIC -EFI_STATUS -GetBootMonFsFileInfo ( - IN BOOTMON_FS_INSTANCE *Instance, - IN BOOTMON_FS_FILE *File, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - BOOTMON_FS_FILE_INFO *Info; - UINTN ResultSize; - UINTN Index; - - if (File == Instance->RootFile) { - Status = EFI_UNSUPPORTED; - } else { - ResultSize = SIZE_OF_BOOTMON_FS_FILE_INFO; - - if (*BufferSize < ResultSize) { - *BufferSize = ResultSize; - Status = EFI_BUFFER_TOO_SMALL; - } else { - Info = Buffer; - - // Zero out the structure - ZeroMem (Info, ResultSize); - - // Fill in the structure - Info->Size = ResultSize; - - Info->EntryPoint = File->HwDescription.EntryPoint; - Info->RegionCount = File->HwDescription.RegionCount; - for (Index = 0; Index < File->HwDescription.RegionCount; Index++) { - Info->Region[Index].LoadAddress = File->HwDescription.Region[Index].LoadAddress; - Info->Region[Index].Size = File->HwDescription.Region[Index].Size; - Info->Region[Index].Offset = File->HwDescription.Region[Index].Offset; - Info->Region[Index].Checksum = File->HwDescription.Region[Index].Checksum; - } - *BufferSize = ResultSize; - Status = EFI_SUCCESS; - } - } - - return Status; -} - -/** - Set the name of a file. - - This is a helper function for SetFileInfo(). - - @param[in] Instance A pointer to the description of the volume - the file belongs to. - @param[in] File A pointer to the description of the file. - @param[in] FileName A pointer to the new name of the file. - - @retval EFI_SUCCESS The name was set. - @retval EFI_ACCESS_DENIED An attempt is made to change the name of a file - to a file that is already present. - -**/ -STATIC -EFI_STATUS -SetFileName ( - IN BOOTMON_FS_INSTANCE *Instance, - IN BOOTMON_FS_FILE *File, - IN CONST CHAR16 *FileName - ) -{ - CHAR8 AsciiFileName[MAX_NAME_LENGTH]; - BOOTMON_FS_FILE *SameFile; - - // If the file path start with a \ strip it. The EFI Shell may - // insert a \ in front of the file name. - if (FileName[0] == L'\\') { - FileName++; - } - - UnicodeStrToAsciiStrS (FileName, AsciiFileName, MAX_NAME_LENGTH); - - if (BootMonGetFileFromAsciiFileName ( - File->Instance, - AsciiFileName, - &SameFile - ) != EFI_NOT_FOUND) { - // A file with that name already exists. - return EFI_ACCESS_DENIED; - } else { - // OK, change the filename. - AsciiStrToUnicodeStrS (AsciiFileName, File->Info->FileName, - (File->Info->Size - SIZE_OF_EFI_FILE_INFO) / sizeof (CHAR16)); - return EFI_SUCCESS; - } -} - -/** - Set the size of a file. - - This is a helper function for SetFileInfo(). - - @param[in] Instance A pointer to the description of the volume - the file belongs to. - @param[in] File A pointer to the description of the file. - @param[in] NewSize The requested new size for the file. - - @retval EFI_SUCCESS The size was set. - @retval EFI_OUT_OF_RESOURCES An allocation needed to process the request failed. - -**/ -STATIC -EFI_STATUS -SetFileSize ( - IN BOOTMON_FS_INSTANCE *Instance, - IN BOOTMON_FS_FILE *BootMonFsFile, - IN UINTN NewSize - ) -{ - EFI_STATUS Status; - UINT32 OldSize; - LIST_ENTRY *RegionToFlushLink; - LIST_ENTRY *NextRegionToFlushLink; - BOOTMON_FS_FILE_REGION *Region; - EFI_FILE_PROTOCOL *File; - CHAR8 *Buffer; - UINTN BufferSize; - UINT64 StoredPosition; - - OldSize = BootMonFsFile->Info->FileSize; - - // - // In case of file truncation, force the regions waiting for writing to - // not overflow the new size of the file. - // - if (NewSize < OldSize) { - for (RegionToFlushLink = GetFirstNode (&BootMonFsFile->RegionToFlushLink); - !IsNull (&BootMonFsFile->RegionToFlushLink, RegionToFlushLink); - ) - { - NextRegionToFlushLink = GetNextNode (&BootMonFsFile->RegionToFlushLink, RegionToFlushLink); - Region = (BOOTMON_FS_FILE_REGION*)RegionToFlushLink; - if (Region->Offset > NewSize) { - RemoveEntryList (RegionToFlushLink); - FreePool (Region->Buffer); - FreePool (Region); - } else { - Region->Size = MIN (Region->Size, NewSize - Region->Offset); - } - RegionToFlushLink = NextRegionToFlushLink; - } - - } else if (NewSize > OldSize) { - // Increasing a file's size is potentially complicated as it may require - // moving the image description on media. The simplest way to do it is to - // seek past the end of the file (which is valid in UEFI) and perform a - // Write. - File = &BootMonFsFile->File; - - // Save position - Status = File->GetPosition (File, &StoredPosition); - if (EFI_ERROR (Status)) { - return Status; - } - // Set position at the end of the file - Status = File->SetPosition (File, OldSize); - if (EFI_ERROR (Status)) { - return Status; - } - - BufferSize = NewSize - OldSize; - Buffer = AllocateZeroPool (BufferSize); - if (Buffer == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = File->Write (File, &BufferSize, Buffer); - FreePool (Buffer); - if (EFI_ERROR (Status)) { - return Status; - } - - // Restore saved position - Status = File->SetPosition (File, StoredPosition); - if (EFI_ERROR (Status)) { - return Status; - } - } - - BootMonFsFile->Info->FileSize = NewSize; - - return EFI_SUCCESS; -} - -/** - Set information about a file. - - @param[in] Instance A pointer to the description of the volume - the file belongs to. - @param[in] File A pointer to the description of the file. - @param[in] Info A pointer to the file information to write. - - @retval EFI_SUCCESS The information was set. - @retval EFI_ACCESS_DENIED An attempt is being made to change the - EFI_FILE_DIRECTORY Attribute. - @retval EFI_ACCESS_DENIED The file was opened in read-only mode and an - attempt is being made to modify a field other - than Attribute. - @retval EFI_ACCESS_DENIED An attempt is made to change the name of a file - to a file that is already present. - @retval EFI_WRITE_PROTECTED An attempt is being made to modify a read-only - attribute. - @retval EFI_OUT_OF_RESOURCES An allocation needed to process the request - failed. - -**/ -STATIC -EFI_STATUS -SetFileInfo ( - IN BOOTMON_FS_INSTANCE *Instance, - IN BOOTMON_FS_FILE *File, - IN EFI_FILE_INFO *Info - ) -{ - EFI_STATUS Status; - BOOLEAN FileSizeIsDifferent; - BOOLEAN FileNameIsDifferent; - BOOLEAN TimeIsDifferent; - - // - // A directory can not be changed to a file and a file can - // not be changed to a directory. - // - if ((Info->Attribute & EFI_FILE_DIRECTORY) != - (File->Info->Attribute & EFI_FILE_DIRECTORY) ) { - return EFI_ACCESS_DENIED; - } - - FileSizeIsDifferent = (Info->FileSize != File->Info->FileSize); - FileNameIsDifferent = (StrnCmp ( - Info->FileName, - File->Info->FileName, - MAX_NAME_LENGTH - 1 - ) != 0); - // - // Check if the CreateTime, LastAccess or ModificationTime - // have been changed. The file system does not support file - // timestamps thus the three times in "File->Info" are - // always equal to zero. The following comparison actually - // checks if all three times are still equal to 0 or not. - // - TimeIsDifferent = CompareMem ( - &Info->CreateTime, - &File->Info->CreateTime, - 3 * sizeof (EFI_TIME) - ) != 0; - - // - // For a file opened in read-only mode, only the Attribute field can be - // modified. The root directory open mode is forced to read-only at opening - // thus the following test protects the root directory to be somehow modified. - // - if (File->OpenMode == EFI_FILE_MODE_READ) { - if (FileSizeIsDifferent || FileNameIsDifferent || TimeIsDifferent) { - return EFI_ACCESS_DENIED; - } - } - - if (TimeIsDifferent) { - return EFI_WRITE_PROTECTED; - } - - if (FileSizeIsDifferent) { - Status = SetFileSize (Instance, File, Info->FileSize); - if (EFI_ERROR (Status)) { - return Status; - } - } - - // - // Note down in RAM the Attribute field but we can not - // ask to store it in flash for the time being. - // - File->Info->Attribute = Info->Attribute; - - if (FileNameIsDifferent) { - Status = SetFileName (Instance, File, Info->FileName); - if (EFI_ERROR (Status)) { - return Status; - } - } - - return EFI_SUCCESS; -} - -EFIAPI -EFI_STATUS -BootMonFsGetInfo ( - IN EFI_FILE_PROTOCOL *This, - IN EFI_GUID *InformationType, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - BOOTMON_FS_FILE *File; - BOOTMON_FS_INSTANCE *Instance; - - if ((This == NULL) || - (InformationType == NULL) || - (BufferSize == NULL) || - ((Buffer == NULL) && (*BufferSize > 0)) ) { - return EFI_INVALID_PARAMETER; - } - - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - Instance = File->Instance; - - // If the instance has not been initialized yet then do it ... - if (!Instance->Initialized) { - Status = BootMonFsInitialize (Instance); - } else { - Status = EFI_SUCCESS; - } - - if (!EFI_ERROR (Status)) { - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid) - != 0) { - Status = GetFileSystemVolumeLabelInfo (Instance, BufferSize, Buffer); - } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid) != 0) { - Status = GetFilesystemInfo (Instance, BufferSize, Buffer); - } else if (CompareGuid (InformationType, &gEfiFileInfoGuid) != 0) { - Status = GetFileInfo (Instance, File, BufferSize, Buffer); - } else if (CompareGuid (InformationType, &gArmBootMonFsFileInfoGuid) != 0) { - Status = GetBootMonFsFileInfo (Instance, File, BufferSize, Buffer); - } else { - Status = EFI_UNSUPPORTED; - } - } - - return Status; -} - -/** - Set information about a file or a volume. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that - is the file handle the information is for. - @param[in] InformationType The type identifier for the information being set : - EFI_FILE_INFO_ID or EFI_FILE_SYSTEM_INFO_ID or - EFI_FILE_SYSTEM_VOLUME_LABEL_ID - @param[in] BufferSize The size, in bytes, of Buffer. - @param[in] Buffer A pointer to the data buffer to write. The type of the - data inside the buffer is indicated by InformationType. - - @retval EFI_SUCCESS The information was set. - @retval EFI_UNSUPPORTED The InformationType is not known. - @retval EFI_DEVICE_ERROR The last issued semi-hosting operation failed. - @retval EFI_ACCESS_DENIED An attempt is made to change the name of a file - to a file that is already present. - @retval EFI_ACCESS_DENIED An attempt is being made to change the - EFI_FILE_DIRECTORY Attribute. - @retval EFI_ACCESS_DENIED InformationType is EFI_FILE_INFO_ID and - the file was opened in read-only mode and an - attempt is being made to modify a field other - than Attribute. - @retval EFI_WRITE_PROTECTED An attempt is being made to modify a read-only - attribute. - @retval EFI_BAD_BUFFER_SIZE The size of the buffer is lower than that indicated by - the data inside the buffer. - @retval EFI_OUT_OF_RESOURCES A allocation needed to process the request failed. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsSetInfo ( - IN EFI_FILE_PROTOCOL *This, - IN EFI_GUID *InformationType, - IN UINTN BufferSize, - IN VOID *Buffer - ) -{ - BOOTMON_FS_FILE *File; - EFI_FILE_INFO *Info; - EFI_FILE_SYSTEM_INFO *SystemInfo; - - if ((This == NULL) || - (InformationType == NULL) || - (Buffer == NULL) ) { - return EFI_INVALID_PARAMETER; - } - - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { - Info = Buffer; - if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) { - return EFI_INVALID_PARAMETER; - } - if (BufferSize < Info->Size) { - return EFI_BAD_BUFFER_SIZE; - } - return (SetFileInfo (File->Instance, File, Info)); - } - - // - // The only writable field in the other two information types - // (i.e. EFI_FILE_SYSTEM_INFO and EFI_FILE_SYSTEM_VOLUME_LABEL) is the - // filesystem volume label. This can be retrieved with GetInfo, but it is - // hard-coded into this driver, not stored on media. - // - - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - SystemInfo = Buffer; - if (SystemInfo->Size < - (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) { - return EFI_INVALID_PARAMETER; - } - if (BufferSize < SystemInfo->Size) { - return EFI_BAD_BUFFER_SIZE; - } - return EFI_WRITE_PROTECTED; - } - - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { - return EFI_WRITE_PROTECTED; - } - - return EFI_UNSUPPORTED; -} - -EFIAPI -EFI_STATUS -BootMonFsReadDirectory ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - BOOTMON_FS_INSTANCE *Instance; - BOOTMON_FS_FILE *RootFile; - BOOTMON_FS_FILE *File; - EFI_FILE_INFO *Info; - UINTN NameSize; - UINTN ResultSize; - EFI_STATUS Status; - UINTN Index; - - RootFile = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (RootFile == NULL) { - return EFI_INVALID_PARAMETER; - } - - Instance = RootFile->Instance; - Status = BootMonGetFileFromPosition (Instance, RootFile->Position, &File); - if (EFI_ERROR (Status)) { - // No more file - *BufferSize = 0; - return EFI_SUCCESS; - } - - NameSize = AsciiStrLen (File->HwDescription.Footer.Filename) + 1; - ResultSize = SIZE_OF_EFI_FILE_INFO + (NameSize * sizeof (CHAR16)); - if (*BufferSize < ResultSize) { - *BufferSize = ResultSize; - return EFI_BUFFER_TOO_SMALL; - } - - // Zero out the structure - Info = Buffer; - ZeroMem (Info, ResultSize); - - // Fill in the structure - Info->Size = ResultSize; - Info->FileSize = BootMonFsGetImageLength (File); - Info->PhysicalSize = BootMonFsGetPhysicalSize (File); - for (Index = 0; Index < NameSize; Index++) { - Info->FileName[Index] = File->HwDescription.Footer.Filename[Index]; - } - - *BufferSize = ResultSize; - RootFile->Position++; - - return EFI_SUCCESS; -} - -EFIAPI -EFI_STATUS -BootMonFsFlushDirectory ( - IN EFI_FILE_PROTOCOL *This - ) -{ - BOOTMON_FS_FILE *RootFile; - LIST_ENTRY *ListFiles; - LIST_ENTRY *Link; - BOOTMON_FS_FILE *File; - - RootFile = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (RootFile == NULL) { - return EFI_INVALID_PARAMETER; - } - - ListFiles = &RootFile->Link; - - if (IsListEmpty (ListFiles)) { - return EFI_SUCCESS; - } - - // - // Flush all the files that need to be flushed - // - - // Go through all the list of files to flush them - for (Link = GetFirstNode (ListFiles); - !IsNull (ListFiles, Link); - Link = GetNextNode (ListFiles, Link) - ) - { - File = BOOTMON_FS_FILE_FROM_LINK_THIS (Link); - File->File.Flush (&File->File); - } - - return EFI_SUCCESS; -} diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsEntryPoint.c b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsEntryPoint.c deleted file mode 100644 index a1150856f6..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsEntryPoint.c +++ /dev/null @@ -1,529 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include -#include -#include -#include -#include - -#include -#include - -#include "BootMonFsInternal.h" - -EFI_DEVICE_PATH* mBootMonFsSupportedDevicePaths; -LIST_ENTRY mInstances; - -EFI_FILE_PROTOCOL mBootMonFsRootTemplate = { - EFI_FILE_PROTOCOL_REVISION, - BootMonFsOpenFile, - BootMonFsCloseFile, - BootMonFsDeleteFail, - BootMonFsReadDirectory, - BootMonFsWriteFile, - BootMonFsGetPositionUnsupported, // UEFI Spec: GetPosition not valid on dirs - BootMonFsSetDirPosition, - BootMonFsGetInfo, - BootMonFsSetInfo, - BootMonFsFlushDirectory -}; - -EFI_FILE_PROTOCOL mBootMonFsFileTemplate = { - EFI_FILE_PROTOCOL_REVISION, - BootMonFsOpenFile, - BootMonFsCloseFile, - BootMonFsDelete, - BootMonFsReadFile, - BootMonFsWriteFile, - BootMonFsGetPosition, - BootMonFsSetPosition, - BootMonFsGetInfo, - BootMonFsSetInfo, - BootMonFsFlushFile -}; - -/** - Search for a file given its name coded in Ascii. - - When searching through the files of the volume, if a file is currently not - open, its name was written on the media and is kept in RAM in the - "HwDescription.Footer.Filename[]" field of the file's description. - - If a file is currently open, its name might not have been written on the - media yet, and as the "HwDescription" is a mirror in RAM of what is on the - media the "HwDescription.Footer.Filename[]" might be outdated. In that case, - the up to date name of the file is stored in the "Info" field of the file's - description. - - @param[in] Instance Pointer to the description of the volume in which - the file has to be search for. - @param[in] AsciiFileName Name of the file. - - @param[out] File Pointer to the description of the file if the - file was found. - - @retval EFI_SUCCESS The file was found. - @retval EFI_NOT_FOUND The file was not found. - -**/ -EFI_STATUS -BootMonGetFileFromAsciiFileName ( - IN BOOTMON_FS_INSTANCE *Instance, - IN CHAR8* AsciiFileName, - OUT BOOTMON_FS_FILE **File - ) -{ - LIST_ENTRY *Entry; - BOOTMON_FS_FILE *FileEntry; - CHAR8 OpenFileAsciiFileName[MAX_NAME_LENGTH]; - CHAR8 *AsciiFileNameToCompare; - - // Go through all the files in the list and return the file handle - for (Entry = GetFirstNode (&Instance->RootFile->Link); - !IsNull (&Instance->RootFile->Link, Entry); - Entry = GetNextNode (&Instance->RootFile->Link, Entry) - ) - { - FileEntry = BOOTMON_FS_FILE_FROM_LINK_THIS (Entry); - if (FileEntry->Info != NULL) { - UnicodeStrToAsciiStrS (FileEntry->Info->FileName, OpenFileAsciiFileName, - MAX_NAME_LENGTH); - AsciiFileNameToCompare = OpenFileAsciiFileName; - } else { - AsciiFileNameToCompare = FileEntry->HwDescription.Footer.Filename; - } - - if (AsciiStrCmp (AsciiFileNameToCompare, AsciiFileName) == 0) { - *File = FileEntry; - return EFI_SUCCESS; - } - } - return EFI_NOT_FOUND; -} - -EFI_STATUS -BootMonGetFileFromPosition ( - IN BOOTMON_FS_INSTANCE *Instance, - IN UINTN Position, - OUT BOOTMON_FS_FILE **File - ) -{ - LIST_ENTRY *Entry; - BOOTMON_FS_FILE *FileEntry; - - // Go through all the files in the list and return the file handle - for (Entry = GetFirstNode (&Instance->RootFile->Link); - !IsNull (&Instance->RootFile->Link, Entry) && (&Instance->RootFile->Link != Entry); - Entry = GetNextNode (&Instance->RootFile->Link, Entry) - ) - { - if (Position == 0) { - FileEntry = BOOTMON_FS_FILE_FROM_LINK_THIS (Entry); - *File = FileEntry; - return EFI_SUCCESS; - } - Position--; - } - return EFI_NOT_FOUND; -} - -EFI_STATUS -BootMonFsCreateFile ( - IN BOOTMON_FS_INSTANCE *Instance, - OUT BOOTMON_FS_FILE **File - ) -{ - BOOTMON_FS_FILE *NewFile; - - NewFile = (BOOTMON_FS_FILE*)AllocateZeroPool (sizeof (BOOTMON_FS_FILE)); - if (NewFile == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - NewFile->Signature = BOOTMON_FS_FILE_SIGNATURE; - InitializeListHead (&NewFile->Link); - InitializeListHead (&NewFile->RegionToFlushLink); - NewFile->Instance = Instance; - - // If the created file is the root file then create a directory EFI_FILE_PROTOCOL - if (Instance->RootFile == *File) { - CopyMem (&NewFile->File, &mBootMonFsRootTemplate, sizeof (mBootMonFsRootTemplate)); - } else { - CopyMem (&NewFile->File, &mBootMonFsFileTemplate, sizeof (mBootMonFsFileTemplate)); - } - *File = NewFile; - return EFI_SUCCESS; -} - -STATIC -EFI_STATUS -SupportedDevicePathsInit ( - VOID - ) -{ - EFI_STATUS Status; - CHAR16* DevicePathListStr; - CHAR16* DevicePathStr; - CHAR16* NextDevicePathStr; - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; - EFI_DEVICE_PATH_PROTOCOL *Instance; - - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); - ASSERT_EFI_ERROR (Status); - - // Initialize Variable - DevicePathListStr = (CHAR16*)PcdGetPtr (PcdBootMonFsSupportedDevicePaths); - mBootMonFsSupportedDevicePaths = NULL; - - // Extract the Device Path instances from the multi-device path string - while ((DevicePathListStr != NULL) && (DevicePathListStr[0] != L'\0')) { - NextDevicePathStr = StrStr (DevicePathListStr, L";"); - if (NextDevicePathStr == NULL) { - DevicePathStr = DevicePathListStr; - DevicePathListStr = NULL; - } else { - DevicePathStr = (CHAR16*)AllocateCopyPool ((NextDevicePathStr - DevicePathListStr + 1) * sizeof (CHAR16), DevicePathListStr); - if (DevicePathStr == NULL) { - return EFI_OUT_OF_RESOURCES; - } - *(DevicePathStr + (NextDevicePathStr - DevicePathListStr)) = L'\0'; - DevicePathListStr = NextDevicePathStr; - if (DevicePathListStr[0] == L';') { - DevicePathListStr++; - } - } - - Instance = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (DevicePathStr); - ASSERT (Instance != NULL); - mBootMonFsSupportedDevicePaths = AppendDevicePathInstance (mBootMonFsSupportedDevicePaths, Instance); - - if (NextDevicePathStr != NULL) { - FreePool (DevicePathStr); - } - FreePool (Instance); - } - - if (mBootMonFsSupportedDevicePaths == NULL) { - return EFI_UNSUPPORTED; - } else { - return EFI_SUCCESS; - } -} - -EFI_STATUS -EFIAPI -BootMonFsDriverSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL - ) -{ - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_DEVICE_PATH_PROTOCOL *DevicePathProtocol; - EFI_DEVICE_PATH_PROTOCOL *SupportedDevicePath; - EFI_DEVICE_PATH_PROTOCOL *SupportedDevicePaths; - EFI_STATUS Status; - UINTN Size1; - UINTN Size2; - - // - // Open the IO Abstraction(s) needed to perform the supported test - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - (VOID **) &DiskIo, - gImageHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (EFI_ERROR (Status)) { - return Status; - } - // - // Close the I/O Abstraction(s) used to perform the supported test - // - gBS->CloseProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - gImageHandle, - ControllerHandle - ); - - // Check that BlockIo protocol instance exists - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiBlockIoProtocolGuid, - NULL, - gImageHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // Check if a DevicePath is attached to the handle - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePathProtocol, - gImageHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // Check if the Device Path is the one which contains the Boot Monitor File System - Size1 = GetDevicePathSize (DevicePathProtocol); - - // Go through the list of Device Path Instances - Status = EFI_UNSUPPORTED; - SupportedDevicePaths = mBootMonFsSupportedDevicePaths; - while (SupportedDevicePaths != NULL) { - SupportedDevicePath = GetNextDevicePathInstance (&SupportedDevicePaths, &Size2); - - if ((Size1 == Size2) && (CompareMem (DevicePathProtocol, SupportedDevicePath, Size1) == 0)) { - // The Device Path is supported - Status = EFI_SUCCESS; - break; - } - } - - gBS->CloseProtocol (ControllerHandle, &gEfiDevicePathProtocolGuid, gImageHandle, ControllerHandle); - return Status; -} - -EFI_STATUS -EFIAPI -BootMonFsDriverStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL - ) -{ - BOOTMON_FS_INSTANCE *Instance; - EFI_STATUS Status; - UINTN VolumeNameSize; - EFI_FILE_INFO *Info; - - Instance = AllocateZeroPool (sizeof (BOOTMON_FS_INSTANCE)); - if (Instance == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // Initialize the BlockIo of the Instance - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiBlockIoProtocolGuid, - (VOID **)&(Instance->BlockIo), - gImageHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - (VOID **)&(Instance->DiskIo), - gImageHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - // - // Initialize the attributes of the Instance - // - Instance->Signature = BOOTMON_FS_SIGNATURE; - Instance->ControllerHandle = ControllerHandle; - Instance->Media = Instance->BlockIo->Media; - Instance->Binding = DriverBinding; - - // Initialize the Simple File System Protocol - Instance->Fs.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION; - Instance->Fs.OpenVolume = OpenBootMonFsOpenVolume; - - // Volume name + L' ' + '2' digit number - VolumeNameSize = StrSize (BOOTMON_FS_VOLUME_LABEL) + (3 * sizeof (CHAR16)); - - // Initialize FileSystem Information - Instance->FsInfo.Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + VolumeNameSize; - Instance->FsInfo.BlockSize = Instance->Media->BlockSize; - Instance->FsInfo.ReadOnly = FALSE; - Instance->FsInfo.VolumeSize = - Instance->Media->BlockSize * (Instance->Media->LastBlock - Instance->Media->LowestAlignedLba); - CopyMem (Instance->FsInfo.VolumeLabel, BOOTMON_FS_VOLUME_LABEL, StrSize (BOOTMON_FS_VOLUME_LABEL)); - - // Initialize the root file - Status = BootMonFsCreateFile (Instance, &Instance->RootFile); - if (EFI_ERROR (Status)) { - goto Error; - } - - Info = AllocateZeroPool (sizeof (EFI_FILE_INFO)); - if (Info == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Error; - } - Instance->RootFile->Info = Info; - - // Initialize the DevicePath of the Instance - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDevicePathProtocolGuid, - (VOID **)&(Instance->DevicePath), - gImageHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - // - // Install the Simple File System Protocol - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &ControllerHandle, - &gEfiSimpleFileSystemProtocolGuid, &Instance->Fs, - NULL - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - InsertTailList (&mInstances, &Instance->Link); - - return EFI_SUCCESS; - -Error: - - if (Instance->RootFile != NULL) { - if (Instance->RootFile->Info != NULL) { - FreePool (Instance->RootFile->Info); - } - FreePool (Instance->RootFile); - } - FreePool (Instance); - - return Status; -} - - -EFI_STATUS -EFIAPI -BootMonFsDriverStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL - ) -{ - BOOTMON_FS_INSTANCE *Instance; - LIST_ENTRY *Link; - EFI_STATUS Status; - BOOLEAN InstanceFound; - - // Find instance from ControllerHandle. - Instance = NULL; - InstanceFound = FALSE; - // For each instance in mInstances: - for (Link = GetFirstNode (&mInstances); !IsNull (&mInstances, Link); Link = GetNextNode (&mInstances, Link)) { - Instance = BOOTMON_FS_FROM_LINK (Link); - - if (Instance->ControllerHandle == ControllerHandle) { - InstanceFound = TRUE; - break; - } - } - ASSERT (InstanceFound == TRUE); - - gBS->CloseProtocol ( - ControllerHandle, - &gEfiDevicePathProtocolGuid, - DriverBinding->ImageHandle, - ControllerHandle); - - gBS->CloseProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - DriverBinding->ImageHandle, - ControllerHandle); - - gBS->CloseProtocol ( - ControllerHandle, - &gEfiBlockIoProtocolGuid, - DriverBinding->ImageHandle, - ControllerHandle); - - Status = gBS->UninstallMultipleProtocolInterfaces ( - &ControllerHandle, - &gEfiSimpleFileSystemProtocolGuid, &Instance->Fs, - NULL); - - FreePool (Instance->RootFile->Info); - FreePool (Instance->RootFile); - FreePool (Instance); - - return Status; -} - -// -// Simple Network Protocol Driver Global Variables -// -EFI_DRIVER_BINDING_PROTOCOL mBootMonFsDriverBinding = { - BootMonFsDriverSupported, - BootMonFsDriverStart, - BootMonFsDriverStop, - 0xa, - NULL, - NULL -}; - -EFI_STATUS -EFIAPI -BootMonFsEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - InitializeListHead (&mInstances); - - // Initialize the list of Device Paths that could support BootMonFs - Status = SupportedDevicePathsInit (); - if (!EFI_ERROR (Status)) { - Status = gBS->InstallMultipleProtocolInterfaces ( - &ImageHandle, - &gEfiDriverBindingProtocolGuid, &mBootMonFsDriverBinding, - NULL - ); - ASSERT_EFI_ERROR (Status); - } else { - DEBUG((EFI_D_ERROR,"Warning: No Device Paths supporting BootMonFs have been defined in the PCD.\n")); - } - - return Status; -} diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsHw.h b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsHw.h deleted file mode 100644 index c1bef755ae..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsHw.h +++ /dev/null @@ -1,57 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#ifndef __BOOTMON_FS_HW_H__ -#define __BOOTMON_FS_HW_H__ - -#define MAX_NAME_LENGTH 32 - -#define HW_IMAGE_FOOTER_SIGNATURE_1 0x464C5348 -#define HW_IMAGE_FOOTER_SIGNATURE_2 0x464F4F54 - -#define HW_IMAGE_FOOTER_VERSION 1 -#define HW_IMAGE_FOOTER_OFFSET 92 - -#define HW_IMAGE_FOOTER_VERSION2 2 -#define HW_IMAGE_FOOTER_OFFSET2 96 - -typedef struct { - CHAR8 Filename[MAX_NAME_LENGTH]; - UINT32 Offset; - UINT32 Version; - UINT32 FooterSignature1; - UINT32 FooterSignature2; -} HW_IMAGE_FOOTER; - -#define HW_IMAGE_DESCRIPTION_REGION_MAX 4 - -// This structure is located at the end of a block when a file is present -typedef struct { - UINT32 EntryPoint; - UINT32 Attributes; - UINT32 RegionCount; - struct { - UINT32 LoadAddress; - UINT32 Size; - UINT32 Offset; - UINT32 Checksum; - } Region[HW_IMAGE_DESCRIPTION_REGION_MAX]; - UINT32 BlockStart; - UINT32 BlockEnd; - UINT32 FooterChecksum; - - HW_IMAGE_FOOTER Footer; -} HW_IMAGE_DESCRIPTION; - -#endif diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c deleted file mode 100644 index 346c360292..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c +++ /dev/null @@ -1,222 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include -#include -#include -#include - -#include - -#include "BootMonFsInternal.h" - -UINT32 -BootMonFsChecksum ( - IN VOID *Data, - IN UINT32 Size - ) -{ - UINT32 *Ptr; - UINT32 Word; - UINT32 Checksum; - - ASSERT (Size % 4 == 0); - - Checksum = 0; - Ptr = (UINT32*)Data; - - while (Size > 0) { - Word = *Ptr++; - Size -= 4; - - if (Word > ~Checksum) { - Checksum++; - } - - Checksum += Word; - } - - return ~Checksum; -} - -EFI_STATUS -BootMonFsComputeFooterChecksum ( - IN OUT HW_IMAGE_DESCRIPTION *Footer - ) -{ - HW_IMAGE_DESCRIPTION *Description; - UINT32 Index; - - Footer->Attributes = 1; - - Description = AllocateZeroPool (sizeof (HW_IMAGE_DESCRIPTION)); - if (Description == NULL) { - DEBUG ((DEBUG_ERROR, "BootMonFsComputeFooterChecksum: Unable to allocate memory.\n")); - return EFI_OUT_OF_RESOURCES; - } - - // Copy over to temporary shim - CopyMem (Description, Footer, sizeof (HW_IMAGE_DESCRIPTION)); - - // BootMon doesn't checksum the previous checksum - Description->FooterChecksum = 0; - - // Blank out regions which aren't being used. - for (Index = Footer->RegionCount; Index < HW_IMAGE_DESCRIPTION_REGION_MAX; Index++) { - Description->Region[Index].Checksum = 0; - Description->Region[Index].LoadAddress = 0; - Description->Region[Index].Offset = 0; - Description->Region[Index].Size = 0; - } - - // Compute the checksum - Footer->FooterChecksum = BootMonFsChecksum (Description, sizeof (HW_IMAGE_DESCRIPTION)); - - FreePool (Description); - - return EFI_SUCCESS; -} - -BOOLEAN -BootMonFsIsImageValid ( - IN HW_IMAGE_DESCRIPTION *Desc, - IN EFI_LBA Lba - ) -{ - EFI_STATUS Status; - HW_IMAGE_FOOTER *Footer; - UINT32 Checksum; - - Footer = &Desc->Footer; - - // Check that the verification bytes are present - if ((Footer->FooterSignature1 != HW_IMAGE_FOOTER_SIGNATURE_1) || - (Footer->FooterSignature2 != HW_IMAGE_FOOTER_SIGNATURE_2)) { - return FALSE; - } - - if (Footer->Version == HW_IMAGE_FOOTER_VERSION) { - if (Footer->Offset != HW_IMAGE_FOOTER_OFFSET) { - return FALSE; - } - } else if (Footer->Version == HW_IMAGE_FOOTER_VERSION2) { - if (Footer->Offset != HW_IMAGE_FOOTER_OFFSET2) { - return FALSE; - } - } else { - return FALSE; - } - - Checksum = Desc->FooterChecksum; - Status = BootMonFsComputeFooterChecksum (Desc); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Warning: failed to compute checksum for image '%a'\n", Desc->Footer.Filename)); - } - - if (Desc->FooterChecksum != Checksum) { - DEBUG ((DEBUG_ERROR, "Warning: image '%a' checksum mismatch.\n", Desc->Footer.Filename)); - } - - if ((Desc->BlockEnd != Lba) || (Desc->BlockStart > Desc->BlockEnd)) { - return FALSE; - } - - return TRUE; -} - -STATIC -EFI_STATUS -BootMonFsDiscoverNextImage ( - IN BOOTMON_FS_INSTANCE *Instance, - IN OUT EFI_LBA *LbaStart, - IN OUT BOOTMON_FS_FILE *File - ) -{ - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_LBA CurrentLba; - UINT64 DescOffset; - EFI_STATUS Status; - - DiskIo = Instance->DiskIo; - - CurrentLba = *LbaStart; - - // Look for images in the rest of this block - while (CurrentLba <= Instance->Media->LastBlock) { - // Work out the byte offset into media of the image description in this block - // If present, the image description is at the very end of the block. - DescOffset = ((CurrentLba + 1) * Instance->Media->BlockSize) - sizeof (HW_IMAGE_DESCRIPTION); - - // Read the image description from media - Status = DiskIo->ReadDisk (DiskIo, - Instance->Media->MediaId, - DescOffset, - sizeof (HW_IMAGE_DESCRIPTION), - &File->HwDescription - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // If we found a valid image description... - if (BootMonFsIsImageValid (&File->HwDescription, (CurrentLba - Instance->Media->LowestAlignedLba))) { - DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n", - &(File->HwDescription.Footer.Filename), - (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba) - )); - File->HwDescAddress = DescOffset; - - *LbaStart = CurrentLba + 1; - return EFI_SUCCESS; - } else { - CurrentLba++; - } - } - - *LbaStart = CurrentLba; - return EFI_NOT_FOUND; -} - -EFI_STATUS -BootMonFsInitialize ( - IN BOOTMON_FS_INSTANCE *Instance - ) -{ - EFI_STATUS Status; - EFI_LBA Lba; - UINT32 ImageCount; - BOOTMON_FS_FILE *NewFile; - - ImageCount = 0; - Lba = 0; - - while (1) { - Status = BootMonFsCreateFile (Instance, &NewFile); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = BootMonFsDiscoverNextImage (Instance, &Lba, NewFile); - if (EFI_ERROR (Status)) { - // Free NewFile allocated by BootMonFsCreateFile () - FreePool (NewFile); - break; - } - InsertTailList (&Instance->RootFile->Link, &NewFile->Link); - ImageCount++; - } - - Instance->Initialized = TRUE; - return EFI_SUCCESS; -} diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsInternal.h b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsInternal.h deleted file mode 100644 index c0c6599cb7..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsInternal.h +++ /dev/null @@ -1,101 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#ifndef __BOOTMONFS_INTERNAL_H__ -#define __BOOTMONFS_INTERNAL_H__ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "BootMonFsHw.h" - -#define BOOTMON_FS_VOLUME_LABEL L"NOR Flash" - -typedef struct _BOOTMON_FS_INSTANCE BOOTMON_FS_INSTANCE; - -typedef struct { - LIST_ENTRY Link; - VOID* Buffer; - UINTN Size; - UINT64 Offset; // Offset from the start of the file -} BOOTMON_FS_FILE_REGION; - -typedef struct { - UINT32 Signature; - LIST_ENTRY Link; - BOOTMON_FS_INSTANCE *Instance; - - UINTN HwDescAddress; - HW_IMAGE_DESCRIPTION HwDescription; - - EFI_FILE_PROTOCOL File; - - // - // The following fields are relevant only if the file is open. - // - - EFI_FILE_INFO *Info; - UINT64 Position; - // If the file needs to be flushed then this list contain the memory - // buffer that creates this file - LIST_ENTRY RegionToFlushLink; - UINT64 OpenMode; -} BOOTMON_FS_FILE; - -#define BOOTMON_FS_FILE_SIGNATURE SIGNATURE_32('b', 'o', 't', 'f') -#define BOOTMON_FS_FILE_FROM_FILE_THIS(a) CR (a, BOOTMON_FS_FILE, File, BOOTMON_FS_FILE_SIGNATURE) -#define BOOTMON_FS_FILE_FROM_LINK_THIS(a) CR (a, BOOTMON_FS_FILE, Link, BOOTMON_FS_FILE_SIGNATURE) - -struct _BOOTMON_FS_INSTANCE { - UINT32 Signature; - EFI_HANDLE ControllerHandle; - - LIST_ENTRY Link; - - EFI_DRIVER_BINDING_PROTOCOL *Binding; - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_BLOCK_IO_PROTOCOL *BlockIo; - EFI_BLOCK_IO_MEDIA *Media; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL Fs; - - EFI_FILE_SYSTEM_INFO FsInfo; - CHAR16 Label[20]; - - BOOTMON_FS_FILE *RootFile; // All the other files are linked to this root - BOOLEAN Initialized; -}; - -#define BOOTMON_FS_SIGNATURE SIGNATURE_32('b', 'o', 't', 'm') -#define BOOTMON_FS_FROM_FS_THIS(a) CR (a, BOOTMON_FS_INSTANCE, Fs, BOOTMON_FS_SIGNATURE) -#define BOOTMON_FS_FROM_LINK(a) CR (a, BOOTMON_FS_INSTANCE, Link, BOOTMON_FS_SIGNATURE) - -#include "BootMonFsApi.h" - -#endif - diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsOpenClose.c b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsOpenClose.c deleted file mode 100644 index ae10055255..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsOpenClose.c +++ /dev/null @@ -1,795 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2015, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BootMonFsInternal.h" - -// Clear a file's image description on storage media: -// UEFI allows you to seek past the end of a file, a subsequent write will grow -// the file. It does not specify how space between the former end of the file -// and the beginning of the write should be filled. It's therefore possible that -// BootMonFs metadata, that comes after the end of a file, could be left there -// and wrongly detected by BootMonFsImageInBlock. -STATIC -EFI_STATUS -InvalidateImageDescription ( - IN BOOTMON_FS_FILE *File - ) -{ - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_BLOCK_IO_PROTOCOL *BlockIo; - UINT32 MediaId; - VOID *Buffer; - EFI_STATUS Status; - - DiskIo = File->Instance->DiskIo; - BlockIo = File->Instance->BlockIo; - MediaId = BlockIo->Media->MediaId; - - Buffer = AllocateZeroPool (sizeof (HW_IMAGE_DESCRIPTION)); - - if (Buffer == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = DiskIo->WriteDisk (DiskIo, - MediaId, - File->HwDescAddress, - sizeof (HW_IMAGE_DESCRIPTION), - Buffer - ); - - FreePool(Buffer); - - return Status; -} - -/** - Write the description of a file to storage media. - - This function uses DiskIo to write to the media, so call BlockIo->FlushBlocks() - after calling it to ensure the data are written on the media. - - @param[in] File Description of the file whose description on the - storage media has to be updated. - @param[in] FileName Name of the file. Its length is assumed to be - lower than MAX_NAME_LENGTH. - @param[in] DataSize Number of data bytes of the file. - @param[in] FileStart File's starting position on media. FileStart must - be aligned to the media's block size. - - @retval EFI_WRITE_PROTECTED The device cannot be written to. - @retval EFI_DEVICE_ERROR The device reported an error while performing - the write operation. - -**/ -STATIC -EFI_STATUS -WriteFileDescription ( - IN BOOTMON_FS_FILE *File, - IN CHAR8 *FileName, - IN UINT32 DataSize, - IN UINT64 FileStart - ) -{ - EFI_STATUS Status; - EFI_DISK_IO_PROTOCOL *DiskIo; - UINTN BlockSize; - UINT32 FileSize; - HW_IMAGE_DESCRIPTION *Description; - - DiskIo = File->Instance->DiskIo; - BlockSize = File->Instance->BlockIo->Media->BlockSize; - ASSERT (FileStart % BlockSize == 0); - - // - // Construct the file description - // - - FileSize = DataSize + sizeof (HW_IMAGE_DESCRIPTION); - Description = &File->HwDescription; - Description->Attributes = 1; - Description->BlockStart = FileStart / BlockSize; - Description->BlockEnd = Description->BlockStart + (FileSize / BlockSize); - AsciiStrCpyS (Description->Footer.Filename, - sizeof Description->Footer.Filename, FileName); - -#ifdef MDE_CPU_ARM - Description->Footer.Offset = HW_IMAGE_FOOTER_OFFSET; - Description->Footer.Version = HW_IMAGE_FOOTER_VERSION; -#else - Description->Footer.Offset = HW_IMAGE_FOOTER_OFFSET2; - Description->Footer.Version = HW_IMAGE_FOOTER_VERSION2; -#endif - Description->Footer.FooterSignature1 = HW_IMAGE_FOOTER_SIGNATURE_1; - Description->Footer.FooterSignature2 = HW_IMAGE_FOOTER_SIGNATURE_2; - Description->RegionCount = 1; - Description->Region[0].Checksum = 0; - Description->Region[0].Offset = Description->BlockStart * BlockSize; - Description->Region[0].Size = DataSize; - - Status = BootMonFsComputeFooterChecksum (Description); - if (EFI_ERROR (Status)) { - return Status; - } - - File->HwDescAddress = ((Description->BlockEnd + 1) * BlockSize) - sizeof (HW_IMAGE_DESCRIPTION); - - // Update the file description on the media - Status = DiskIo->WriteDisk ( - DiskIo, - File->Instance->Media->MediaId, - File->HwDescAddress, - sizeof (HW_IMAGE_DESCRIPTION), - Description - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -// Find a space on media for a file that has not yet been flushed to disk. -// Just returns the first space that's big enough. -// This function could easily be adapted to: -// - Find space for moving an existing file that has outgrown its space -// (We do not currently move files, just return EFI_VOLUME_FULL) -// - Find space for a fragment of a file that has outgrown its space -// (We do not currently fragment files - it's not clear whether fragmentation -// is actually part of BootMonFs as there is no spec) -// - Be more clever about finding space (choosing the largest or smallest -// suitable space) -// Parameters: -// File - the new (not yet flushed) file for which we need to find space. -// FileStart - the position on media of the file (in bytes). -STATIC -EFI_STATUS -BootMonFsFindSpaceForNewFile ( - IN BOOTMON_FS_FILE *File, - IN UINT64 FileSize, - OUT UINT64 *FileStart - ) -{ - LIST_ENTRY *FileLink; - BOOTMON_FS_FILE *RootFile; - BOOTMON_FS_FILE *FileEntry; - UINTN BlockSize; - EFI_BLOCK_IO_MEDIA *Media; - - Media = File->Instance->BlockIo->Media; - BlockSize = Media->BlockSize; - RootFile = File->Instance->RootFile; - - // This function must only be called for file which has not been flushed into - // Flash yet - ASSERT (File->HwDescription.RegionCount == 0); - - *FileStart = 0; - // Go through all the files in the list - for (FileLink = GetFirstNode (&RootFile->Link); - !IsNull (&RootFile->Link, FileLink); - FileLink = GetNextNode (&RootFile->Link, FileLink) - ) - { - FileEntry = BOOTMON_FS_FILE_FROM_LINK_THIS (FileLink); - // Skip files that aren't on disk yet - if (FileEntry->HwDescription.RegionCount == 0) { - continue; - } - - // If the free space preceding the file is big enough to contain the new - // file then use it! - if (((FileEntry->HwDescription.BlockStart * BlockSize) - *FileStart) - >= FileSize) { - // The file list must be in disk-order - RemoveEntryList (&File->Link); - File->Link.BackLink = FileLink->BackLink; - File->Link.ForwardLink = FileLink; - FileLink->BackLink->ForwardLink = &File->Link; - FileLink->BackLink = &File->Link; - - return EFI_SUCCESS; - } else { - *FileStart = (FileEntry->HwDescription.BlockEnd + 1) * BlockSize; - } - } - // See if there's space after the last file - if ((((Media->LastBlock + 1) * BlockSize) - *FileStart) >= FileSize) { - return EFI_SUCCESS; - } else { - return EFI_VOLUME_FULL; - } -} - -// Free the resources in the file's Region list. -STATIC -VOID -FreeFileRegions ( - IN BOOTMON_FS_FILE *File - ) -{ - LIST_ENTRY *RegionToFlushLink; - BOOTMON_FS_FILE_REGION *Region; - - RegionToFlushLink = GetFirstNode (&File->RegionToFlushLink); - while (!IsNull (&File->RegionToFlushLink, RegionToFlushLink)) { - // Repeatedly remove the first node from the list and free its resources. - Region = (BOOTMON_FS_FILE_REGION *) RegionToFlushLink; - RemoveEntryList (RegionToFlushLink); - FreePool (Region->Buffer); - FreePool (Region); - - RegionToFlushLink = GetFirstNode (&File->RegionToFlushLink); - } -} - -/** - Flush all modified data associated with a file to a device. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the - file handle to flush. - - @retval EFI_SUCCESS The data was flushed. - @retval EFI_ACCESS_DENIED The file was opened read-only. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_FULL The volume is full. - @retval EFI_OUT_OF_RESOURCES Not enough resources were available to flush the data. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsFlushFile ( - IN EFI_FILE_PROTOCOL *This - ) -{ - EFI_STATUS Status; - BOOTMON_FS_INSTANCE *Instance; - EFI_FILE_INFO *Info; - EFI_BLOCK_IO_PROTOCOL *BlockIo; - EFI_BLOCK_IO_MEDIA *Media; - EFI_DISK_IO_PROTOCOL *DiskIo; - UINTN BlockSize; - CHAR8 AsciiFileName[MAX_NAME_LENGTH]; - LIST_ENTRY *RegionToFlushLink; - BOOTMON_FS_FILE *File; - BOOTMON_FS_FILE *NextFile; - BOOTMON_FS_FILE_REGION *Region; - LIST_ENTRY *FileLink; - UINTN CurrentPhysicalSize; - UINT64 FileStart; - UINT64 FileEnd; - UINT64 RegionStart; - UINT64 RegionEnd; - UINT64 NewDataSize; - UINT64 NewFileSize; - UINT64 EndOfAppendSpace; - BOOLEAN HasSpace; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (File->OpenMode == EFI_FILE_MODE_READ) { - return EFI_ACCESS_DENIED; - } - - Instance = File->Instance; - Info = File->Info; - BlockIo = Instance->BlockIo; - Media = BlockIo->Media; - DiskIo = Instance->DiskIo; - BlockSize = Media->BlockSize; - - UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, MAX_NAME_LENGTH); - - // If the file doesn't exist then find a space for it - if (File->HwDescription.RegionCount == 0) { - Status = BootMonFsFindSpaceForNewFile ( - File, - Info->FileSize + sizeof (HW_IMAGE_DESCRIPTION), - &FileStart - ); - if (EFI_ERROR (Status)) { - return Status; - } - } else { - FileStart = File->HwDescription.BlockStart * BlockSize; - } - // FileEnd is the current NOR address of the end of the file's data - FileEnd = FileStart + File->HwDescription.Region[0].Size; - - for (RegionToFlushLink = GetFirstNode (&File->RegionToFlushLink); - !IsNull (&File->RegionToFlushLink, RegionToFlushLink); - RegionToFlushLink = GetNextNode (&File->RegionToFlushLink, RegionToFlushLink) - ) - { - Region = (BOOTMON_FS_FILE_REGION*)RegionToFlushLink; - if (Region->Size == 0) { - continue; - } - - // RegionStart and RegionEnd are the the intended NOR address of the - // start and end of the region - RegionStart = FileStart + Region->Offset; - RegionEnd = RegionStart + Region->Size; - - if (RegionEnd < FileEnd) { - // Handle regions representing edits to existing portions of the file - // Write the region data straight into the file - Status = DiskIo->WriteDisk (DiskIo, - Media->MediaId, - RegionStart, - Region->Size, - Region->Buffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - } else { - // Handle regions representing appends to the file - // - // Note: Since seeking past the end of the file with SetPosition() is - // valid, it's possible there will be a gap between the current end of - // the file and the beginning of the new region. Since the UEFI spec - // says nothing about this case (except "a subsequent write would grow - // the file"), we just leave garbage in the gap. - - // Check if there is space to append the new region - HasSpace = FALSE; - NewDataSize = RegionEnd - FileStart; - NewFileSize = NewDataSize + sizeof (HW_IMAGE_DESCRIPTION); - CurrentPhysicalSize = BootMonFsGetPhysicalSize (File); - if (NewFileSize <= CurrentPhysicalSize) { - HasSpace = TRUE; - } else { - // Get the File Description for the next file - FileLink = GetNextNode (&Instance->RootFile->Link, &File->Link); - if (!IsNull (&Instance->RootFile->Link, FileLink)) { - NextFile = BOOTMON_FS_FILE_FROM_LINK_THIS (FileLink); - - // If there is space between the beginning of the current file and the - // beginning of the next file then use it - EndOfAppendSpace = NextFile->HwDescription.BlockStart * BlockSize; - } else { - // We are flushing the last file. - EndOfAppendSpace = (Media->LastBlock + 1) * BlockSize; - } - if (EndOfAppendSpace - FileStart >= NewFileSize) { - HasSpace = TRUE; - } - } - - if (HasSpace == TRUE) { - // Invalidate the current image description of the file if any. - if (File->HwDescAddress != 0) { - Status = InvalidateImageDescription (File); - if (EFI_ERROR (Status)) { - return Status; - } - } - - // Write the new file data - Status = DiskIo->WriteDisk ( - DiskIo, - Media->MediaId, - RegionStart, - Region->Size, - Region->Buffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = WriteFileDescription (File, AsciiFileName, NewDataSize, FileStart); - if (EFI_ERROR (Status)) { - return Status; - } - - } else { - // There isn't a space for the file. - // Options here are to move the file or fragment it. However as files - // may represent boot images at fixed positions, these options will - // break booting if the bootloader doesn't use BootMonFs to find the - // image. - - return EFI_VOLUME_FULL; - } - } - } - - FreeFileRegions (File); - Info->PhysicalSize = BootMonFsGetPhysicalSize (File); - - if ((AsciiStrCmp (AsciiFileName, File->HwDescription.Footer.Filename) != 0) || - (Info->FileSize != File->HwDescription.Region[0].Size) ) { - Status = WriteFileDescription (File, AsciiFileName, Info->FileSize, FileStart); - if (EFI_ERROR (Status)) { - return Status; - } - } - - // Flush DiskIo Buffers (see UEFI Spec 12.7 - DiskIo buffers are flushed by - // calling FlushBlocks on the same device's BlockIo). - BlockIo->FlushBlocks (BlockIo); - - return EFI_SUCCESS; -} - -/** - Close a specified file handle. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the file - handle to close. - - @retval EFI_SUCCESS The file was closed. - @retval EFI_INVALID_PARAMETER The parameter "This" is NULL or is not an open - file handle. - -**/ -EFIAPI -EFI_STATUS -BootMonFsCloseFile ( - IN EFI_FILE_PROTOCOL *This - ) -{ - BOOTMON_FS_FILE *File; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - // In the case of a file and not the root directory - if (This != &File->Instance->RootFile->File) { - This->Flush (This); - FreePool (File->Info); - File->Info = NULL; - } - - return EFI_SUCCESS; -} - -/** - Open a file on the boot monitor file system. - - The boot monitor file system does not allow for sub-directories. There is only - one directory, the root one. On any attempt to create a directory, the function - returns in error with the EFI_WRITE_PROTECTED error code. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is - the file handle to source location. - @param[out] NewHandle A pointer to the location to return the opened - handle for the new file. - @param[in] FileName The Null-terminated string of the name of the file - to be opened. - @param[in] OpenMode The mode to open the file : Read or Read/Write or - Read/Write/Create - @param[in] Attributes Attributes of the file in case of a file creation - - @retval EFI_SUCCESS The file was open. - @retval EFI_NOT_FOUND The specified file could not be found or the specified - directory in which to create a file could not be found. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_WRITE_PROTECTED Attempt to create a directory. This is not possible - with the Boot Monitor file system. - @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the file. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsOpenFile ( - IN EFI_FILE_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes - ) -{ - EFI_STATUS Status; - BOOTMON_FS_FILE *Directory; - BOOTMON_FS_FILE *File; - BOOTMON_FS_INSTANCE *Instance; - CHAR8 *Buf; - CHAR16 *Path; - CHAR16 *Separator; - CHAR8 *AsciiFileName; - EFI_FILE_INFO *Info; - UINTN AsciiFileNameSize; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Directory = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (Directory->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - if ((FileName == NULL) || (NewHandle == NULL)) { - return EFI_INVALID_PARAMETER; - } - - // - // The only valid modes are read, read/write, and read/write/create - // - if ( (OpenMode != EFI_FILE_MODE_READ) && - (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) && - (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)) ) { - return EFI_INVALID_PARAMETER; - } - - Instance = Directory->Instance; - - // - // If the instance has not been initialized yet then do it ... - // - if (!Instance->Initialized) { - Status = BootMonFsInitialize (Instance); - if (EFI_ERROR (Status)) { - return Status; - } - } - - // - // Copy the file path to be able to work on it. We do not want to - // modify the input file name string "FileName". - // - Buf = AllocateCopyPool (StrSize (FileName), FileName); - if (Buf == NULL) { - return EFI_OUT_OF_RESOURCES; - } - Path = (CHAR16*)Buf; - AsciiFileName = NULL; - Info = NULL; - - // - // Handle single periods, double periods and convert forward slashes '/' - // to backward '\' ones. Does not handle a '.' at the beginning of the - // path for the time being. - // - if (PathCleanUpDirectories (Path) == NULL) { - Status = EFI_INVALID_PARAMETER; - goto Error; - } - - // - // Detect if the first component of the path refers to a directory. - // This is done to return the correct error code when trying to - // access or create a directory other than the root directory. - // - - // - // Search for the '\\' sequence and if found return in error - // with the EFI_INVALID_PARAMETER error code. ere in the path. - // - if (StrStr (Path, L"\\\\") != NULL) { - Status = EFI_INVALID_PARAMETER; - goto Error; - } - // - // Get rid of the leading '\' if any. - // - Path += (Path[0] == L'\\'); - - // - // Look for a '\' in the file path. If one is found then - // the first component of the path refers to a directory - // that is not the root directory. - // - Separator = StrStr (Path, L"\\"); - if (Separator != NULL) { - // - // In the case '\' and a creation, return - // EFI_WRITE_PROTECTED if this is for a directory - // creation, EFI_INVALID_PARAMETER otherwise. - // - if ((*(Separator + 1) == '\0') && ((OpenMode & EFI_FILE_MODE_CREATE) != 0)) { - if (Attributes & EFI_FILE_DIRECTORY) { - Status = EFI_WRITE_PROTECTED; - } else { - Status = EFI_INVALID_PARAMETER; - } - } else { - // - // Attempt to open a file or a directory that is not in the - // root directory or to open without creation a directory - // located in the root directory, returns EFI_NOT_FOUND. - // - Status = EFI_NOT_FOUND; - } - goto Error; - } - - // - // BootMonFs interface requires ASCII filenames - // - AsciiFileNameSize = StrLen (Path) + 1; - if (AsciiFileNameSize > MAX_NAME_LENGTH) { - AsciiFileNameSize = MAX_NAME_LENGTH; - } - AsciiFileName = AllocatePool (AsciiFileNameSize); - if (AsciiFileName == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Error; - } - UnicodeStrToAsciiStrS (Path, AsciiFileName, AsciiFileNameSize); - - if ((AsciiFileName[0] == '\0') || - (AsciiFileName[0] == '.' ) ) { - // - // Opening the root directory - // - - *NewHandle = &Instance->RootFile->File; - Instance->RootFile->Position = 0; - Status = EFI_SUCCESS; - } else { - - if ((OpenMode & EFI_FILE_MODE_CREATE) && - (Attributes & EFI_FILE_DIRECTORY) ) { - Status = EFI_WRITE_PROTECTED; - goto Error; - } - - // - // Allocate a buffer to store the characteristics of the file while the - // file is open. We allocate the maximum size to not have to reallocate - // if the file name is changed. - // - Info = AllocateZeroPool ( - SIZE_OF_EFI_FILE_INFO + (sizeof (CHAR16) * MAX_NAME_LENGTH)); - if (Info == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Error; - } - - // - // Open or create a file in the root directory. - // - - Status = BootMonGetFileFromAsciiFileName (Instance, AsciiFileName, &File); - if (Status == EFI_NOT_FOUND) { - if ((OpenMode & EFI_FILE_MODE_CREATE) == 0) { - goto Error; - } - - Status = BootMonFsCreateFile (Instance, &File); - if (EFI_ERROR (Status)) { - goto Error; - } - InsertHeadList (&Instance->RootFile->Link, &File->Link); - Info->Attribute = Attributes; - } else { - // - // File already open, not supported yet. - // - if (File->Info != NULL) { - Status = EFI_UNSUPPORTED; - goto Error; - } - } - - Info->FileSize = BootMonFsGetImageLength (File); - Info->PhysicalSize = BootMonFsGetPhysicalSize (File); - AsciiStrToUnicodeStrS (AsciiFileName, Info->FileName, MAX_NAME_LENGTH); - - File->Info = Info; - Info = NULL; - File->Position = 0; - File->OpenMode = OpenMode; - - *NewHandle = &File->File; - } - -Error: - - FreePool (Buf); - if (AsciiFileName != NULL) { - FreePool (AsciiFileName); - } - if (Info != NULL) { - FreePool (Info); - } - - return Status; -} - -// Delete() for the root directory's EFI_FILE_PROTOCOL instance -EFIAPI -EFI_STATUS -BootMonFsDeleteFail ( - IN EFI_FILE_PROTOCOL *This - ) -{ - This->Close(This); - // You can't delete the root directory - return EFI_WARN_DELETE_FAILURE; -} - -/** - Close and delete a file from the boot monitor file system. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the file - handle to delete. - - @retval EFI_SUCCESS The file was closed and deleted. - @retval EFI_INVALID_PARAMETER The parameter "This" is NULL or is not an open - file handle. - @retval EFI_WARN_DELETE_FAILURE The handle was closed, but the file was not deleted. - -**/ -EFIAPI -EFI_STATUS -BootMonFsDelete ( - IN EFI_FILE_PROTOCOL *This - ) -{ - EFI_STATUS Status; - BOOTMON_FS_FILE *File; - LIST_ENTRY *RegionToFlushLink; - BOOTMON_FS_FILE_REGION *Region; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (!IsListEmpty (&File->RegionToFlushLink)) { - // Free the entries from the Buffer List - RegionToFlushLink = GetFirstNode (&File->RegionToFlushLink); - do { - Region = (BOOTMON_FS_FILE_REGION*)RegionToFlushLink; - - // - // Get next element of the list before deleting the region description - // that contain the LIST_ENTRY structure. - // - RegionToFlushLink = RemoveEntryList (RegionToFlushLink); - - // Free the buffers - FreePool (Region->Buffer); - FreePool (Region); - } while (!IsListEmpty (&File->RegionToFlushLink)); - } - - // If (RegionCount is greater than 0) then the file already exists - if (File->HwDescription.RegionCount > 0) { - // Invalidate the last Block - Status = InvalidateImageDescription (File); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - return EFI_WARN_DELETE_FAILURE; - } - } - - // Remove the entry from the list - RemoveEntryList (&File->Link); - FreePool (File->Info); - FreePool (File); - - return EFI_SUCCESS; -} diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsReadWrite.c b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsReadWrite.c deleted file mode 100644 index f8124e95ac..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsReadWrite.c +++ /dev/null @@ -1,259 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include -#include -#include -#include -#include - -#include "BootMonFsInternal.h" - -/** - Read data from an open file. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that - is the file handle to read data from. - @param[in out] BufferSize On input, the size of the Buffer. On output, the - amount of data returned in Buffer. In both cases, - the size is measured in bytes. - @param[out] Buffer The buffer into which the data is read. - - @retval EFI_SUCCESS The data was read. - @retval EFI_DEVICE_ERROR On entry, the current file position is - beyond the end of the file, or the device - reported an error while performing the read - operation. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsReadFile ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - BOOTMON_FS_INSTANCE *Instance; - BOOTMON_FS_FILE *File; - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_BLOCK_IO_MEDIA *Media; - UINT64 FileStart; - EFI_STATUS Status; - UINTN RemainingFileSize; - - if ((This == NULL) || - (BufferSize == NULL) || - (Buffer == NULL) ) { - return EFI_INVALID_PARAMETER; - } - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - // Ensure the file has been written in Flash before reading it. - // This keeps the code simple and avoids having to manage a non-flushed file. - BootMonFsFlushFile (This); - - Instance = File->Instance; - DiskIo = Instance->DiskIo; - Media = Instance->Media; - FileStart = (Media->LowestAlignedLba + File->HwDescription.BlockStart) * Media->BlockSize; - - if (File->Position >= File->Info->FileSize) { - // The entire file has been read or the position has been - // set past the end of the file. - *BufferSize = 0; - if (File->Position > File->Info->FileSize) { - return EFI_DEVICE_ERROR; - } else { - return EFI_SUCCESS; - } - } - - // This driver assumes that the entire file is in region 0. - RemainingFileSize = File->Info->FileSize - File->Position; - - // If read would go past end of file, truncate the read - if (*BufferSize > RemainingFileSize) { - *BufferSize = RemainingFileSize; - } - - Status = DiskIo->ReadDisk ( - DiskIo, - Media->MediaId, - FileStart + File->Position, - *BufferSize, - Buffer - ); - if (EFI_ERROR (Status)) { - *BufferSize = 0; - } - - File->Position += *BufferSize; - - return Status; -} - -/** - Write data to an open file. - - The data is not written to the flash yet. It will be written when the file - will be either read, closed or flushed. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that - is the file handle to write data to. - @param[in out] BufferSize On input, the size of the Buffer. On output, the - size of the data actually written. In both cases, - the size is measured in bytes. - @param[in] Buffer The buffer of data to write. - - @retval EFI_SUCCESS The data was written. - @retval EFI_ACCESS_DENIED The file was opened read only. - @retval EFI_OUT_OF_RESOURCES Unable to allocate the buffer to store the - data to write. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsWriteFile ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - BOOTMON_FS_FILE *File; - BOOTMON_FS_FILE_REGION *Region; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (File->OpenMode == EFI_FILE_MODE_READ) { - return EFI_ACCESS_DENIED; - } - - // Allocate and initialize the memory region - Region = (BOOTMON_FS_FILE_REGION*)AllocateZeroPool (sizeof (BOOTMON_FS_FILE_REGION)); - if (Region == NULL) { - *BufferSize = 0; - return EFI_OUT_OF_RESOURCES; - } - - Region->Buffer = AllocateCopyPool (*BufferSize, Buffer); - if (Region->Buffer == NULL) { - *BufferSize = 0; - FreePool (Region); - return EFI_OUT_OF_RESOURCES; - } - - Region->Size = *BufferSize; - Region->Offset = File->Position; - - InsertTailList (&File->RegionToFlushLink, &Region->Link); - - File->Position += *BufferSize; - - if (File->Position > File->Info->FileSize) { - File->Info->FileSize = File->Position; - } - - return EFI_SUCCESS; -} - -/** - Set a file's current position. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is - the file handle to set the requested position on. - @param[in] Position The byte position from the start of the file to set. - - @retval EFI_SUCCESS The position was set. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsSetPosition ( - IN EFI_FILE_PROTOCOL *This, - IN UINT64 Position - ) -{ - BOOTMON_FS_FILE *File; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - // - // UEFI Spec section 12.5: - // "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to - // be set to the end of the file." - // - if (Position == 0xFFFFFFFFFFFFFFFF) { - Position = File->Info->FileSize; - } - - File->Position = Position; - - return EFI_SUCCESS; -} - -/** - Return a file's current position. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is - the file handle to get the current position on. - @param[out] Position The address to return the file's current position value. - - @retval EFI_SUCCESS The position was returned. - @retval EFI_INVALID_PARAMETER At least one of the parameters is invalid. - -**/ -EFIAPI -EFI_STATUS -BootMonFsGetPosition ( - IN EFI_FILE_PROTOCOL *This, - OUT UINT64 *Position - ) -{ - BOOTMON_FS_FILE *File; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); - if (File->Info == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (Position == NULL) { - return EFI_INVALID_PARAMETER; - } - - *Position = File->Position; - - return EFI_SUCCESS; -} diff --git a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsUnsupported.c b/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsUnsupported.c deleted file mode 100644 index 4ecc4ea008..0000000000 --- a/ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsUnsupported.c +++ /dev/null @@ -1,37 +0,0 @@ -/** @file -* -* Copyright (c) 2012-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BootMonFsInternal.h" - -EFIAPI -EFI_STATUS -BootMonFsSetPositionUnsupported ( - IN EFI_FILE_PROTOCOL *This, - IN UINT64 Position - ) -{ - ASSERT(0); - return EFI_UNSUPPORTED; -} - -EFIAPI -EFI_STATUS -BootMonFsGetPositionUnsupported ( - IN EFI_FILE_PROTOCOL *This, - OUT UINT64 *Position - ) -{ - ASSERT(0); - return EFI_UNSUPPORTED; -} -- cgit v1.2.3