From f461355c9763025d0eb2d4f04e6368059d044adf Mon Sep 17 00:00:00 2001 From: Guo Mang Date: Thu, 27 Apr 2017 11:43:55 +0800 Subject: FatPkg: Remove unused Package Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Mang --- FatPkg/Contributions.txt | 218 ---- FatPkg/EnhancedFatDxe/ComponentName.c | 349 ------ FatPkg/EnhancedFatDxe/Data.c | 46 - FatPkg/EnhancedFatDxe/Delete.c | 125 -- FatPkg/EnhancedFatDxe/DirectoryCache.c | 190 --- FatPkg/EnhancedFatDxe/DirectoryManage.c | 1397 --------------------- FatPkg/EnhancedFatDxe/DiskCache.c | 495 -------- FatPkg/EnhancedFatDxe/Fat.c | 531 -------- FatPkg/EnhancedFatDxe/Fat.h | 2014 ------------------------------ FatPkg/EnhancedFatDxe/Fat.inf | 94 -- FatPkg/EnhancedFatDxe/Fat.uni | 24 - FatPkg/EnhancedFatDxe/FatExtra.uni | 20 - FatPkg/EnhancedFatDxe/FatFileSystem.h | 214 ---- FatPkg/EnhancedFatDxe/FileName.c | 505 -------- FatPkg/EnhancedFatDxe/FileSpace.c | 736 ----------- FatPkg/EnhancedFatDxe/Flush.c | 474 ------- FatPkg/EnhancedFatDxe/Hash.c | 172 --- FatPkg/EnhancedFatDxe/Info.c | 601 --------- FatPkg/EnhancedFatDxe/Init.c | 393 ------ FatPkg/EnhancedFatDxe/Misc.c | 609 --------- FatPkg/EnhancedFatDxe/Open.c | 326 ----- FatPkg/EnhancedFatDxe/OpenVolume.c | 64 - FatPkg/EnhancedFatDxe/ReadWrite.c | 626 ---------- FatPkg/EnhancedFatDxe/UnicodeCollation.c | 281 ----- FatPkg/FatPei/FatLiteAccess.c | 527 -------- FatPkg/FatPei/FatLiteApi.c | 685 ---------- FatPkg/FatPei/FatLiteApi.h | 31 - FatPkg/FatPei/FatLiteFmt.h | 144 --- FatPkg/FatPei/FatLiteLib.c | 376 ------ FatPkg/FatPei/FatLitePeim.h | 527 -------- FatPkg/FatPei/FatPei.inf | 79 -- FatPkg/FatPei/FatPei.uni | 22 - FatPkg/FatPei/FatPeiExtra.uni | 20 - FatPkg/FatPei/Part.c | 466 ------- FatPkg/FatPkg.dec | 25 - FatPkg/FatPkg.dsc | 87 -- FatPkg/FatPkg.uni | 26 - FatPkg/FatPkgExtra.uni | 20 - FatPkg/License.txt | 25 - 39 files changed, 13564 deletions(-) delete mode 100644 FatPkg/Contributions.txt delete mode 100644 FatPkg/EnhancedFatDxe/ComponentName.c delete mode 100644 FatPkg/EnhancedFatDxe/Data.c delete mode 100644 FatPkg/EnhancedFatDxe/Delete.c delete mode 100644 FatPkg/EnhancedFatDxe/DirectoryCache.c delete mode 100644 FatPkg/EnhancedFatDxe/DirectoryManage.c delete mode 100644 FatPkg/EnhancedFatDxe/DiskCache.c delete mode 100644 FatPkg/EnhancedFatDxe/Fat.c delete mode 100644 FatPkg/EnhancedFatDxe/Fat.h delete mode 100644 FatPkg/EnhancedFatDxe/Fat.inf delete mode 100644 FatPkg/EnhancedFatDxe/Fat.uni delete mode 100644 FatPkg/EnhancedFatDxe/FatExtra.uni delete mode 100644 FatPkg/EnhancedFatDxe/FatFileSystem.h delete mode 100644 FatPkg/EnhancedFatDxe/FileName.c delete mode 100644 FatPkg/EnhancedFatDxe/FileSpace.c delete mode 100644 FatPkg/EnhancedFatDxe/Flush.c delete mode 100644 FatPkg/EnhancedFatDxe/Hash.c delete mode 100644 FatPkg/EnhancedFatDxe/Info.c delete mode 100644 FatPkg/EnhancedFatDxe/Init.c delete mode 100644 FatPkg/EnhancedFatDxe/Misc.c delete mode 100644 FatPkg/EnhancedFatDxe/Open.c delete mode 100644 FatPkg/EnhancedFatDxe/OpenVolume.c delete mode 100644 FatPkg/EnhancedFatDxe/ReadWrite.c delete mode 100644 FatPkg/EnhancedFatDxe/UnicodeCollation.c delete mode 100644 FatPkg/FatPei/FatLiteAccess.c delete mode 100644 FatPkg/FatPei/FatLiteApi.c delete mode 100644 FatPkg/FatPei/FatLiteApi.h delete mode 100644 FatPkg/FatPei/FatLiteFmt.h delete mode 100644 FatPkg/FatPei/FatLiteLib.c delete mode 100644 FatPkg/FatPei/FatLitePeim.h delete mode 100644 FatPkg/FatPei/FatPei.inf delete mode 100644 FatPkg/FatPei/FatPei.uni delete mode 100644 FatPkg/FatPei/FatPeiExtra.uni delete mode 100644 FatPkg/FatPei/Part.c delete mode 100644 FatPkg/FatPkg.dec delete mode 100644 FatPkg/FatPkg.dsc delete mode 100644 FatPkg/FatPkg.uni delete mode 100644 FatPkg/FatPkgExtra.uni delete mode 100644 FatPkg/License.txt (limited to 'FatPkg') diff --git a/FatPkg/Contributions.txt b/FatPkg/Contributions.txt deleted file mode 100644 index f87cbd73c6..0000000000 --- a/FatPkg/Contributions.txt +++ /dev/null @@ -1,218 +0,0 @@ - -====================== -= Code Contributions = -====================== - -To make a contribution to a TianoCore project, follow these steps. -1. Create a change description in the format specified below to - use in the source control commit log. -2. Your commit message must include your "Signed-off-by" signature, - and "Contributed-under" message. -3. Your "Contributed-under" message explicitly states that the - contribution is made under the terms of the specified - contribution agreement. Your "Contributed-under" message - must include the name of contribution agreement and version. - For example: Contributed-under: TianoCore Contribution Agreement 1.0 - The "TianoCore Contribution Agreement" is included below in - this document. -4. Submit your code to the TianoCore project using the process - that the project documents on its web page. If the process is - not documented, then submit the code on development email list - for the project. -5. It is preferred that contributions are submitted using the same - copyright license as the base project. When that is not possible, - then contributions using the following licenses can be accepted: - * BSD (2-clause): http://opensource.org/licenses/BSD-2-Clause - * BSD (3-clause): http://opensource.org/licenses/BSD-3-Clause - * MIT: http://opensource.org/licenses/MIT - * Python-2.0: http://opensource.org/licenses/Python-2.0 - * Zlib: http://opensource.org/licenses/Zlib - - Contributions of code put into the public domain can also be - accepted. - - Contributions using other licenses might be accepted, but further - review will be required. - -===================================================== -= Change Description / Commit Message / Patch Email = -===================================================== - -Your change description should use the standard format for a -commit message, and must include your "Signed-off-by" signature -and the "Contributed-under" message. - -== Sample Change Description / Commit Message = - -=== Start of sample patch email message === - -From: Contributor Name -Subject: [PATCH] CodeModule: Brief-single-line-summary - -Full-commit-message - -Contributed-under: TianoCore Contribution Agreement 1.0 -Signed-off-by: Contributor Name ---- - -An extra message for the patch email which will not be considered part -of the commit message can be added here. - -Patch content inline or attached - -=== End of sample patch email message === - -=== Notes for sample patch email === - -* The first line of commit message is taken from the email's subject - line following [PATCH]. The remaining portion of the commit message - is the email's content until the '---' line. -* git format-patch is one way to create this format - -=== Definitions for sample patch email === - -* "CodeModule" is a short idenfier for the affected code. For - example MdePkg, or MdeModulePkg UsbBusDxe. -* "Brief-single-line-summary" is a short summary of the change. -* The entire first line should be less than ~70 characters. -* "Full-commit-message" a verbose multiple line comment describing - the change. Each line should be less than ~70 characters. -* "Contributed-under" explicitely states that the contribution is - made under the terms of the contribtion agreement. This - agreement is included below in this document. -* "Signed-off-by" is the contributor's signature identifying them - by their real/legal name and their email address. - -======================================== -= TianoCore Contribution Agreement 1.0 = -======================================== - -INTEL CORPORATION ("INTEL") MAKES AVAILABLE SOFTWARE, DOCUMENTATION, -INFORMATION AND/OR OTHER MATERIALS FOR USE IN THE TIANOCORE OPEN SOURCE -PROJECT (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE -TERMS AND CONDITIONS OF THIS AGREEMENT BETWEEN YOU AND INTEL AND/OR THE -TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR -REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE -CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS -OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED -BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS -AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE -AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT -USE THE CONTENT. - -Unless otherwise indicated, all Content made available on the TianoCore -site is provided to you under the terms and conditions of the BSD -License ("BSD"). A copy of the BSD License is available at -http://opensource.org/licenses/bsd-license.php -or when applicable, in the associated License.txt file. - -Certain other content may be made available under other licenses as -indicated in or with such Content. (For example, in a License.txt file.) - -You accept and agree to the following terms and conditions for Your -present and future Contributions submitted to TianoCore site. Except -for the license granted to Intel hereunder, You reserve all right, -title, and interest in and to Your Contributions. - -== SECTION 1: Definitions == -* "You" or "Contributor" shall mean the copyright owner or legal - entity authorized by the copyright owner that is making a - Contribution hereunder. All other entities that control, are - controlled by, or are under common control with that entity are - considered to be a single Contributor. For the purposes of this - definition, "control" means (i) the power, direct or indirect, to - cause the direction or management of such entity, whether by - contract or otherwise, or (ii) ownership of fifty percent (50%) - or more of the outstanding shares, or (iii) beneficial ownership - of such entity. -* "Contribution" shall mean any original work of authorship, - including any modifications or additions to an existing work, - that is intentionally submitted by You to the TinaoCore site for - inclusion in, or documentation of, any of the Content. For the - purposes of this definition, "submitted" means any form of - electronic, verbal, or written communication sent to the - TianoCore site or its representatives, including but not limited - to communication on electronic mailing lists, source code - control systems, and issue tracking systems that are managed by, - or on behalf of, the TianoCore site for the purpose of - discussing and improving the Content, but excluding - communication that is conspicuously marked or otherwise - designated in writing by You as "Not a Contribution." - -== SECTION 2: License for Contributions == -* Contributor hereby agrees that redistribution and use of the - Contribution in source and binary forms, with or without - modification, are permitted provided that the following - conditions are met: -** Redistributions of source code must retain the Contributor's - copyright notice, this list of conditions and the following - disclaimer. -** Redistributions in binary form must reproduce the Contributor's - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -* Disclaimer. None of the names of Contributor, Intel, or the names - of their respective contributors may be used to endorse or - promote products derived from this software without specific - prior written permission. -* Contributor grants a license (with the right to sublicense) under - claims of Contributor's patents that Contributor can license that - are infringed by the Contribution (as delivered by Contributor) to - make, use, distribute, sell, offer for sale, and import the - Contribution and derivative works thereof solely to the minimum - extent necessary for licensee to exercise the granted copyright - license; this patent license applies solely to those portions of - the Contribution that are unmodified. No hardware per se is - licensed. -* EXCEPT AS EXPRESSLY SET FORTH IN SECTION 3 BELOW, THE - CONTRIBUTION IS PROVIDED BY THE CONTRIBUTOR "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE - CONTRIBUTION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - -== SECTION 3: Representations == -* You represent that You are legally entitled to grant the above - license. If your employer(s) has rights to intellectual property - that You create that includes Your Contributions, You represent - that You have received permission to make Contributions on behalf - of that employer, that Your employer has waived such rights for - Your Contributions. -* You represent that each of Your Contributions is Your original - creation (see Section 4 for submissions on behalf of others). - You represent that Your Contribution submissions include complete - details of any third-party license or other restriction - (including, but not limited to, related patents and trademarks) - of which You are personally aware and which are associated with - any part of Your Contributions. - -== SECTION 4: Third Party Contributions == -* Should You wish to submit work that is not Your original creation, - You may submit it to TianoCore site separately from any - Contribution, identifying the complete details of its source - and of any license or other restriction (including, but not - limited to, related patents, trademarks, and license agreements) - of which You are personally aware, and conspicuously marking the - work as "Submitted on behalf of a third-party: [named here]". - -== SECTION 5: Miscellaneous == -* Applicable Laws. Any claims arising under or relating to this - Agreement shall be governed by the internal substantive laws of - the State of Delaware or federal courts located in Delaware, - without regard to principles of conflict of laws. -* Language. This Agreement is in the English language only, which - language shall be controlling in all respects, and all versions - of this Agreement in any other language shall be for accommodation - only and shall not be binding. All communications and notices made - or given pursuant to this Agreement, and all documentation and - support to be provided, unless otherwise noted, shall be in the - English language. - diff --git a/FatPkg/EnhancedFatDxe/ComponentName.c b/FatPkg/EnhancedFatDxe/ComponentName.c deleted file mode 100644 index ce1c975b5f..0000000000 --- a/FatPkg/EnhancedFatDxe/ComponentName.c +++ /dev/null @@ -1,349 +0,0 @@ -/** @file - -Copyright (c) 2005 - 2011, Intel Corporation. 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 "Fat.h" - -// -// EFI Component Name Functions -// -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -FatComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -FatComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gFatComponentName = { - FatComponentNameGetDriverName, - FatComponentNameGetControllerName, - "eng" -}; - -// -// EFI Component Name 2 Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gFatComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) FatComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) FatComponentNameGetControllerName, - "en" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mFatDriverNameTable[] = { - { - "eng;en", - L"FAT File System Driver" - }, - { - NULL, - NULL - } -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mFatControllerNameTable[] = { - { - "eng;en", - L"FAT File System" - }, - { - NULL, - NULL - } -}; - - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -FatComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mFatDriverNameTable, - DriverName, - (BOOLEAN)(This == &gFatComponentName) - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -FatComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - - // - // This is a device driver, so ChildHandle must be NULL. - // - if (ChildHandle != NULL) { - return EFI_UNSUPPORTED; - } - - // - // Make sure this driver is currently managing ControllHandle - // - Status = EfiTestManagedDevice ( - ControllerHandle, - gFatDriverBinding.DriverBindingHandle, - &gEfiDiskIoProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mFatControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gFatComponentName) - ); -} diff --git a/FatPkg/EnhancedFatDxe/Data.c b/FatPkg/EnhancedFatDxe/Data.c deleted file mode 100644 index 56a265e4f2..0000000000 --- a/FatPkg/EnhancedFatDxe/Data.c +++ /dev/null @@ -1,46 +0,0 @@ -/** @file - Global data in the FAT Filesystem driver. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - -// -// Globals -// -// -// FatFsLock - Global lock for synchronizing all requests. -// -EFI_LOCK FatFsLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_CALLBACK); - -EFI_LOCK FatTaskLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY); - -// -// Filesystem interface functions -// -EFI_FILE_PROTOCOL FatFileInterface = { - EFI_FILE_PROTOCOL_REVISION, - FatOpen, - FatClose, - FatDelete, - FatRead, - FatWrite, - FatGetPosition, - FatSetPosition, - FatGetInfo, - FatSetInfo, - FatFlush, - FatOpenEx, - FatReadEx, - FatWriteEx, - FatFlushEx -}; diff --git a/FatPkg/EnhancedFatDxe/Delete.c b/FatPkg/EnhancedFatDxe/Delete.c deleted file mode 100644 index 9837565a8e..0000000000 --- a/FatPkg/EnhancedFatDxe/Delete.c +++ /dev/null @@ -1,125 +0,0 @@ -/** @file - Function that deletes a file. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - -/** - - Deletes the file & Closes the file handle. - - @param FHand - Handle to the file to delete. - - @retval EFI_SUCCESS - Delete the file successfully. - @retval EFI_WARN_DELETE_FAILURE - Fail to delete the file. - -**/ -EFI_STATUS -EFIAPI -FatDelete ( - IN EFI_FILE_PROTOCOL *FHand - ) -{ - FAT_IFILE *IFile; - FAT_OFILE *OFile; - FAT_DIRENT *DirEnt; - EFI_STATUS Status; - UINTN Round; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - - FatWaitNonblockingTask (IFile); - - // - // Lock the volume - // - FatAcquireLock (); - - // - // If the file is read-only, then don't delete it - // - if (IFile->ReadOnly) { - Status = EFI_WRITE_PROTECTED; - goto Done; - } - // - // If the file is the root dir, then don't delete it - // - if (OFile->Parent == NULL) { - Status = EFI_ACCESS_DENIED; - goto Done; - } - // - // If the file has a permanant error, skip the delete - // - Status = OFile->Error; - if (!EFI_ERROR (Status)) { - // - // If this is a directory, make sure it's empty before - // allowing it to be deleted - // - if (OFile->ODir != NULL) { - // - // We do not allow to delete nonempty directory - // - FatResetODirCursor (OFile); - for (Round = 0; Round < 3; Round++) { - Status = FatGetNextDirEnt (OFile, &DirEnt); - if ((EFI_ERROR (Status)) || - ((Round < 2) && (DirEnt == NULL || !FatIsDotDirEnt (DirEnt))) || - ((Round == 2) && (DirEnt != NULL)) - ) { - Status = EFI_ACCESS_DENIED; - goto Done; - } - } - } - // - // Return the file's space by setting its size to 0 - // - FatTruncateOFile (OFile, 0); - // - // Free the directory entry for this file - // - Status = FatRemoveDirEnt (OFile->Parent, OFile->DirEnt); - if (EFI_ERROR (Status)) { - goto Done; - } - // - // Set a permanent error for this OFile in case there - // are still opened IFiles attached - // - OFile->Error = EFI_NOT_FOUND; - } else if (OFile->Error == EFI_NOT_FOUND) { - Status = EFI_SUCCESS; - } - -Done: - // - // Always close the handle - // - FatIFileClose (IFile); - // - // Done - // - Status = FatCleanupVolume (OFile->Volume, NULL, Status, NULL); - FatReleaseLock (); - - if (EFI_ERROR (Status)) { - Status = EFI_WARN_DELETE_FAILURE; - } - - return Status; -} diff --git a/FatPkg/EnhancedFatDxe/DirectoryCache.c b/FatPkg/EnhancedFatDxe/DirectoryCache.c deleted file mode 100644 index 30de86a996..0000000000 --- a/FatPkg/EnhancedFatDxe/DirectoryCache.c +++ /dev/null @@ -1,190 +0,0 @@ -/** @file - Functions for directory cache operation. - -Copyright (c) 2005, Intel Corporation. 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 "Fat.h" - -/** - - Free the directory structure and release the memory. - - @param ODir - The directory to be freed. - -**/ -STATIC -VOID -FatFreeODir ( - IN FAT_ODIR *ODir - ) -{ - FAT_DIRENT *DirEnt; - - // - // Release Directory Entry Nodes - // - while (!IsListEmpty (&ODir->ChildList)) { - DirEnt = DIRENT_FROM_LINK (ODir->ChildList.ForwardLink); - RemoveEntryList (&DirEnt->Link); - // - // Make sure the OFile has been closed - // - ASSERT (DirEnt->OFile == NULL); - FatFreeDirEnt (DirEnt); - } - - FreePool (ODir); -} - -/** - - Allocate the directory structure. - - @param OFile - The corresponding OFile. - -**/ -STATIC -FAT_ODIR * -FatAllocateODir ( - IN FAT_OFILE *OFile - ) -{ - FAT_ODIR *ODir; - - ODir = AllocateZeroPool (sizeof (FAT_ODIR)); - if (ODir != NULL) { - // - // Initialize the directory entry list - // - ODir->Signature = FAT_ODIR_SIGNATURE; - InitializeListHead (&ODir->ChildList); - ODir->CurrentCursor = &ODir->ChildList; - } - - return ODir; -} - -/** - - Discard the directory structure when an OFile will be freed. - Volume will cache this directory if the OFile does not represent a deleted file. - - @param OFile - The OFile whose directory structure is to be discarded. - -**/ -VOID -FatDiscardODir ( - IN FAT_OFILE *OFile - ) -{ - FAT_ODIR *ODir; - FAT_VOLUME *Volume; - - Volume = OFile->Volume; - ODir = OFile->ODir; - if (!OFile->DirEnt->Invalid) { - // - // If OFile does not represent a deleted file, then we will cache the directory - // We use OFile's first cluster as the directory's tag - // - ODir->DirCacheTag = OFile->FileCluster; - InsertHeadList (&Volume->DirCacheList, &ODir->DirCacheLink); - if (Volume->DirCacheCount == FAT_MAX_DIR_CACHE_COUNT) { - // - // Replace the least recent used directory - // - ODir = ODIR_FROM_DIRCACHELINK (Volume->DirCacheList.BackLink); - RemoveEntryList (&ODir->DirCacheLink); - } else { - // - // No need to find a replace - // - Volume->DirCacheCount++; - ODir = NULL; - } - } - // - // Release ODir Structure - // - if (ODir != NULL) { - FatFreeODir (ODir); - } -} - -/** - - - Request the directory structure when an OFile is newly generated. - If the directory structure is cached by volume, then just return this directory; - Otherwise, allocate a new one for OFile. - - @param OFile - The OFile which requests directory structure. - -**/ -VOID -FatRequestODir ( - IN FAT_OFILE *OFile - ) -{ - UINTN DirCacheTag; - FAT_VOLUME *Volume; - FAT_ODIR *ODir; - FAT_ODIR *CurrentODir; - LIST_ENTRY *CurrentODirLink; - - Volume = OFile->Volume; - ODir = NULL; - DirCacheTag = OFile->FileCluster; - for (CurrentODirLink = Volume->DirCacheList.ForwardLink; - CurrentODirLink != &Volume->DirCacheList; - CurrentODirLink = CurrentODirLink->ForwardLink - ) { - CurrentODir = ODIR_FROM_DIRCACHELINK (CurrentODirLink); - if (CurrentODir->DirCacheTag == DirCacheTag) { - RemoveEntryList (&CurrentODir->DirCacheLink); - Volume->DirCacheCount--; - ODir = CurrentODir; - break; - } - } - - if (ODir == NULL) { - // - // This directory is not cached, then allocate a new one - // - ODir = FatAllocateODir (OFile); - } - - OFile->ODir = ODir; -} - -/** - - Clean up all the cached directory structures when the volume is going to be abandoned. - - @param Volume - FAT file system volume. - -**/ -VOID -FatCleanupODirCache ( - IN FAT_VOLUME *Volume - ) -{ - FAT_ODIR *ODir; - while (Volume->DirCacheCount > 0) { - ODir = ODIR_FROM_DIRCACHELINK (Volume->DirCacheList.BackLink); - RemoveEntryList (&ODir->DirCacheLink); - FatFreeODir (ODir); - Volume->DirCacheCount--; - } -} diff --git a/FatPkg/EnhancedFatDxe/DirectoryManage.c b/FatPkg/EnhancedFatDxe/DirectoryManage.c deleted file mode 100644 index fe6fcc9d88..0000000000 --- a/FatPkg/EnhancedFatDxe/DirectoryManage.c +++ /dev/null @@ -1,1397 +0,0 @@ -/** @file - Functions for performing directory entry io. - -Copyright (c) 2005 - 2015, Intel Corporation. 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 "Fat.h" - -/** - - Get a directory entry from disk for the Ofile. - - @param Parent - The parent of the OFile which need to update. - @param IoMode - Indicate whether to read directory entry or write directroy entry. - @param EntryPos - The position of the directory entry to be accessed. - @param Entry - The directory entry read or written. - - @retval EFI_SUCCESS - Access the directory entry sucessfully. - @return other - An error occurred when reading the directory entry. - -**/ -STATIC -EFI_STATUS -FatAccessEntry ( - IN FAT_OFILE *Parent, - IN IO_MODE IoMode, - IN UINTN EntryPos, - IN OUT VOID *Entry - ) -{ - UINTN Position; - UINTN BufferSize; - - Position = EntryPos * sizeof (FAT_DIRECTORY_ENTRY); - if (Position >= Parent->FileSize) { - // - // End of directory - // - ASSERT (IoMode == ReadData); - ((FAT_DIRECTORY_ENTRY *) Entry)->FileName[0] = EMPTY_ENTRY_MARK; - ((FAT_DIRECTORY_ENTRY *) Entry)->Attributes = 0; - return EFI_SUCCESS; - } - - BufferSize = sizeof (FAT_DIRECTORY_ENTRY); - return FatAccessOFile (Parent, IoMode, Position, &BufferSize, Entry, NULL); -} - -/** - - Save the directory entry to disk. - - @param OFile - The parent OFile which needs to update. - @param DirEnt - The directory entry to be saved. - - @retval EFI_SUCCESS - Store the directory entry successfully. - @return other - An error occurred when writing the directory entry. - -**/ -EFI_STATUS -FatStoreDirEnt ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ) -{ - EFI_STATUS Status; - FAT_DIRECTORY_LFN LfnEntry; - UINTN EntryPos; - CHAR16 *LfnBufferPointer; - CHAR16 LfnBuffer[MAX_LFN_ENTRIES * LFN_CHAR_TOTAL + 1]; - UINT8 EntryCount; - UINT8 LfnOrdinal; - - EntryPos = DirEnt->EntryPos; - EntryCount = DirEnt->EntryCount; - // - // Write directory entry - // - Status = FatAccessEntry (OFile, WriteData, EntryPos, &DirEnt->Entry); - if (EFI_ERROR (Status)) { - return Status; - } - - if (--EntryCount > 0) { - // - // Write LFN directory entry - // - SetMem (LfnBuffer, sizeof (CHAR16) * LFN_CHAR_TOTAL * EntryCount, 0xff); - Status = StrCpyS ( - LfnBuffer, - ARRAY_SIZE (LfnBuffer), - DirEnt->FileString - ); - if (EFI_ERROR (Status)) { - return Status; - } - - LfnBufferPointer = LfnBuffer; - LfnEntry.Attributes = FAT_ATTRIBUTE_LFN; - LfnEntry.Type = 0; - LfnEntry.MustBeZero = 0; - LfnEntry.Checksum = FatCheckSum (DirEnt->Entry.FileName); - for (LfnOrdinal = 1; LfnOrdinal <= EntryCount; LfnOrdinal++) { - LfnEntry.Ordinal = LfnOrdinal; - if (LfnOrdinal == EntryCount) { - LfnEntry.Ordinal |= FAT_LFN_LAST; - } - - CopyMem (LfnEntry.Name1, LfnBufferPointer, sizeof (CHAR16) * LFN_CHAR1_LEN); - LfnBufferPointer += LFN_CHAR1_LEN; - CopyMem (LfnEntry.Name2, LfnBufferPointer, sizeof (CHAR16) * LFN_CHAR2_LEN); - LfnBufferPointer += LFN_CHAR2_LEN; - CopyMem (LfnEntry.Name3, LfnBufferPointer, sizeof (CHAR16) * LFN_CHAR3_LEN); - LfnBufferPointer += LFN_CHAR3_LEN; - EntryPos--; - if (DirEnt->Invalid) { - LfnEntry.Ordinal = DELETE_ENTRY_MARK; - } - - Status = FatAccessEntry (OFile, WriteData, EntryPos, &LfnEntry); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - - return EFI_SUCCESS; -} - -/** - - Determine whether the directory entry is "." or ".." entry. - - @param DirEnt - The corresponding directory entry. - - @retval TRUE - The directory entry is "." or ".." directory entry - @retval FALSE - The directory entry is not "." or ".." directory entry - -**/ -BOOLEAN -FatIsDotDirEnt ( - IN FAT_DIRENT *DirEnt - ) -{ - CHAR16 *FileString; - FileString = DirEnt->FileString; - if (StrCmp (FileString, L".") == 0 || StrCmp (FileString, L"..") == 0) { - return TRUE; - } - - return FALSE; -} - -/** - - Set the OFile's cluster info in its directory entry. - - @param OFile - The corresponding OFile. - -**/ -STATIC -VOID -FatSetDirEntCluster ( - IN FAT_OFILE *OFile - ) -{ - UINTN Cluster; - FAT_DIRENT *DirEnt; - - DirEnt = OFile->DirEnt; - Cluster = OFile->FileCluster; - DirEnt->Entry.FileClusterHigh = (UINT16) (Cluster >> 16); - DirEnt->Entry.FileCluster = (UINT16) Cluster; -} - -/** - - Set the OFile's cluster and size info in its directory entry. - - @param OFile - The corresponding OFile. - -**/ -VOID -FatUpdateDirEntClusterSizeInfo ( - IN FAT_OFILE *OFile - ) -{ - ASSERT (OFile->ODir == NULL); - OFile->DirEnt->Entry.FileSize = (UINT32) OFile->FileSize; - FatSetDirEntCluster (OFile); -} - -/** - - Copy all the information of DirEnt2 to DirEnt1 except for 8.3 name. - - @param DirEnt1 - The destination directory entry. - @param DirEnt2 - The source directory entry. - -**/ -VOID -FatCloneDirEnt ( - IN FAT_DIRENT *DirEnt1, - IN FAT_DIRENT *DirEnt2 - ) -{ - UINT8 *Entry1; - UINT8 *Entry2; - Entry1 = (UINT8 *) &DirEnt1->Entry; - Entry2 = (UINT8 *) &DirEnt2->Entry; - CopyMem ( - Entry1 + FAT_ENTRY_INFO_OFFSET, - Entry2 + FAT_ENTRY_INFO_OFFSET, - sizeof (FAT_DIRECTORY_ENTRY) - FAT_ENTRY_INFO_OFFSET - ); -} - -/** - - Get the LFN for the directory entry. - - @param Parent - The parent directory. - @param DirEnt - The directory entry to get LFN. - -**/ -STATIC -VOID -FatLoadLongNameEntry ( - IN FAT_OFILE *Parent, - IN FAT_DIRENT *DirEnt - ) -{ - CHAR16 LfnBuffer[MAX_LFN_ENTRIES * LFN_CHAR_TOTAL + 1]; - CHAR16 *LfnBufferPointer; - CHAR8 *File8Dot3Name; - UINTN EntryPos; - UINT8 LfnOrdinal; - UINT8 LfnChecksum; - FAT_DIRECTORY_LFN LfnEntry; - EFI_STATUS Status; - - EntryPos = DirEnt->EntryPos; - File8Dot3Name = DirEnt->Entry.FileName; - LfnBufferPointer = LfnBuffer; - // - // Computes checksum for LFN - // - LfnChecksum = FatCheckSum (File8Dot3Name); - LfnOrdinal = 1; - do { - if (EntryPos == 0) { - LfnBufferPointer = LfnBuffer; - break; - } - - EntryPos--; - Status = FatAccessEntry (Parent, ReadData, EntryPos, &LfnEntry); - if (EFI_ERROR (Status) || - LfnEntry.Attributes != FAT_ATTRIBUTE_LFN || - LfnEntry.MustBeZero != 0 || - LfnEntry.Checksum != LfnChecksum || - (LfnEntry.Ordinal & (~FAT_LFN_LAST)) != LfnOrdinal || - LfnOrdinal > MAX_LFN_ENTRIES - ) { - // - // The directory entry does not have a long file name or - // some error occurs when loading long file name for a directory entry, - // and then we load the long name from short name - // - LfnBufferPointer = LfnBuffer; - break; - } - - CopyMem (LfnBufferPointer, LfnEntry.Name1, sizeof (CHAR16) * LFN_CHAR1_LEN); - LfnBufferPointer += LFN_CHAR1_LEN; - CopyMem (LfnBufferPointer, LfnEntry.Name2, sizeof (CHAR16) * LFN_CHAR2_LEN); - LfnBufferPointer += LFN_CHAR2_LEN; - CopyMem (LfnBufferPointer, LfnEntry.Name3, sizeof (CHAR16) * LFN_CHAR3_LEN); - LfnBufferPointer += LFN_CHAR3_LEN; - LfnOrdinal++; - } while ((LfnEntry.Ordinal & FAT_LFN_LAST) == 0); - DirEnt->EntryCount = LfnOrdinal; - // - // Terminate current Lfnbuffer - // - *LfnBufferPointer = 0; - if (LfnBufferPointer == LfnBuffer) { - // - // Fail to get the long file name from long file name entry, - // get the file name from short name - // - FatGetFileNameViaCaseFlag ( - DirEnt, - LfnBuffer, - ARRAY_SIZE (LfnBuffer) - ); - } - - DirEnt->FileString = AllocateCopyPool (StrSize (LfnBuffer), LfnBuffer); -} - -/** - - Add this directory entry node to the list of directory entries and hash table. - - @param ODir - The parent OFile which needs to be updated. - @param DirEnt - The directory entry to be added. - -**/ -STATIC -VOID -FatAddDirEnt ( - IN FAT_ODIR *ODir, - IN FAT_DIRENT *DirEnt - ) -{ - if (DirEnt->Link.BackLink == NULL) { - DirEnt->Link.BackLink = &ODir->ChildList; - } - InsertTailList (DirEnt->Link.BackLink, &DirEnt->Link); - FatInsertToHashTable (ODir, DirEnt); -} - -/** - - Load from disk the next directory entry at current end of directory position. - - @param OFile - The parent OFile. - @param PtrDirEnt - The directory entry that is loaded. - - @retval EFI_SUCCESS - Load the directory entry successfully. - @retval EFI_OUT_OF_RESOURCES - Out of resource. - @return other - An error occurred when reading the directory entries. - -**/ -STATIC -EFI_STATUS -FatLoadNextDirEnt ( - IN FAT_OFILE *OFile, - OUT FAT_DIRENT **PtrDirEnt - ) -{ - EFI_STATUS Status; - FAT_DIRENT *DirEnt; - FAT_ODIR *ODir; - FAT_DIRECTORY_ENTRY Entry; - - ODir = OFile->ODir; - // - // Make sure the parent's directory has been opened - // - ASSERT (ODir != NULL); - // - // Assert we have not reached the end of directory - // - ASSERT (!ODir->EndOfDir); - DirEnt = NULL; - - for (;;) { - // - // Read the next directory entry until we find a valid directory entry (excluding lfn entry) - // - Status = FatAccessEntry (OFile, ReadData, ODir->CurrentEndPos, &Entry); - if (EFI_ERROR (Status)) { - return Status; - } - - if (((UINT8) Entry.FileName[0] != DELETE_ENTRY_MARK) && (Entry.Attributes & FAT_ATTRIBUTE_VOLUME_ID) == 0) { - // - // We get a valid directory entry, then handle it - // - break; - } - - ODir->CurrentEndPos++; - } - - if (Entry.FileName[0] != EMPTY_ENTRY_MARK) { - // - // Although FAT spec states this field is always 0 for FAT12 & FAT16, some applications - // might use it for some special usage, it is safer to zero it in memory for FAT12 & FAT16. - // - if (OFile->Volume->FatType != Fat32) { - Entry.FileClusterHigh = 0; - } - - // - // This is a valid directory entry - // - DirEnt = AllocateZeroPool (sizeof (FAT_DIRENT)); - if (DirEnt == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - DirEnt->Signature = FAT_DIRENT_SIGNATURE; - // - // Remember the directory's entry position on disk - // - DirEnt->EntryPos = (UINT16) ODir->CurrentEndPos; - CopyMem (&DirEnt->Entry, &Entry, sizeof (FAT_DIRECTORY_ENTRY)); - FatLoadLongNameEntry (OFile, DirEnt); - if (DirEnt->FileString == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - // - // Add this directory entry to directory - // - FatAddDirEnt (ODir, DirEnt); - // - // Point to next directory entry - // - ODir->CurrentEndPos++; - } else { - ODir->EndOfDir = TRUE; - } - - *PtrDirEnt = DirEnt; - return EFI_SUCCESS; - -Done: - FatFreeDirEnt (DirEnt); - return Status; -} - -/** - - Get the directory entry's info into Buffer. - - @param Volume - FAT file system volume. - @param DirEnt - The corresponding directory entry. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing file info. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_BUFFER_TOO_SMALL - The buffer is too small. - -**/ -EFI_STATUS -FatGetDirEntInfo ( - IN FAT_VOLUME *Volume, - IN FAT_DIRENT *DirEnt, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - UINTN Size; - UINTN NameSize; - UINTN ResultSize; - UINTN Cluster; - EFI_STATUS Status; - EFI_FILE_INFO *Info; - FAT_DIRECTORY_ENTRY *Entry; - FAT_DATE_TIME FatLastAccess; - - ASSERT_VOLUME_LOCKED (Volume); - - Size = SIZE_OF_EFI_FILE_INFO; - NameSize = StrSize (DirEnt->FileString); - ResultSize = Size + NameSize; - - Status = EFI_BUFFER_TOO_SMALL; - if (*BufferSize >= ResultSize) { - Status = EFI_SUCCESS; - Entry = &DirEnt->Entry; - Info = Buffer; - Info->Size = ResultSize; - if ((Entry->Attributes & FAT_ATTRIBUTE_DIRECTORY) != 0) { - Cluster = (Entry->FileClusterHigh << 16) | Entry->FileCluster; - Info->PhysicalSize = FatPhysicalDirSize (Volume, Cluster); - Info->FileSize = Info->PhysicalSize; - } else { - Info->FileSize = Entry->FileSize; - Info->PhysicalSize = FatPhysicalFileSize (Volume, Entry->FileSize); - } - - ZeroMem (&FatLastAccess.Time, sizeof (FatLastAccess.Time)); - CopyMem (&FatLastAccess.Date, &Entry->FileLastAccess, sizeof (FatLastAccess.Date)); - FatFatTimeToEfiTime (&FatLastAccess, &Info->LastAccessTime); - FatFatTimeToEfiTime (&Entry->FileCreateTime, &Info->CreateTime); - FatFatTimeToEfiTime (&Entry->FileModificationTime, &Info->ModificationTime); - Info->Attribute = Entry->Attributes & EFI_FILE_VALID_ATTR; - CopyMem ((CHAR8 *) Buffer + Size, DirEnt->FileString, NameSize); - } - - *BufferSize = ResultSize; - return Status; -} - -/** - - Search the directory for the directory entry whose filename is FileNameString. - - @param OFile - The parent OFile whose directory is to be searched. - @param FileNameString - The filename to be searched. - @param PtrDirEnt - pointer to the directory entry if found. - - @retval EFI_SUCCESS - Find the directory entry or not found. - @return other - An error occurred when reading the directory entries. - -**/ -STATIC -EFI_STATUS -FatSearchODir ( - IN FAT_OFILE *OFile, - IN CHAR16 *FileNameString, - OUT FAT_DIRENT **PtrDirEnt - ) -{ - BOOLEAN PossibleShortName; - CHAR8 File8Dot3Name[FAT_NAME_LEN]; - FAT_ODIR *ODir; - FAT_DIRENT *DirEnt; - EFI_STATUS Status; - - ODir = OFile->ODir; - ASSERT (ODir != NULL); - // - // Check if the file name is a valid short name - // - PossibleShortName = FatCheckIs8Dot3Name (FileNameString, File8Dot3Name); - // - // Search the hash table first - // - DirEnt = *FatLongNameHashSearch (ODir, FileNameString); - if (DirEnt == NULL && PossibleShortName) { - DirEnt = *FatShortNameHashSearch (ODir, File8Dot3Name); - } - if (DirEnt == NULL) { - // - // We fail to get the directory entry from hash table; we then - // search the rest directory - // - while (!ODir->EndOfDir) { - Status = FatLoadNextDirEnt (OFile, &DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - if (DirEnt != NULL) { - if (FatStriCmp (FileNameString, DirEnt->FileString) == 0) { - break; - } - - if (PossibleShortName && CompareMem (File8Dot3Name, DirEnt->Entry.FileName, FAT_NAME_LEN) == 0) { - break; - } - } - } - } - - *PtrDirEnt = DirEnt; - return EFI_SUCCESS; -} - -/** - - Set the OFile's current directory cursor to the list head. - - @param OFile - The directory OFile whose directory cursor is reset. - -**/ -VOID -FatResetODirCursor ( - IN FAT_OFILE *OFile - ) -{ - FAT_ODIR *ODir; - - ODir = OFile->ODir; - ASSERT (ODir != NULL); - ODir->CurrentCursor = &(ODir->ChildList); - ODir->CurrentPos = 0; -} - -/** - - Set the directory's cursor to the next and get the next directory entry. - - @param OFile - The parent OFile. - @param PtrDirEnt - The next directory entry. - - @retval EFI_SUCCESS - We get the next directory entry successfully. - @return other - An error occurred when get next directory entry. - -**/ -EFI_STATUS -FatGetNextDirEnt ( - IN FAT_OFILE *OFile, - OUT FAT_DIRENT **PtrDirEnt - ) -{ - EFI_STATUS Status; - FAT_DIRENT *DirEnt; - FAT_ODIR *ODir; - - ODir = OFile->ODir; - ASSERT (ODir != NULL); - if (ODir->CurrentCursor->ForwardLink == &ODir->ChildList) { - // - // End of directory, we will try one more time - // - if (!ODir->EndOfDir) { - // - // Read directory from disk - // - Status = FatLoadNextDirEnt (OFile, &DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - - if (ODir->CurrentCursor->ForwardLink == &ODir->ChildList) { - // - // End of directory, return NULL - // - DirEnt = NULL; - ODir->CurrentPos = ODir->CurrentEndPos; - } else { - ODir->CurrentCursor = ODir->CurrentCursor->ForwardLink; - DirEnt = DIRENT_FROM_LINK (ODir->CurrentCursor); - ODir->CurrentPos = DirEnt->EntryPos + 1; - } - - *PtrDirEnt = DirEnt; - return EFI_SUCCESS; -} - -/** - - Set the directory entry count according to the filename. - - @param OFile - The corresponding OFile. - @param DirEnt - The directory entry to be set. - -**/ -STATIC -VOID -FatSetEntryCount ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ) -{ - CHAR16 *FileString; - CHAR8 *File8Dot3Name; - - // - // Get new entry count and set the 8.3 name - // - DirEnt->EntryCount = 1; - FileString = DirEnt->FileString; - File8Dot3Name = DirEnt->Entry.FileName; - SetMem (File8Dot3Name, FAT_NAME_LEN, ' '); - if (StrCmp (FileString, L".") == 0) { - // - // "." entry - // - File8Dot3Name[0] = '.'; - FatCloneDirEnt (DirEnt, OFile->DirEnt); - } else if (StrCmp (FileString, L"..") == 0) { - // - // ".." entry - // - File8Dot3Name[0] = '.'; - File8Dot3Name[1] = '.'; - FatCloneDirEnt (DirEnt, OFile->Parent->DirEnt); - } else { - // - // Normal name - // - if (FatCheckIs8Dot3Name (FileString, File8Dot3Name)) { - // - // This file name is a valid 8.3 file name, we need to further check its case flag - // - FatSetCaseFlag (DirEnt); - } else { - // - // The file name is not a valid 8.3 name we need to generate an 8.3 name for it - // - FatCreate8Dot3Name (OFile, DirEnt); - DirEnt->EntryCount = (UINT8)(LFN_ENTRY_NUMBER (StrLen (FileString)) + DirEnt->EntryCount); - } - } -} - -/** - - Append a zero cluster to the current OFile. - - @param OFile - The directory OFile which needs to be updated. - - @retval EFI_SUCCESS - Append a zero cluster to the OFile successfully. - @return other - An error occurred when appending the zero cluster. - -**/ -STATIC -EFI_STATUS -FatExpandODir ( - IN FAT_OFILE *OFile - ) -{ - return FatExpandOFile (OFile, OFile->FileSize + OFile->Volume->ClusterSize); -} - -/** - - Search the Root OFile for the possible volume label. - - @param Root - The Root OFile. - @param DirEnt - The returned directory entry of volume label. - - @retval EFI_SUCCESS - The search process is completed successfully. - @return other - An error occurred when searching volume label. - -**/ -STATIC -EFI_STATUS -FatSeekVolumeId ( - IN FAT_OFILE *Root, - OUT FAT_DIRENT *DirEnt - ) -{ - EFI_STATUS Status; - UINTN EntryPos; - FAT_DIRECTORY_ENTRY *Entry; - - EntryPos = 0; - Entry = &DirEnt->Entry; - DirEnt->Invalid = TRUE; - do { - Status = FatAccessEntry (Root, ReadData, EntryPos, Entry); - if (EFI_ERROR (Status)) { - return Status; - } - - if (((UINT8) Entry->FileName[0] != DELETE_ENTRY_MARK) && (((Entry->Attributes) & (~FAT_ATTRIBUTE_ARCHIVE)) == FAT_ATTRIBUTE_VOLUME_ID)) { - DirEnt->EntryPos = (UINT16) EntryPos; - DirEnt->EntryCount = 1; - DirEnt->Invalid = FALSE; - break; - } - - EntryPos++; - } while (Entry->FileName[0] != EMPTY_ENTRY_MARK); - return EFI_SUCCESS; -} - -/** - - Use First Fit Algorithm to insert directory entry. - Only this function will erase "E5" entries in a directory. - In view of safest recovery, this function will only be triggered - when maximum directory entry number has reached. - - @param OFile - The corresponding OFile. - @param DirEnt - The directory entry to be inserted. - - @retval EFI_SUCCESS - The directory entry has been successfully inserted. - @retval EFI_VOLUME_FULL - The directory can not hold more directory entries. - @return Others - Some error occurred when inserting new directory entries. - -**/ -STATIC -EFI_STATUS -FatFirstFitInsertDirEnt ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ) -{ - EFI_STATUS Status; - FAT_ODIR *ODir; - LIST_ENTRY *CurrentEntry; - FAT_DIRENT *CurrentDirEnt; - UINT32 CurrentPos; - UINT32 LabelPos; - UINT32 NewEntryPos; - UINT16 EntryCount; - FAT_DIRENT LabelDirEnt; - - LabelPos = 0; - if (OFile->Parent == NULL) { - Status = FatSeekVolumeId (OFile, &LabelDirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - if (!LabelDirEnt.Invalid) { - LabelPos = LabelDirEnt.EntryPos; - } - } - - EntryCount = DirEnt->EntryCount; - NewEntryPos = EntryCount; - CurrentPos = 0; - ODir = OFile->ODir; - for (CurrentEntry = ODir->ChildList.ForwardLink; - CurrentEntry != &ODir->ChildList; - CurrentEntry = CurrentEntry->ForwardLink - ) { - CurrentDirEnt = DIRENT_FROM_LINK (CurrentEntry); - if (NewEntryPos + CurrentDirEnt->EntryCount <= CurrentDirEnt->EntryPos) { - if (LabelPos > NewEntryPos || LabelPos <= CurrentPos) { - // - // first fit succeeded - // - goto Done; - } - } - - CurrentPos = CurrentDirEnt->EntryPos; - NewEntryPos = CurrentPos + EntryCount; - } - - if (NewEntryPos >= ODir->CurrentEndPos) { - return EFI_VOLUME_FULL; - } - -Done: - DirEnt->EntryPos = (UINT16) NewEntryPos; - DirEnt->Link.BackLink = CurrentEntry; - return EFI_SUCCESS; -} - -/** - - Find the new directory entry position for the directory entry. - - @param OFile - The corresponding OFile. - @param DirEnt - The directory entry whose new position is to be set. - - @retval EFI_SUCCESS - The new directory entry position is successfully found. - @retval EFI_VOLUME_FULL - The directory has reach its maximum capacity. - @return other - An error occurred when reading the directory entry. - -**/ -STATIC -EFI_STATUS -FatNewEntryPos ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ) -{ - EFI_STATUS Status; - FAT_ODIR *ODir; - FAT_DIRENT *TempDirEnt; - UINT32 NewEndPos; - - ODir = OFile->ODir; - ASSERT (ODir != NULL); - // - // Make sure the whole directory has been loaded - // - while (!ODir->EndOfDir) { - Status = FatLoadNextDirEnt (OFile, &TempDirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - } - // - // We will append this entry to the end of directory - // - FatGetCurrentFatTime (&DirEnt->Entry.FileCreateTime); - CopyMem (&DirEnt->Entry.FileModificationTime, &DirEnt->Entry.FileCreateTime, sizeof (FAT_DATE_TIME)); - CopyMem (&DirEnt->Entry.FileLastAccess, &DirEnt->Entry.FileCreateTime.Date, sizeof (FAT_DATE)); - NewEndPos = ODir->CurrentEndPos + DirEnt->EntryCount; - if (NewEndPos * sizeof (FAT_DIRECTORY_ENTRY) > OFile->FileSize) { - if (NewEndPos >= (OFile->IsFixedRootDir ? OFile->Volume->RootEntries : FAT_MAX_DIRENTRY_COUNT)) { - // - // We try to use fist fit algorithm to insert this directory entry - // - return FatFirstFitInsertDirEnt (OFile, DirEnt); - } - // - // We should allocate a new cluster for this directory - // - Status = FatExpandODir (OFile); - if (EFI_ERROR (Status)) { - return Status; - } - } - // - // We append our directory entry at the end of directory file - // - ODir->CurrentEndPos = NewEndPos; - DirEnt->EntryPos = (UINT16) (ODir->CurrentEndPos - 1); - return EFI_SUCCESS; -} - -/** - - Get the directory entry for the volume. - - @param Volume - FAT file system volume. - @param Name - The file name of the volume. - - @retval EFI_SUCCESS - Update the volume with the directory entry sucessfully. - @return others - An error occurred when getting volume label. - -**/ -EFI_STATUS -FatGetVolumeEntry ( - IN FAT_VOLUME *Volume, - IN CHAR16 *Name - ) -{ - EFI_STATUS Status; - FAT_DIRENT LabelDirEnt; - - *Name = 0; - Status = FatSeekVolumeId (Volume->Root, &LabelDirEnt); - if (!EFI_ERROR (Status)) { - if (!LabelDirEnt.Invalid) { - FatNameToStr (LabelDirEnt.Entry.FileName, FAT_NAME_LEN, FALSE, Name); - } - } - - return Status; -} - -/** - - Set the relevant directory entry into disk for the volume. - - @param Volume - FAT file system volume. - @param Name - The new file name of the volume. - - @retval EFI_SUCCESS - Update the Volume sucessfully. - @retval EFI_UNSUPPORTED - The input label is not a valid volume label. - @return other - An error occurred when setting volume label. - -**/ -EFI_STATUS -FatSetVolumeEntry ( - IN FAT_VOLUME *Volume, - IN CHAR16 *Name - ) -{ - EFI_STATUS Status; - FAT_DIRENT LabelDirEnt; - FAT_OFILE *Root; - - Root = Volume->Root; - Status = FatSeekVolumeId (Volume->Root, &LabelDirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - if (LabelDirEnt.Invalid) { - // - // If there is not the relevant directory entry, create a new one - // - ZeroMem (&LabelDirEnt, sizeof (FAT_DIRENT)); - LabelDirEnt.EntryCount = 1; - Status = FatNewEntryPos (Root, &LabelDirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - LabelDirEnt.Entry.Attributes = FAT_ATTRIBUTE_VOLUME_ID; - } - - SetMem (LabelDirEnt.Entry.FileName, FAT_NAME_LEN, ' '); - if (FatStrToFat (Name, FAT_NAME_LEN, LabelDirEnt.Entry.FileName)) { - return EFI_UNSUPPORTED; - } - - FatGetCurrentFatTime (&LabelDirEnt.Entry.FileModificationTime); - return FatStoreDirEnt (Root, &LabelDirEnt); -} - -/** - - Create "." and ".." directory entries in the newly-created parent OFile. - - @param OFile - The parent OFile. - - @retval EFI_SUCCESS - The dot directory entries are successfully created. - @return other - An error occurred when creating the directory entry. - -**/ -EFI_STATUS -FatCreateDotDirEnts ( - IN FAT_OFILE *OFile - ) -{ - EFI_STATUS Status; - FAT_DIRENT *DirEnt; - - Status = FatExpandODir (OFile); - if (EFI_ERROR (Status)) { - return Status; - } - - FatSetDirEntCluster (OFile); - // - // Create "." - // - Status = FatCreateDirEnt (OFile, L".", FAT_ATTRIBUTE_DIRECTORY, &DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - // - // Create ".." - // - Status = FatCreateDirEnt (OFile, L"..", FAT_ATTRIBUTE_DIRECTORY, &DirEnt); - return Status; -} - -/** - - Create a directory entry in the parent OFile. - - @param OFile - The parent OFile. - @param FileName - The filename of the newly-created directory entry. - @param Attributes - The attribute of the newly-created directory entry. - @param PtrDirEnt - The pointer to the newly-created directory entry. - - @retval EFI_SUCCESS - The directory entry is successfully created. - @retval EFI_OUT_OF_RESOURCES - Not enough memory to create the directory entry. - @return other - An error occurred when creating the directory entry. - -**/ -EFI_STATUS -FatCreateDirEnt ( - IN FAT_OFILE *OFile, - IN CHAR16 *FileName, - IN UINT8 Attributes, - OUT FAT_DIRENT **PtrDirEnt - ) -{ - FAT_DIRENT *DirEnt; - FAT_ODIR *ODir; - EFI_STATUS Status; - - ASSERT (OFile != NULL); - ODir = OFile->ODir; - ASSERT (ODir != NULL); - DirEnt = AllocateZeroPool (sizeof (FAT_DIRENT)); - if (DirEnt == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - DirEnt->Signature = FAT_DIRENT_SIGNATURE; - DirEnt->FileString = AllocateCopyPool (StrSize (FileName), FileName); - if (DirEnt->FileString == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - // - // Determine how many directory entries we need - // - FatSetEntryCount (OFile, DirEnt); - // - // Determine the file's directory entry position - // - Status = FatNewEntryPos (OFile, DirEnt); - if (EFI_ERROR (Status)) { - goto Done; - } - - FatAddDirEnt (ODir, DirEnt); - DirEnt->Entry.Attributes = Attributes; - *PtrDirEnt = DirEnt; - DEBUG ((EFI_D_INFO, "FSOpen: Created new directory entry '%S'\n", DirEnt->FileString)); - return FatStoreDirEnt (OFile, DirEnt); - -Done: - FatFreeDirEnt (DirEnt); - return Status; -} - -/** - - Remove this directory entry node from the list of directory entries and hash table. - - @param OFile - The parent OFile. - @param DirEnt - The directory entry to be removed. - - @retval EFI_SUCCESS - The directory entry is successfully removed. - @return other - An error occurred when removing the directory entry. - -**/ -EFI_STATUS -FatRemoveDirEnt ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ) -{ - FAT_ODIR *ODir; - - ODir = OFile->ODir; - if (ODir->CurrentCursor == &DirEnt->Link) { - // - // Move the directory cursor to its previous directory entry - // - ODir->CurrentCursor = ODir->CurrentCursor->BackLink; - } - // - // Remove from directory entry list - // - RemoveEntryList (&DirEnt->Link); - // - // Remove from hash table - // - FatDeleteFromHashTable (ODir, DirEnt); - DirEnt->Entry.FileName[0] = DELETE_ENTRY_MARK; - DirEnt->Invalid = TRUE; - return FatStoreDirEnt (OFile, DirEnt); -} - -/** - - Open the directory entry to get the OFile. - - @param Parent - The parent OFile. - @param DirEnt - The directory entry to be opened. - - @retval EFI_SUCCESS - The directory entry is successfully opened. - @retval EFI_OUT_OF_RESOURCES - not enough memory to allocate a new OFile. - @return other - An error occurred when opening the directory entry. - -**/ -EFI_STATUS -FatOpenDirEnt ( - IN FAT_OFILE *Parent, - IN FAT_DIRENT *DirEnt - ) -{ - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - - if (DirEnt->OFile == NULL) { - // - // Open the directory entry - // - OFile = AllocateZeroPool (sizeof (FAT_OFILE)); - if (OFile == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - OFile->Signature = FAT_OFILE_SIGNATURE; - InitializeListHead (&OFile->Opens); - InitializeListHead (&OFile->ChildHead); - OFile->Parent = Parent; - OFile->DirEnt = DirEnt; - if (Parent != NULL) { - // - // The newly created OFile is not root - // - Volume = Parent->Volume; - OFile->FullPathLen = Parent->FullPathLen + 1 + StrLen (DirEnt->FileString); - OFile->FileCluster = ((DirEnt->Entry.FileClusterHigh) << 16) | (DirEnt->Entry.FileCluster); - InsertTailList (&Parent->ChildHead, &OFile->ChildLink); - } else { - // - // The newly created OFile is root - // - Volume = VOLUME_FROM_ROOT_DIRENT (DirEnt); - Volume->Root = OFile; - OFile->FileCluster = Volume->RootCluster; - if (Volume->FatType != Fat32) { - OFile->IsFixedRootDir = TRUE; - } - } - - OFile->FileCurrentCluster = OFile->FileCluster; - OFile->Volume = Volume; - InsertHeadList (&Volume->CheckRef, &OFile->CheckLink); - - OFile->FileSize = DirEnt->Entry.FileSize; - if ((DirEnt->Entry.Attributes & FAT_ATTRIBUTE_DIRECTORY) != 0) { - if (OFile->IsFixedRootDir) { - OFile->FileSize = Volume->RootEntries * sizeof (FAT_DIRECTORY_ENTRY); - } else { - OFile->FileSize = FatPhysicalDirSize (Volume, OFile->FileCluster); - } - - FatRequestODir (OFile); - if (OFile->ODir == NULL) { - return EFI_OUT_OF_RESOURCES; - } - } - - DirEnt->OFile = OFile; - } - - return EFI_SUCCESS; -} - -/** - - Close the directory entry and free the OFile. - - @param DirEnt - The directory entry to be closed. - -**/ -VOID -FatCloseDirEnt ( - IN FAT_DIRENT *DirEnt - ) -{ - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - - OFile = DirEnt->OFile; - ASSERT (OFile != NULL); - Volume = OFile->Volume; - - if (OFile->ODir != NULL) { - FatDiscardODir (OFile); - } - - if (OFile->Parent == NULL) { - Volume->Root = NULL; - } else { - RemoveEntryList (&OFile->ChildLink); - } - - FreePool (OFile); - DirEnt->OFile = NULL; - if (DirEnt->Invalid == TRUE) { - // - // Free directory entry itself - // - FatFreeDirEnt (DirEnt); - } -} - -/** - - Traverse filename and open all OFiles that can be opened. - Update filename pointer to the component that can't be opened. - If more than one name component remains, returns an error; - otherwise, return the remaining name component so that the caller might choose to create it. - - @param PtrOFile - As input, the reference OFile; as output, the located OFile. - @param FileName - The file name relevant to the OFile. - @param Attributes - The attribute of the destination OFile. - @param NewFileName - The remaining file name. - - @retval EFI_NOT_FOUND - The file name can't be opened and there is more than one - components within the name left (this means the name can - not be created either). - @retval EFI_INVALID_PARAMETER - The parameter is not valid. - @retval EFI_SUCCESS - Open the file successfully. - @return other - An error occured when locating the OFile. - -**/ -EFI_STATUS -FatLocateOFile ( - IN OUT FAT_OFILE **PtrOFile, - IN CHAR16 *FileName, - IN UINT8 Attributes, - OUT CHAR16 *NewFileName - ) -{ - EFI_STATUS Status; - FAT_VOLUME *Volume; - CHAR16 ComponentName[EFI_PATH_STRING_LENGTH]; - UINTN FileNameLen; - BOOLEAN DirIntended; - CHAR16 *Next; - FAT_OFILE *OFile; - FAT_DIRENT *DirEnt; - - DirEnt = NULL; - - FileNameLen = StrLen (FileName); - if (FileNameLen == 0) { - return EFI_INVALID_PARAMETER; - } - - OFile = *PtrOFile; - Volume = OFile->Volume; - - DirIntended = FALSE; - if (FileName[FileNameLen - 1] == PATH_NAME_SEPARATOR) { - DirIntended = TRUE; - } - // - // If name starts with path name separator, then move to root OFile - // - if (*FileName == PATH_NAME_SEPARATOR) { - OFile = Volume->Root; - FileName++; - FileNameLen--; - } - // - // Per FAT Spec the file name should meet the following criteria: - // C1. Length (FileLongName) <= 255 - // C2. Length (X:FileFullPath) <= 260 - // Here we check C2 first. - // - if (2 + OFile->FullPathLen + 1 + FileNameLen + 1 > EFI_PATH_STRING_LENGTH) { - // - // Full path length can not surpass 256 - // - return EFI_INVALID_PARAMETER; - } - // - // Start at current location - // - Next = FileName; - for (;;) { - // - // Get the next component name - // - FileName = Next; - Next = FatGetNextNameComponent (FileName, ComponentName); - - // - // If end of the file name, we're done - // - if (ComponentName[0] == 0) { - if (DirIntended && OFile->ODir == NULL) { - return EFI_NOT_FOUND; - } - - NewFileName[0] = 0; - break; - } - // - // If "dot", then current - // - if (StrCmp (ComponentName, L".") == 0) { - continue; - } - // - // If "dot dot", then parent - // - if (StrCmp (ComponentName, L"..") == 0) { - if (OFile->Parent == NULL) { - return EFI_INVALID_PARAMETER; - } - OFile = OFile->Parent; - continue; - } - - if (!FatFileNameIsValid (ComponentName, NewFileName)) { - return EFI_INVALID_PARAMETER; - } - // - // We have a component name, try to open it - // - if (OFile->ODir == NULL) { - // - // This file isn't a directory, can't open it - // - return EFI_NOT_FOUND; - } - // - // Search the compName in the directory - // - Status = FatSearchODir (OFile, NewFileName, &DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - if (DirEnt == NULL) { - // - // component name is not found in the directory - // - if (*Next != 0) { - return EFI_NOT_FOUND; - } - - if (DirIntended && (Attributes & FAT_ATTRIBUTE_DIRECTORY) == 0) { - return EFI_INVALID_PARAMETER; - } - // - // It's the last component name - return with the open - // path and the remaining name - // - break; - } - - Status = FatOpenDirEnt (OFile, DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - OFile = DirEnt->OFile; - } - - *PtrOFile = OFile; - return EFI_SUCCESS; -} - diff --git a/FatPkg/EnhancedFatDxe/DiskCache.c b/FatPkg/EnhancedFatDxe/DiskCache.c deleted file mode 100644 index 63f9c007d6..0000000000 --- a/FatPkg/EnhancedFatDxe/DiskCache.c +++ /dev/null @@ -1,495 +0,0 @@ -/** @file - Cache implementation for EFI FAT File system driver. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - -/** - - This function is used by the Data Cache. - - When this function is called by write command, all entries in this range - are older than the contents in disk, so they are invalid; just mark them invalid. - - When this function is called by read command, if any entry in this range - is dirty, it means that the relative info directly readed from media is older than - than the info in the cache; So need to update the relative info in the Buffer. - - @param Volume - FAT file system volume. - @param IoMode - This function is called by read command or write command - @param StartPageNo - First PageNo to be checked in the cache. - @param EndPageNo - Last PageNo to be checked in the cache. - @param Buffer - The user buffer need to update. Only when doing the read command - and there is dirty cache in the cache range, this parameter will be used. - -**/ -STATIC -VOID -FatFlushDataCacheRange ( - IN FAT_VOLUME *Volume, - IN IO_MODE IoMode, - IN UINTN StartPageNo, - IN UINTN EndPageNo, - OUT UINT8 *Buffer - ) -{ - UINTN PageNo; - UINTN GroupNo; - UINTN GroupMask; - UINTN PageSize; - UINT8 PageAlignment; - DISK_CACHE *DiskCache; - CACHE_TAG *CacheTag; - UINT8 *BaseAddress; - - DiskCache = &Volume->DiskCache[CacheData]; - BaseAddress = DiskCache->CacheBase; - GroupMask = DiskCache->GroupMask; - PageAlignment = DiskCache->PageAlignment; - PageSize = (UINTN)1 << PageAlignment; - - for (PageNo = StartPageNo; PageNo < EndPageNo; PageNo++) { - GroupNo = PageNo & GroupMask; - CacheTag = &DiskCache->CacheTag[GroupNo]; - if (CacheTag->RealSize > 0 && CacheTag->PageNo == PageNo) { - // - // When reading data form disk directly, if some dirty data - // in cache is in this rang, this data in the Buffer need to - // be updated with the cache's dirty data. - // - if (IoMode == ReadDisk) { - if (CacheTag->Dirty) { - CopyMem ( - Buffer + ((PageNo - StartPageNo) << PageAlignment), - BaseAddress + (GroupNo << PageAlignment), - PageSize - ); - } - } else { - // - // Make all valid entries in this range invalid. - // - CacheTag->RealSize = 0; - } - } - } -} - -/** - - Exchange the cache page with the image on the disk - - @param Volume - FAT file system volume. - @param DataType - Indicate the cache type. - @param IoMode - Indicate whether to load this page from disk or store this page to disk. - @param CacheTag - The Cache Tag for the current cache page. - @param Task point to task instance. - - @retval EFI_SUCCESS - Cache page exchanged successfully. - @return Others - An error occurred when exchanging cache page. - -**/ -STATIC -EFI_STATUS -FatExchangeCachePage ( - IN FAT_VOLUME *Volume, - IN CACHE_DATA_TYPE DataType, - IN IO_MODE IoMode, - IN CACHE_TAG *CacheTag, - IN FAT_TASK *Task - ) -{ - EFI_STATUS Status; - UINTN GroupNo; - UINTN PageNo; - UINTN WriteCount; - UINTN RealSize; - UINT64 EntryPos; - UINT64 MaxSize; - DISK_CACHE *DiskCache; - VOID *PageAddress; - UINT8 PageAlignment; - - DiskCache = &Volume->DiskCache[DataType]; - PageNo = CacheTag->PageNo; - GroupNo = PageNo & DiskCache->GroupMask; - PageAlignment = DiskCache->PageAlignment; - PageAddress = DiskCache->CacheBase + (GroupNo << PageAlignment); - EntryPos = DiskCache->BaseAddress + LShiftU64 (PageNo, PageAlignment); - RealSize = CacheTag->RealSize; - if (IoMode == ReadDisk) { - RealSize = (UINTN)1 << PageAlignment; - MaxSize = DiskCache->LimitAddress - EntryPos; - if (MaxSize < RealSize) { - DEBUG ((EFI_D_INFO, "FatDiskIo: Cache Page OutBound occurred! \n")); - RealSize = (UINTN) MaxSize; - } - } - - WriteCount = 1; - if (DataType == CacheFat && IoMode == WriteDisk) { - WriteCount = Volume->NumFats; - } - - do { - // - // Only fat table writing will execute more than once - // - Status = FatDiskIo (Volume, IoMode, EntryPos, RealSize, PageAddress, Task); - if (EFI_ERROR (Status)) { - return Status; - } - - EntryPos += Volume->FatSize; - } while (--WriteCount > 0); - - CacheTag->Dirty = FALSE; - CacheTag->RealSize = RealSize; - return EFI_SUCCESS; -} - -/** - - Get one cache page by specified PageNo. - - @param Volume - FAT file system volume. - @param CacheDataType - The cache type: CACHE_FAT or CACHE_DATA. - @param PageNo - PageNo to match with the cache. - @param CacheTag - The Cache Tag for the current cache page. - - @retval EFI_SUCCESS - Get the cache page successfully. - @return other - An error occurred when accessing data. - -**/ -STATIC -EFI_STATUS -FatGetCachePage ( - IN FAT_VOLUME *Volume, - IN CACHE_DATA_TYPE CacheDataType, - IN UINTN PageNo, - IN CACHE_TAG *CacheTag - ) -{ - EFI_STATUS Status; - UINTN OldPageNo; - - OldPageNo = CacheTag->PageNo; - if (CacheTag->RealSize > 0 && OldPageNo == PageNo) { - // - // Cache Hit occurred - // - return EFI_SUCCESS; - } - - // - // Write dirty cache page back to disk - // - if (CacheTag->RealSize > 0 && CacheTag->Dirty) { - Status = FatExchangeCachePage (Volume, CacheDataType, WriteDisk, CacheTag, NULL); - if (EFI_ERROR (Status)) { - return Status; - } - } - // - // Load new data from disk; - // - CacheTag->PageNo = PageNo; - Status = FatExchangeCachePage (Volume, CacheDataType, ReadDisk, CacheTag, NULL); - - return Status; -} - -/** - - Read Length bytes from the position of Offset into Buffer, or - write Length bytes from Buffer into the position of Offset. - - @param Volume - FAT file system volume. - @param CacheDataType - The type of cache: CACHE_DATA or CACHE_FAT. - @param IoMode - Indicate the type of disk access. - @param PageNo - The number of unaligned cache page. - @param Offset - The starting byte of cache page. - @param Length - The number of bytes that is read or written - @param Buffer - Buffer containing cache data. - - @retval EFI_SUCCESS - The data was accessed correctly. - @return Others - An error occurred when accessing unaligned cache page. - -**/ -STATIC -EFI_STATUS -FatAccessUnalignedCachePage ( - IN FAT_VOLUME *Volume, - IN CACHE_DATA_TYPE CacheDataType, - IN IO_MODE IoMode, - IN UINTN PageNo, - IN UINTN Offset, - IN UINTN Length, - IN OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - VOID *Source; - VOID *Destination; - DISK_CACHE *DiskCache; - CACHE_TAG *CacheTag; - UINTN GroupNo; - - DiskCache = &Volume->DiskCache[CacheDataType]; - GroupNo = PageNo & DiskCache->GroupMask; - CacheTag = &DiskCache->CacheTag[GroupNo]; - Status = FatGetCachePage (Volume, CacheDataType, PageNo, CacheTag); - if (!EFI_ERROR (Status)) { - Source = DiskCache->CacheBase + (GroupNo << DiskCache->PageAlignment) + Offset; - Destination = Buffer; - if (IoMode != ReadDisk) { - CacheTag->Dirty = TRUE; - DiskCache->Dirty = TRUE; - Destination = Source; - Source = Buffer; - } - - CopyMem (Destination, Source, Length); - } - - return Status; -} - -/** - - Read BufferSize bytes from the position of Offset into Buffer, - or write BufferSize bytes from Buffer into the position of Offset. - - Base on the parameter of CACHE_DATA_TYPE, the data access will be divided into - the access of FAT cache (CACHE_FAT) and the access of Data cache (CACHE_DATA): - - 1. Access of FAT cache (CACHE_FAT): Access the data in the FAT cache, if there is cache - page hit, just return the cache page; else update the related cache page and return - the right cache page. - 2. Access of Data cache (CACHE_DATA): - The access data will be divided into UnderRun data, Aligned data and OverRun data; - The UnderRun data and OverRun data will be accessed by the Data cache, - but the Aligned data will be accessed with disk directly. - - @param Volume - FAT file system volume. - @param CacheDataType - The type of cache: CACHE_DATA or CACHE_FAT. - @param IoMode - Indicate the type of disk access. - @param Offset - The starting byte offset to read from. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing cache data. - @param Task point to task instance. - - @retval EFI_SUCCESS - The data was accessed correctly. - @retval EFI_MEDIA_CHANGED - The MediaId does not match the current device. - @return Others - An error occurred when accessing cache. - -**/ -EFI_STATUS -FatAccessCache ( - IN FAT_VOLUME *Volume, - IN CACHE_DATA_TYPE CacheDataType, - IN IO_MODE IoMode, - IN UINT64 Offset, - IN UINTN BufferSize, - IN OUT UINT8 *Buffer, - IN FAT_TASK *Task - ) -{ - EFI_STATUS Status; - UINTN PageSize; - UINTN UnderRun; - UINTN OverRun; - UINTN AlignedSize; - UINTN Length; - UINTN PageNo; - UINTN AlignedPageCount; - UINTN OverRunPageNo; - DISK_CACHE *DiskCache; - UINT64 EntryPos; - UINT8 PageAlignment; - - ASSERT (Volume->CacheBuffer != NULL); - - Status = EFI_SUCCESS; - DiskCache = &Volume->DiskCache[CacheDataType]; - EntryPos = Offset - DiskCache->BaseAddress; - PageAlignment = DiskCache->PageAlignment; - PageSize = (UINTN)1 << PageAlignment; - PageNo = (UINTN) RShiftU64 (EntryPos, PageAlignment); - UnderRun = ((UINTN) EntryPos) & (PageSize - 1); - - if (UnderRun > 0) { - Length = PageSize - UnderRun; - if (Length > BufferSize) { - Length = BufferSize; - } - - Status = FatAccessUnalignedCachePage (Volume, CacheDataType, IoMode, PageNo, UnderRun, Length, Buffer); - if (EFI_ERROR (Status)) { - return Status; - } - - Buffer += Length; - BufferSize -= Length; - PageNo++; - } - - AlignedPageCount = BufferSize >> PageAlignment; - OverRunPageNo = PageNo + AlignedPageCount; - // - // The access of the Aligned data - // - if (AlignedPageCount > 0) { - // - // Accessing fat table cannot have alignment data - // - ASSERT (CacheDataType == CacheData); - - EntryPos = Volume->RootPos + LShiftU64 (PageNo, PageAlignment); - AlignedSize = AlignedPageCount << PageAlignment; - Status = FatDiskIo (Volume, IoMode, EntryPos, AlignedSize, Buffer, Task); - if (EFI_ERROR (Status)) { - return Status; - } - // - // If these access data over laps the relative cache range, these cache pages need - // to be updated. - // - FatFlushDataCacheRange (Volume, IoMode, PageNo, OverRunPageNo, Buffer); - Buffer += AlignedSize; - BufferSize -= AlignedSize; - } - // - // The access of the OverRun data - // - OverRun = BufferSize; - if (OverRun > 0) { - // - // Last read is not a complete page - // - Status = FatAccessUnalignedCachePage (Volume, CacheDataType, IoMode, OverRunPageNo, 0, OverRun, Buffer); - } - - return Status; -} - -/** - - Flush all the dirty cache back, include the FAT cache and the Data cache. - - @param Volume - FAT file system volume. - @param Task point to task instance. - - @retval EFI_SUCCESS - Flush all the dirty cache back successfully - @return other - An error occurred when writing the data into the disk - -**/ -EFI_STATUS -FatVolumeFlushCache ( - IN FAT_VOLUME *Volume, - IN FAT_TASK *Task - ) -{ - EFI_STATUS Status; - CACHE_DATA_TYPE CacheDataType; - UINTN GroupIndex; - UINTN GroupMask; - DISK_CACHE *DiskCache; - CACHE_TAG *CacheTag; - - for (CacheDataType = (CACHE_DATA_TYPE) 0; CacheDataType < CacheMaxType; CacheDataType++) { - DiskCache = &Volume->DiskCache[CacheDataType]; - if (DiskCache->Dirty) { - // - // Data cache or fat cache is dirty, write the dirty data back - // - GroupMask = DiskCache->GroupMask; - for (GroupIndex = 0; GroupIndex <= GroupMask; GroupIndex++) { - CacheTag = &DiskCache->CacheTag[GroupIndex]; - if (CacheTag->RealSize > 0 && CacheTag->Dirty) { - // - // Write back all Dirty Data Cache Page to disk - // - Status = FatExchangeCachePage (Volume, CacheDataType, WriteDisk, CacheTag, Task); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - - DiskCache->Dirty = FALSE; - } - } - // - // Flush the block device. - // - Status = Volume->BlockIo->FlushBlocks (Volume->BlockIo); - return Status; -} - -/** - - Initialize the disk cache according to Volume's FatType. - - @param Volume - FAT file system volume. - - @retval EFI_SUCCESS - The disk cache is successfully initialized. - @retval EFI_OUT_OF_RESOURCES - Not enough memory to allocate disk cache. - -**/ -EFI_STATUS -FatInitializeDiskCache ( - IN FAT_VOLUME *Volume - ) -{ - DISK_CACHE *DiskCache; - UINTN FatCacheGroupCount; - UINTN DataCacheSize; - UINTN FatCacheSize; - UINT8 *CacheBuffer; - - DiskCache = Volume->DiskCache; - // - // Configure the parameters of disk cache - // - if (Volume->FatType == Fat12) { - FatCacheGroupCount = FAT_FATCACHE_GROUP_MIN_COUNT; - DiskCache[CacheFat].PageAlignment = FAT_FATCACHE_PAGE_MIN_ALIGNMENT; - DiskCache[CacheData].PageAlignment = FAT_DATACACHE_PAGE_MIN_ALIGNMENT; - } else { - FatCacheGroupCount = FAT_FATCACHE_GROUP_MAX_COUNT; - DiskCache[CacheFat].PageAlignment = FAT_FATCACHE_PAGE_MAX_ALIGNMENT; - DiskCache[CacheData].PageAlignment = FAT_DATACACHE_PAGE_MAX_ALIGNMENT; - } - - DiskCache[CacheData].GroupMask = FAT_DATACACHE_GROUP_COUNT - 1; - DiskCache[CacheData].BaseAddress = Volume->RootPos; - DiskCache[CacheData].LimitAddress = Volume->VolumeSize; - DiskCache[CacheFat].GroupMask = FatCacheGroupCount - 1; - DiskCache[CacheFat].BaseAddress = Volume->FatPos; - DiskCache[CacheFat].LimitAddress = Volume->FatPos + Volume->FatSize; - FatCacheSize = FatCacheGroupCount << DiskCache[CacheFat].PageAlignment; - DataCacheSize = FAT_DATACACHE_GROUP_COUNT << DiskCache[CacheData].PageAlignment; - // - // Allocate the Fat Cache buffer - // - CacheBuffer = AllocateZeroPool (FatCacheSize + DataCacheSize); - if (CacheBuffer == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Volume->CacheBuffer = CacheBuffer; - DiskCache[CacheFat].CacheBase = CacheBuffer; - DiskCache[CacheData].CacheBase = CacheBuffer + FatCacheSize; - return EFI_SUCCESS; -} diff --git a/FatPkg/EnhancedFatDxe/Fat.c b/FatPkg/EnhancedFatDxe/Fat.c deleted file mode 100644 index e29c64cb03..0000000000 --- a/FatPkg/EnhancedFatDxe/Fat.c +++ /dev/null @@ -1,531 +0,0 @@ -/** @file - Fat File System driver routines that support EFI driver model. - -Copyright (c) 2005 - 2014, Intel Corporation. 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 "Fat.h" - -/** - - Register Driver Binding protocol for this driver. - - @param ImageHandle - Handle for the image of this driver. - @param SystemTable - Pointer to the EFI System Table. - - @retval EFI_SUCCESS - Driver loaded. - @return other - Driver not loaded. - -**/ -EFI_STATUS -EFIAPI -FatEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - -/** - - Unload function for this image. Uninstall DriverBinding protocol. - - @param ImageHandle - Handle for the image of this driver. - - @retval EFI_SUCCESS - Driver unloaded successfully. - @return other - Driver can not unloaded. - -**/ -EFI_STATUS -EFIAPI -FatUnload ( - IN EFI_HANDLE ImageHandle - ); - -/** - - Test to see if this driver can add a file system to ControllerHandle. - ControllerHandle must support both Disk IO and Block IO protocols. - - @param This - Protocol instance pointer. - @param ControllerHandle - Handle of device to test. - @param RemainingDevicePath - Not used. - - @retval EFI_SUCCESS - This driver supports this device. - @retval EFI_ALREADY_STARTED - This driver is already running on this device. - @return other - This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -FatDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -/** - - Start this driver on ControllerHandle by opening a Block IO and Disk IO - protocol, reading Device Path. Add a Simple File System protocol to - ControllerHandle if the media contains a valid file system. - - @param This - Protocol instance pointer. - @param ControllerHandle - Handle of device to bind driver to. - @param RemainingDevicePath - Not used. - - @retval EFI_SUCCESS - This driver is added to DeviceHandle. - @retval EFI_ALREADY_STARTED - This driver is already running on DeviceHandle. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - @return other - This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -FatDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -/** - - Stop this driver on ControllerHandle. - - @param This - Protocol instance pointer. - @param ControllerHandle - Handle of device to stop driver on. - @param NumberOfChildren - Not used. - @param ChildHandleBuffer - Not used. - - @retval EFI_SUCCESS - This driver is removed DeviceHandle. - @return other - This driver was not removed from this device. - -**/ -EFI_STATUS -EFIAPI -FatDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -// -// DriverBinding protocol instance -// -EFI_DRIVER_BINDING_PROTOCOL gFatDriverBinding = { - FatDriverBindingSupported, - FatDriverBindingStart, - FatDriverBindingStop, - 0xa, - NULL, - NULL -}; - -/** - - Register Driver Binding protocol for this driver. - - @param ImageHandle - Handle for the image of this driver. - @param SystemTable - Pointer to the EFI System Table. - - @retval EFI_SUCCESS - Driver loaded. - @return other - Driver not loaded. - -**/ -EFI_STATUS -EFIAPI -FatEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - // - // Initialize the EFI Driver Library - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gFatDriverBinding, - ImageHandle, - &gFatComponentName, - &gFatComponentName2 - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -/** - - Unload function for this image. Uninstall DriverBinding protocol. - - @param ImageHandle - Handle for the image of this driver. - - @retval EFI_SUCCESS - Driver unloaded successfully. - @return other - Driver can not unloaded. - -**/ -EFI_STATUS -EFIAPI -FatUnload ( - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - EFI_HANDLE *DeviceHandleBuffer; - UINTN DeviceHandleCount; - UINTN Index; - VOID *ComponentName; - VOID *ComponentName2; - - Status = gBS->LocateHandleBuffer ( - AllHandles, - NULL, - NULL, - &DeviceHandleCount, - &DeviceHandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < DeviceHandleCount; Index++) { - Status = EfiTestManagedDevice (DeviceHandleBuffer[Index], ImageHandle, &gEfiDiskIoProtocolGuid); - if (!EFI_ERROR (Status)) { - Status = gBS->DisconnectController ( - DeviceHandleBuffer[Index], - ImageHandle, - NULL - ); - if (EFI_ERROR (Status)) { - break; - } - } - } - - if (Index == DeviceHandleCount) { - // - // Driver is stopped successfully. - // - Status = gBS->HandleProtocol (ImageHandle, &gEfiComponentNameProtocolGuid, &ComponentName); - if (EFI_ERROR (Status)) { - ComponentName = NULL; - } - - Status = gBS->HandleProtocol (ImageHandle, &gEfiComponentName2ProtocolGuid, &ComponentName2); - if (EFI_ERROR (Status)) { - ComponentName2 = NULL; - } - - if (ComponentName == NULL) { - if (ComponentName2 == NULL) { - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, &gFatDriverBinding, - NULL - ); - } else { - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, &gFatDriverBinding, - &gEfiComponentName2ProtocolGuid, ComponentName2, - NULL - ); - } - } else { - if (ComponentName2 == NULL) { - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, &gFatDriverBinding, - &gEfiComponentNameProtocolGuid, ComponentName, - NULL - ); - } else { - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, &gFatDriverBinding, - &gEfiComponentNameProtocolGuid, ComponentName, - &gEfiComponentName2ProtocolGuid, ComponentName2, - NULL - ); - } - } - } - - if (DeviceHandleBuffer != NULL) { - FreePool (DeviceHandleBuffer); - } - - return Status; -} - -/** - - Test to see if this driver can add a file system to ControllerHandle. - ControllerHandle must support both Disk IO and Block IO protocols. - - @param This - Protocol instance pointer. - @param ControllerHandle - Handle of device to test. - @param RemainingDevicePath - Not used. - - @retval EFI_SUCCESS - This driver supports this device. - @retval EFI_ALREADY_STARTED - This driver is already running on this device. - @return other - This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -FatDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_DISK_IO_PROTOCOL *DiskIo; - - // - // Open the IO Abstraction(s) needed to perform the supported test - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - (VOID **) &DiskIo, - This->DriverBindingHandle, - 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, - This->DriverBindingHandle, - ControllerHandle - ); - - // - // Open the IO Abstraction(s) needed to perform the supported test - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiBlockIoProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - return Status; -} - -/** - - Start this driver on ControllerHandle by opening a Block IO and Disk IO - protocol, reading Device Path. Add a Simple File System protocol to - ControllerHandle if the media contains a valid file system. - - @param This - Protocol instance pointer. - @param ControllerHandle - Handle of device to bind driver to. - @param RemainingDevicePath - Not used. - - @retval EFI_SUCCESS - This driver is added to DeviceHandle. - @retval EFI_ALREADY_STARTED - This driver is already running on DeviceHandle. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - @return other - This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -FatDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_BLOCK_IO_PROTOCOL *BlockIo; - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_DISK_IO2_PROTOCOL *DiskIo2; - BOOLEAN LockedByMe; - - LockedByMe = FALSE; - // - // Acquire the lock. - // If caller has already acquired the lock, cannot lock it again. - // - Status = FatAcquireLockOrFail (); - if (!EFI_ERROR (Status)) { - LockedByMe = TRUE; - } - - Status = InitializeUnicodeCollationSupport (This->DriverBindingHandle); - if (EFI_ERROR (Status)) { - goto Exit; - } - // - // Open our required BlockIo and DiskIo - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiBlockIoProtocolGuid, - (VOID **) &BlockIo, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - goto Exit; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - (VOID **) &DiskIo, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto Exit; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDiskIo2ProtocolGuid, - (VOID **) &DiskIo2, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - DiskIo2 = NULL; - } - - // - // Allocate Volume structure. In FatAllocateVolume(), Resources - // are allocated with protocol installed and cached initialized - // - Status = FatAllocateVolume (ControllerHandle, DiskIo, DiskIo2, BlockIo); - - // - // When the media changes on a device it will Reinstall the BlockIo interaface. - // This will cause a call to our Stop(), and a subsequent reentrant call to our - // Start() successfully. We should leave the device open when this happen. - // - if (EFI_ERROR (Status)) { - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiSimpleFileSystemProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - gBS->CloseProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - gBS->CloseProtocol ( - ControllerHandle, - &gEfiDiskIo2ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - } - } - -Exit: - // - // Unlock if locked by myself. - // - if (LockedByMe) { - FatReleaseLock (); - } - return Status; -} - -/** - - Stop this driver on ControllerHandle. - - @param This - Protocol instance pointer. - @param ControllerHandle - Handle of device to stop driver on. - @param NumberOfChildren - Not used. - @param ChildHandleBuffer - Not used. - - @retval EFI_SUCCESS - This driver is removed DeviceHandle. - @return other - This driver was not removed from this device. - -**/ -EFI_STATUS -EFIAPI -FatDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - EFI_STATUS Status; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem; - FAT_VOLUME *Volume; - EFI_DISK_IO2_PROTOCOL *DiskIo2; - - DiskIo2 = NULL; - // - // Get our context back - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiSimpleFileSystemProtocolGuid, - (VOID **) &FileSystem, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (!EFI_ERROR (Status)) { - Volume = VOLUME_FROM_VOL_INTERFACE (FileSystem); - DiskIo2 = Volume->DiskIo2; - Status = FatAbandonVolume (Volume); - } - - if (!EFI_ERROR (Status)) { - if (DiskIo2 != NULL) { - Status = gBS->CloseProtocol ( - ControllerHandle, - &gEfiDiskIo2ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - ASSERT_EFI_ERROR (Status); - } - Status = gBS->CloseProtocol ( - ControllerHandle, - &gEfiDiskIoProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - ASSERT_EFI_ERROR (Status); - } - - return Status; -} diff --git a/FatPkg/EnhancedFatDxe/Fat.h b/FatPkg/EnhancedFatDxe/Fat.h deleted file mode 100644 index 83552613bf..0000000000 --- a/FatPkg/EnhancedFatDxe/Fat.h +++ /dev/null @@ -1,2014 +0,0 @@ -/** @file - Main header file for EFI FAT file system driver. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 _FAT_H_ -#define _FAT_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "FatFileSystem.h" - -// -// The FAT signature -// -#define FAT_VOLUME_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'v') -#define FAT_IFILE_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'i') -#define FAT_ODIR_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'd') -#define FAT_DIRENT_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'e') -#define FAT_OFILE_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'o') -#define FAT_TASK_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'T') -#define FAT_SUBTASK_SIGNATURE SIGNATURE_32 ('f', 'a', 't', 'S') - -#define ASSERT_VOLUME_LOCKED(a) ASSERT_LOCKED (&FatFsLock) - -#define IFILE_FROM_FHAND(a) CR (a, FAT_IFILE, Handle, FAT_IFILE_SIGNATURE) - -#define DIRENT_FROM_LINK(a) CR (a, FAT_DIRENT, Link, FAT_DIRENT_SIGNATURE) - -#define VOLUME_FROM_ROOT_DIRENT(a) CR (a, FAT_VOLUME, RootDirEnt, FAT_VOLUME_SIGNATURE) - -#define VOLUME_FROM_VOL_INTERFACE(a) CR (a, FAT_VOLUME, VolumeInterface, FAT_VOLUME_SIGNATURE); - -#define ODIR_FROM_DIRCACHELINK(a) CR (a, FAT_ODIR, DirCacheLink, FAT_ODIR_SIGNATURE) - -#define OFILE_FROM_CHECKLINK(a) CR (a, FAT_OFILE, CheckLink, FAT_OFILE_SIGNATURE) - -#define OFILE_FROM_CHILDLINK(a) CR (a, FAT_OFILE, ChildLink, FAT_OFILE_SIGNATURE) - -// -// Minimum sector size is 512B, Maximum sector size is 4096B -// Max sectors per cluster is 128 -// -#define MAX_BLOCK_ALIGNMENT 12 -#define MIN_BLOCK_ALIGNMENT 9 -#define MAX_SECTORS_PER_CLUSTER_ALIGNMENT 7 - -// -// Efi Time Definition -// -#define IS_LEAP_YEAR(a) (((a) % 4 == 0) && (((a) % 100 != 0) || ((a) % 400 == 0))) - -// -// Minimum fat page size is 8K, maximum fat page alignment is 32K -// Minimum data page size is 8K, maximum fat page alignment is 64K -// -#define FAT_FATCACHE_PAGE_MIN_ALIGNMENT 13 -#define FAT_FATCACHE_PAGE_MAX_ALIGNMENT 15 -#define FAT_DATACACHE_PAGE_MIN_ALIGNMENT 13 -#define FAT_DATACACHE_PAGE_MAX_ALIGNMENT 16 -#define FAT_DATACACHE_GROUP_COUNT 64 -#define FAT_FATCACHE_GROUP_MIN_COUNT 1 -#define FAT_FATCACHE_GROUP_MAX_COUNT 16 - -// -// Used in 8.3 generation algorithm -// -#define MAX_SPEC_RETRY 4 -#define SPEC_BASE_TAG_LEN 6 -#define HASH_BASE_TAG_LEN 2 -#define HASH_VALUE_TAG_LEN (SPEC_BASE_TAG_LEN - HASH_BASE_TAG_LEN) - -// -// Path name separator is back slash -// -#define PATH_NAME_SEPARATOR L'\\' - - -#define EFI_PATH_STRING_LENGTH 260 -#define EFI_FILE_STRING_LENGTH 255 -#define FAT_MAX_ALLOCATE_SIZE 0xA00000 -#define LC_ISO_639_2_ENTRY_SIZE 3 -#define MAX_LANG_CODE_SIZE 100 - -#define FAT_MAX_DIR_CACHE_COUNT 8 -#define FAT_MAX_DIRENTRY_COUNT 0xFFFF -typedef CHAR8 LC_ISO_639_2; - -// -// The fat types we support -// -typedef enum { - Fat12, - Fat16, - Fat32, - FatUndefined -} FAT_VOLUME_TYPE; - -typedef enum { - CacheFat, - CacheData, - CacheMaxType -} CACHE_DATA_TYPE; - -// -// Used in FatDiskIo -// -typedef enum { - ReadDisk = 0, // raw disk read - WriteDisk = 1, // raw disk write - ReadFat = 2, // read fat cache - WriteFat = 3, // write fat cache - ReadData = 6, // read data cache - WriteData = 7 // write data cache -} IO_MODE; - -#define CACHE_ENABLED(a) ((a) >= 2) -#define RAW_ACCESS(a) ((IO_MODE)((a) & 0x1)) -#define CACHE_TYPE(a) ((CACHE_DATA_TYPE)((a) >> 2)) - -// -// Disk cache tag -// -typedef struct { - UINTN PageNo; - UINTN RealSize; - BOOLEAN Dirty; -} CACHE_TAG; - -typedef struct { - UINT64 BaseAddress; - UINT64 LimitAddress; - UINT8 *CacheBase; - BOOLEAN Dirty; - UINT8 PageAlignment; - UINTN GroupMask; - CACHE_TAG CacheTag[FAT_DATACACHE_GROUP_COUNT]; -} DISK_CACHE; - -// -// Hash table size -// -#define HASH_TABLE_SIZE 0x400 -#define HASH_TABLE_MASK (HASH_TABLE_SIZE - 1) - -// -// The directory entry for opened directory -// - -typedef struct _FAT_DIRENT FAT_DIRENT; -typedef struct _FAT_ODIR FAT_ODIR; -typedef struct _FAT_OFILE FAT_OFILE; -typedef struct _FAT_VOLUME FAT_VOLUME; - -struct _FAT_DIRENT { - UINTN Signature; - UINT16 EntryPos; // The position of this directory entry in the parent directory file - UINT8 EntryCount; // The count of the directory entry in the parent directory file - BOOLEAN Invalid; // Indicate whether this directory entry is valid - CHAR16 *FileString; // The unicode long file name for this directory entry - FAT_OFILE *OFile; // The OFile of the corresponding directory entry - FAT_DIRENT *ShortNameForwardLink; // Hash successor link for short filename - FAT_DIRENT *LongNameForwardLink; // Hash successor link for long filename - LIST_ENTRY Link; // Connection of every directory entry - FAT_DIRECTORY_ENTRY Entry; // The physical directory entry stored in disk -}; - -struct _FAT_ODIR { - UINTN Signature; - UINT32 CurrentEndPos; // Current end position of the directory - UINT32 CurrentPos; // Current position of the directory - LIST_ENTRY *CurrentCursor; // Current directory entry pointer - LIST_ENTRY ChildList; // List of all directory entries - BOOLEAN EndOfDir; // Indicate whether we have reached the end of the directory - LIST_ENTRY DirCacheLink; // Linked in Volume->DirCacheList when discarded - UINTN DirCacheTag; // The identification of the directory when in directory cache - FAT_DIRENT *LongNameHashTable[HASH_TABLE_SIZE]; - FAT_DIRENT *ShortNameHashTable[HASH_TABLE_SIZE]; -}; - -typedef struct { - UINTN Signature; - EFI_FILE_PROTOCOL Handle; - UINT64 Position; - BOOLEAN ReadOnly; - FAT_OFILE *OFile; - LIST_ENTRY Tasks; // List of all FAT_TASKs - LIST_ENTRY Link; // Link to other IFiles -} FAT_IFILE; - -typedef struct { - UINTN Signature; - EFI_FILE_IO_TOKEN *FileIoToken; - FAT_IFILE *IFile; - LIST_ENTRY Subtasks; // List of all FAT_SUBTASKs - LIST_ENTRY Link; // Link to other FAT_TASKs -} FAT_TASK; - -typedef struct { - UINTN Signature; - EFI_DISK_IO2_TOKEN DiskIo2Token; - FAT_TASK *Task; - BOOLEAN Write; - UINT64 Offset; - VOID *Buffer; - UINTN BufferSize; - LIST_ENTRY Link; -} FAT_SUBTASK; - -// -// FAT_OFILE - Each opened file -// -struct _FAT_OFILE { - UINTN Signature; - FAT_VOLUME *Volume; - // - // A permanant error code to return to all accesses to - // this opened file - // - EFI_STATUS Error; - // - // A list of the IFILE instances for this OFile - // - LIST_ENTRY Opens; - - // - // The dynamic infomation - // - UINTN FileSize; - UINTN FileCluster; - UINTN FileCurrentCluster; - UINTN FileLastCluster; - - // - // Dirty is set if there have been any updates to the - // file - // Archive is set if the archive attribute in the file's - // directory entry needs to be set when performing flush - // PreserveLastMod is set if the last modification of the - // file is specified by SetInfo API - // - BOOLEAN Dirty; - BOOLEAN IsFixedRootDir; - BOOLEAN PreserveLastModification; - BOOLEAN Archive; - // - // Set by an OFile SetPosition - // - UINTN Position; // within file - UINT64 PosDisk; // on the disk - UINTN PosRem; // remaining in this disk run - // - // The opened parent, full path length and currently opened child files - // - FAT_OFILE *Parent; - UINTN FullPathLen; - LIST_ENTRY ChildHead; - LIST_ENTRY ChildLink; - - // - // The opened directory structure for a directory; if this - // OFile represents a file, then ODir = NULL - // - FAT_ODIR *ODir; - // - // The directory entry for the Ofile - // - FAT_DIRENT *DirEnt; - - // - // Link in Volume's reference list - // - LIST_ENTRY CheckLink; -}; - -struct _FAT_VOLUME { - UINTN Signature; - - EFI_HANDLE Handle; - BOOLEAN Valid; - BOOLEAN DiskError; - - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL VolumeInterface; - - // - // If opened, the parent handle and BlockIo interface - // - EFI_BLOCK_IO_PROTOCOL *BlockIo; - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_DISK_IO2_PROTOCOL *DiskIo2; - UINT32 MediaId; - BOOLEAN ReadOnly; - - // - // Computed values from fat bpb info - // - UINT64 VolumeSize; - UINT64 FatPos; // Disk pos of fat tables - UINT64 RootPos; // Disk pos of root directory - UINT64 FirstClusterPos; // Disk pos of first cluster - UINTN FatSize; // Number of bytes in each fat - UINTN MaxCluster; // Max cluster number - UINTN ClusterSize; // Cluster size of fat partition - UINT8 ClusterAlignment; // Equal to log_2 (clustersize); - FAT_VOLUME_TYPE FatType; - - // - // Current part of fat table that's present - // - UINT64 FatEntryPos; // Location of buffer - UINTN FatEntrySize; // Size of buffer - UINT32 FatEntryBuffer; // The buffer - FAT_INFO_SECTOR FatInfoSector; // Free cluster info - UINTN FreeInfoPos; // Pos with the free cluster info - BOOLEAN FreeInfoValid; // If free cluster info is valid - // - // Unpacked Fat BPB info - // - UINTN NumFats; - UINTN RootEntries; // < FAT32, root dir is fixed size - UINTN RootCluster; // >= FAT32, root cluster chain head - // - // info for marking the volume dirty or not - // - BOOLEAN FatDirty; // If fat-entries have been updated - UINT32 DirtyValue; - UINT32 NotDirtyValue; - - // - // The root directory entry and opened root file - // - FAT_DIRENT RootDirEnt; - // - // File Name of root OFile, it is empty string - // - CHAR16 RootFileString[1]; - FAT_OFILE *Root; - - // - // New OFiles are added to this list so they - // can be cleaned up if they aren't referenced. - // - LIST_ENTRY CheckRef; - - // - // Directory cache List - // - LIST_ENTRY DirCacheList; - UINTN DirCacheCount; - - // - // Disk Cache for this volume - // - VOID *CacheBuffer; - DISK_CACHE DiskCache[CacheMaxType]; -}; - -// -// Function Prototypes -// - -/** - - Implements Open() of Simple File System Protocol. - - @param FHand - File handle of the file serves as a starting reference point. - @param NewHandle - Handle of the file that is newly opened. - @param FileName - File name relative to FHand. - @param OpenMode - Open mode. - @param Attributes - Attributes to set if the file is created. - - - @retval EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty. - The OpenMode is not supported. - The Attributes is not the valid attributes. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory for file string. - @retval EFI_SUCCESS - Open the file successfully. - @return Others - The status of open file. - -**/ -EFI_STATUS -EFIAPI -FatOpen ( - IN EFI_FILE_PROTOCOL *FHand, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes - ) -; - -/** - - Implements OpenEx() of Simple File System Protocol. - - @param FHand - File handle of the file serves as a starting reference point. - @param NewHandle - Handle of the file that is newly opened. - @param FileName - File name relative to FHand. - @param OpenMode - Open mode. - @param Attributes - Attributes to set if the file is created. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty. - The OpenMode is not supported. - The Attributes is not the valid attributes. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory for file string. - @retval EFI_SUCCESS - Open the file successfully. - @return Others - The status of open file. - -**/ -EFI_STATUS -EFIAPI -FatOpenEx ( - IN EFI_FILE_PROTOCOL *FHand, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes, - IN OUT EFI_FILE_IO_TOKEN *Token - ) -; - -/** - - Get the file's position of the file - - @param FHand - The handle of file. - @param Position - The file's position of the file. - - @retval EFI_SUCCESS - Get the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_UNSUPPORTED - The open file is not a file. - -**/ -EFI_STATUS -EFIAPI -FatGetPosition ( - IN EFI_FILE_PROTOCOL *FHand, - OUT UINT64 *Position - ) -; - -/** - - Get the some types info of the file into Buffer - - @param FHand - The handle of file. - @param Type - The type of the info. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing volume info. - - @retval EFI_SUCCESS - Get the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - -**/ -EFI_STATUS -EFIAPI -FatGetInfo ( - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_GUID *Type, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -; - -/** - - Set the some types info of the file into Buffer. - - @param FHand - The handle of file. - @param Type - The type of the info. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing volume info. - - @retval EFI_SUCCESS - Set the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - -**/ -EFI_STATUS -EFIAPI -FatSetInfo ( - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_GUID *Type, - IN UINTN BufferSize, - IN VOID *Buffer - ) -; - -/** - - Flushes all data associated with the file handle. - - @param FHand - Handle to file to flush - - @retval EFI_SUCCESS - Flushed the file successfully - @retval EFI_WRITE_PROTECTED - The volume is read only - @retval EFI_ACCESS_DENIED - The volume is not read only - but the file is read only - @return Others - Flushing of the file is failed - -**/ -EFI_STATUS -EFIAPI -FatFlush ( - IN EFI_FILE_PROTOCOL *FHand - ) -; - -/** - - Flushes all data associated with the file handle. - - @param FHand - Handle to file to flush. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Flushed the file successfully. - @retval EFI_WRITE_PROTECTED - The volume is read only. - @retval EFI_ACCESS_DENIED - The file is read only. - @return Others - Flushing of the file failed. - -**/ -EFI_STATUS -EFIAPI -FatFlushEx ( - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_FILE_IO_TOKEN *Token - ) -; - -/** - - Flushes & Closes the file handle. - - @param FHand - Handle to the file to delete. - - @retval EFI_SUCCESS - Closed the file successfully. - -**/ -EFI_STATUS -EFIAPI -FatClose ( - IN EFI_FILE_PROTOCOL *FHand - ) -; - -/** - - Deletes the file & Closes the file handle. - - @param FHand - Handle to the file to delete. - - @retval EFI_SUCCESS - Delete the file successfully. - @retval EFI_WARN_DELETE_FAILURE - Fail to delete the file. - -**/ -EFI_STATUS -EFIAPI -FatDelete ( - IN EFI_FILE_PROTOCOL *FHand - ) -; - -/** - - Set the file's position of the file. - - @param FHand - The handle of file - @param Position - The file's position of the file - - @retval EFI_SUCCESS - Set the info successfully - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file - @retval EFI_UNSUPPORTED - Set a directory with a not-zero position - -**/ -EFI_STATUS -EFIAPI -FatSetPosition ( - IN EFI_FILE_PROTOCOL *FHand, - IN UINT64 Position - ) -; - -/** - - Get the file info. - - @param FHand - The handle of the file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing read data. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatRead ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -; - -/** - - Get the file info. - - @param FHand - The handle of the file. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatReadEx ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT EFI_FILE_IO_TOKEN *Token - ) -; - -/** - - Set the file info. - - @param FHand - The handle of the file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing write data. - - @retval EFI_SUCCESS - Set the file info successfully. - @retval EFI_WRITE_PROTECTED - The disk is write protected. - @retval EFI_ACCESS_DENIED - The file is read-only. - @retval EFI_DEVICE_ERROR - The OFile is not valid. - @retval EFI_UNSUPPORTED - The open file is not a file. - - The writing file size is larger than 4GB. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatWrite ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -; - -/** - - Get the file info. - - @param FHand - The handle of the file. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatWriteEx ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT EFI_FILE_IO_TOKEN *Token - ) -; - -// -// DiskCache.c -// -/** - - Initialize the disk cache according to Volume's FatType. - - @param Volume - FAT file system volume. - - @retval EFI_SUCCESS - The disk cache is successfully initialized. - @retval EFI_OUT_OF_RESOURCES - Not enough memory to allocate disk cache. - -**/ -EFI_STATUS -FatInitializeDiskCache ( - IN FAT_VOLUME *Volume - ); - -/** - - Read BufferSize bytes from the position of Offset into Buffer, - or write BufferSize bytes from Buffer into the position of Offset. - - Base on the parameter of CACHE_DATA_TYPE, the data access will be divided into - the access of FAT cache (CACHE_FAT) and the access of Data cache (CACHE_DATA): - - 1. Access of FAT cache (CACHE_FAT): Access the data in the FAT cache, if there is cache - page hit, just return the cache page; else update the related cache page and return - the right cache page. - 2. Access of Data cache (CACHE_DATA): - The access data will be divided into UnderRun data, Aligned data and OverRun data; - The UnderRun data and OverRun data will be accessed by the Data cache, - but the Aligned data will be accessed with disk directly. - - @param Volume - FAT file system volume. - @param CacheDataType - The type of cache: CACHE_DATA or CACHE_FAT. - @param IoMode - Indicate the type of disk access. - @param Offset - The starting byte offset to read from. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing cache data. - @param Task point to task instance. - - @retval EFI_SUCCESS - The data was accessed correctly. - @retval EFI_MEDIA_CHANGED - The MediaId does not match the current device. - @return Others - An error occurred when accessing cache. - -**/ -EFI_STATUS -FatAccessCache ( - IN FAT_VOLUME *Volume, - IN CACHE_DATA_TYPE CacheDataType, - IN IO_MODE IoMode, - IN UINT64 Offset, - IN UINTN BufferSize, - IN OUT UINT8 *Buffer, - IN FAT_TASK *Task - ); - -/** - - Flush all the dirty cache back, include the FAT cache and the Data cache. - - @param Volume - FAT file system volume. - @param Task point to task instance. - - @retval EFI_SUCCESS - Flush all the dirty cache back successfully - @return other - An error occurred when writing the data into the disk - -**/ -EFI_STATUS -FatVolumeFlushCache ( - IN FAT_VOLUME *Volume, - IN FAT_TASK *Task - ); - -// -// Flush.c -// -/** - - Flush the data associated with an open file. - In this implementation, only last Mod/Access time is updated. - - @param OFile - The open file. - - @retval EFI_SUCCESS - The OFile is flushed successfully. - @return Others - An error occurred when flushing this OFile. - -**/ -EFI_STATUS -FatOFileFlush ( - IN FAT_OFILE *OFile - ); - -/** - - Check the references of the OFile. - If the OFile (that is checked) is no longer - referenced, then it is freed. - - @param OFile - The OFile to be checked. - - @retval TRUE - The OFile is not referenced and freed. - @retval FALSE - The OFile is kept. - -**/ -BOOLEAN -FatCheckOFileRef ( - IN FAT_OFILE *OFile - ); - -/** - - Set the OFile and its child OFile with the error Status - - @param OFile - The OFile whose permanent error code is to be set. - @param Status - Error code to be set. - -**/ -VOID -FatSetVolumeError ( - IN FAT_OFILE *OFile, - IN EFI_STATUS Status - ); - -/** - - Close the open file instance. - - @param IFile - Open file instance. - - @retval EFI_SUCCESS - Closed the file successfully. - -**/ -EFI_STATUS -FatIFileClose ( - FAT_IFILE *IFile - ); - -/** - - Set error status for a specific OFile, reference checking the volume. - If volume is already marked as invalid, and all resources are freed - after reference checking, the file system protocol is uninstalled and - the volume structure is freed. - - @param Volume - the Volume that is to be reference checked and unlocked. - @param OFile - the OFile whose permanent error code is to be set. - @param EfiStatus - error code to be set. - @param Task point to task instance. - - @retval EFI_SUCCESS - Clean up the volume successfully. - @return Others - Cleaning up of the volume is failed. - -**/ -EFI_STATUS -FatCleanupVolume ( - IN FAT_VOLUME *Volume, - IN FAT_OFILE *OFile, - IN EFI_STATUS EfiStatus, - IN FAT_TASK *Task - ); - -// -// FileSpace.c -// -/** - - Shrink the end of the open file base on the file size. - - @param OFile - The open file. - - @retval EFI_SUCCESS - Shrinked sucessfully. - @retval EFI_VOLUME_CORRUPTED - There are errors in the file's clusters. - -**/ -EFI_STATUS -FatShrinkEof ( - IN FAT_OFILE *OFile - ); - -/** - - Grow the end of the open file base on the NewSizeInBytes. - - @param OFile - The open file. - @param NewSizeInBytes - The new size in bytes of the open file. - - @retval EFI_SUCCESS - The file is grown sucessfully. - @retval EFI_UNSUPPORTED - The file size is larger than 4GB. - @retval EFI_VOLUME_CORRUPTED - There are errors in the files' clusters. - @retval EFI_VOLUME_FULL - The volume is full and can not grow the file. - -**/ -EFI_STATUS -FatGrowEof ( - IN FAT_OFILE *OFile, - IN UINT64 NewSizeInBytes - ); - -/** - - Get the size of directory of the open file. - - @param Volume - The File System Volume. - @param Cluster - The Starting cluster. - - @return The physical size of the file starting at the input cluster, if there is error in the - cluster chain, the return value is 0. - -**/ -UINTN -FatPhysicalDirSize ( - IN FAT_VOLUME *Volume, - IN UINTN Cluster - ); - -/** - - Get the physical size of a file on the disk. - - @param Volume - The file system volume. - @param RealSize - The real size of a file. - - @return The physical size of a file on the disk. - -**/ -UINT64 -FatPhysicalFileSize ( - IN FAT_VOLUME *Volume, - IN UINTN RealSize - ); - -/** - - Seek OFile to requested position, and calculate the number of - consecutive clusters from the position in the file - - @param OFile - The open file. - @param Position - The file's position which will be accessed. - @param PosLimit - The maximum length current reading/writing may access - - @retval EFI_SUCCESS - Set the info successfully. - @retval EFI_VOLUME_CORRUPTED - Cluster chain corrupt. - -**/ -EFI_STATUS -FatOFilePosition ( - IN FAT_OFILE *OFile, - IN UINTN Position, - IN UINTN PosLimit - ); - -/** - - Update the free cluster info of FatInfoSector of the volume. - - @param Volume - FAT file system volume. - -**/ -VOID -FatComputeFreeInfo ( - IN FAT_VOLUME *Volume - ); - -// -// Init.c -// -/** - - Allocates volume structure, detects FAT file system, installs protocol, - and initialize cache. - - @param Handle - The handle of parent device. - @param DiskIo - The DiskIo of parent device. - @param DiskIo2 - The DiskIo2 of parent device. - @param BlockIo - The BlockIo of parent devicel - - @retval EFI_SUCCESS - Allocate a new volume successfully. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - @return Others - Allocating a new volume failed. - -**/ -EFI_STATUS -FatAllocateVolume ( - IN EFI_HANDLE Handle, - IN EFI_DISK_IO_PROTOCOL *DiskIo, - IN EFI_DISK_IO2_PROTOCOL *DiskIo2, - IN EFI_BLOCK_IO_PROTOCOL *BlockIo - ); - -/** - - Detects FAT file system on Disk and set relevant fields of Volume. - - @param Volume - The volume structure. - - @retval EFI_SUCCESS - The Fat File System is detected successfully - @retval EFI_UNSUPPORTED - The volume is not FAT file system. - @retval EFI_VOLUME_CORRUPTED - The volume is corrupted. - -**/ -EFI_STATUS -FatOpenDevice ( - IN OUT FAT_VOLUME *Volume - ); - -/** - - Called by FatDriverBindingStop(), Abandon the volume. - - @param Volume - The volume to be abandoned. - - @retval EFI_SUCCESS - Abandoned the volume successfully. - @return Others - Can not uninstall the protocol interfaces. - -**/ -EFI_STATUS -FatAbandonVolume ( - IN FAT_VOLUME *Volume - ); - -// -// Misc.c -// -/** - - Create the task - - @param IFile - The instance of the open file. - @param Token - A pointer to the token associated with the transaction. - - @return FAT_TASK * - Return the task instance. - -**/ -FAT_TASK * -FatCreateTask ( - FAT_IFILE *IFile, - EFI_FILE_IO_TOKEN *Token - ); - -/** - - Destroy the task. - - @param Task - The task to be destroyed. - -**/ -VOID -FatDestroyTask ( - FAT_TASK *Task - ); - -/** - - Wait all non-blocking requests complete. - - @param IFile - The instance of the open file. - -**/ -VOID -FatWaitNonblockingTask ( - FAT_IFILE *IFile - ); - -/** - - Remove the subtask from subtask list. - - @param Subtask - The subtask to be removed. - - @return LIST_ENTRY * - The next node in the list. - -**/ -LIST_ENTRY * -FatDestroySubtask ( - FAT_SUBTASK *Subtask - ); - -/** - - Execute the task. - - @param IFile - The instance of the open file. - @param Task - The task to be executed. - - @retval EFI_SUCCESS - The task was executed sucessfully. - @return other - An error occurred when executing the task. - -**/ -EFI_STATUS -FatQueueTask ( - IN FAT_IFILE *IFile, - IN FAT_TASK *Task - ); - -/** - - Set the volume as dirty or not. - - @param Volume - FAT file system volume. - @param IoMode - The access mode. - @param DirtyValue - Set the volume as dirty or not. - - @retval EFI_SUCCESS - Set the new FAT entry value sucessfully. - @return other - An error occurred when operation the FAT entries. - -**/ -EFI_STATUS -FatAccessVolumeDirty ( - IN FAT_VOLUME *Volume, - IN IO_MODE IoMode, - IN VOID *DirtyValue - ); - -/** - - General disk access function. - - @param Volume - FAT file system volume. - @param IoMode - The access mode (disk read/write or cache access). - @param Offset - The starting byte offset to read from. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing read data. - @param Task point to task instance. - - @retval EFI_SUCCESS - The operation is performed successfully. - @retval EFI_VOLUME_CORRUPTED - The accesss is - @return Others - The status of read/write the disk - -**/ -EFI_STATUS -FatDiskIo ( - IN FAT_VOLUME *Volume, - IN IO_MODE IoMode, - IN UINT64 Offset, - IN UINTN BufferSize, - IN OUT VOID *Buffer, - IN FAT_TASK *Task - ); - -/** - - Lock the volume. - -**/ -VOID -FatAcquireLock ( - VOID - ); - -/** - - Unlock the volume. - -**/ -VOID -FatReleaseLock ( - VOID - ); - -/** - - Lock the volume. - If the lock is already in the acquired state, then EFI_ACCESS_DENIED is returned. - Otherwise, EFI_SUCCESS is returned. - - @retval EFI_SUCCESS - The volume is locked. - @retval EFI_ACCESS_DENIED - The volume could not be locked because it is already locked. - -**/ -EFI_STATUS -FatAcquireLockOrFail ( - VOID - ); - -/** - - Free directory entry. - - @param DirEnt - The directory entry to be freed. - -**/ -VOID -FatFreeDirEnt ( - IN FAT_DIRENT *DirEnt - ); - -/** - - Free volume structure (including the contents of directory cache and disk cache). - - @param Volume - The volume structure to be freed. - -**/ -VOID -FatFreeVolume ( - IN FAT_VOLUME *Volume - ); - -/** - - Translate EFI time to FAT time. - - @param ETime - The time of EFI_TIME. - @param FTime - The time of FAT_DATE_TIME. - -**/ -VOID -FatEfiTimeToFatTime ( - IN EFI_TIME *ETime, - OUT FAT_DATE_TIME *FTime - ); - -/** - - Translate Fat time to EFI time. - - @param FTime - The time of FAT_DATE_TIME. - @param ETime - The time of EFI_TIME.. - -**/ -VOID -FatFatTimeToEfiTime ( - IN FAT_DATE_TIME *FTime, - OUT EFI_TIME *ETime - ); - -/** - - Get Current FAT time. - - @param FatTime - Current FAT time. - -**/ -VOID -FatGetCurrentFatTime ( - OUT FAT_DATE_TIME *FatTime - ); - -/** - - Check whether a time is valid. - - @param Time - The time of EFI_TIME. - - @retval TRUE - The time is valid. - @retval FALSE - The time is not valid. - -**/ -BOOLEAN -FatIsValidTime ( - IN EFI_TIME *Time - ); - -// -// UnicodeCollation.c -// -/** - Initialize Unicode Collation support. - - It tries to locate Unicode Collation 2 protocol and matches it with current - platform language code. If for any reason the first attempt fails, it then tries to - use Unicode Collation Protocol. - - @param AgentHandle The handle used to open Unicode Collation (2) protocol. - - @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located. - @retval Others The Unicode Collation (2) protocol has not been located. - -**/ -EFI_STATUS -InitializeUnicodeCollationSupport ( - IN EFI_HANDLE AgentHandle - ); - -/** - Convert FAT string to unicode string. - - @param FatSize The size of FAT string. - @param Fat The FAT string. - @param String The unicode string. - - @return None. - -**/ -VOID -FatFatToStr ( - IN UINTN FatSize, - IN CHAR8 *Fat, - OUT CHAR16 *String - ); - -/** - Convert unicode string to Fat string. - - @param String The unicode string. - @param FatSize The size of the FAT string. - @param Fat The FAT string. - - @retval TRUE Convert successfully. - @retval FALSE Convert error. - -**/ -BOOLEAN -FatStrToFat ( - IN CHAR16 *String, - IN UINTN FatSize, - OUT CHAR8 *Fat - ); - -/** - Lowercase a string - - @param Str The string which will be lower-cased. - -**/ -VOID -FatStrLwr ( - IN CHAR16 *Str - ); - -/** - Uppercase a string. - - @param Str The string which will be upper-cased. - -**/ -VOID -FatStrUpr ( - IN CHAR16 *Str - ); - -/** - Performs a case-insensitive comparison of two Null-terminated Unicode strings. - - @param Str1 A pointer to a Null-terminated Unicode string. - @param Str2 A pointer to a Null-terminated Unicode string. - - @retval 0 S1 is equivalent to S2. - @retval >0 S1 is lexically greater than S2. - @retval <0 S1 is lexically less than S2. -**/ -INTN -FatStriCmp ( - IN CHAR16 *Str1, - IN CHAR16 *Str2 - ); - -// -// Open.c -// - -/** - - Open a file for a file name relative to an existing OFile. - The IFile of the newly opened file is passed out. - - @param OFile - The file that serves as a starting reference point. - @param NewIFile - The newly generated IFile instance. - @param FileName - The file name relative to the OFile. - @param OpenMode - Open mode. - @param Attributes - Attributes to set if the file is created. - - - @retval EFI_SUCCESS - Open the file successfully. - @retval EFI_INVALID_PARAMETER - The open mode is conflict with the attributes - or the file name is not valid. - @retval EFI_NOT_FOUND - Conficts between dir intention and attribute. - @retval EFI_WRITE_PROTECTED - Can't open for write if the volume is read only. - @retval EFI_ACCESS_DENIED - If the file's attribute is read only, and the - open is for read-write fail it. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - -**/ -EFI_STATUS -FatOFileOpen ( - IN FAT_OFILE *OFile, - OUT FAT_IFILE **NewIFile, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT8 Attributes - ); - -/** - - Create an Open instance for the existing OFile. - The IFile of the newly opened file is passed out. - - @param OFile - The file that serves as a starting reference point. - @param PtrIFile - The newly generated IFile instance. - - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory for the IFile - @retval EFI_SUCCESS - Create the new IFile for the OFile successfully - -**/ -EFI_STATUS -FatAllocateIFile ( - IN FAT_OFILE *OFile, - OUT FAT_IFILE **PtrIFile - ); - -// -// OpenVolume.c -// -/** - - Implements Simple File System Protocol interface function OpenVolume(). - - @param This - Calling context. - @param File - the Root Directory of the volume. - - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - @retval EFI_VOLUME_CORRUPTED - The FAT type is error. - @retval EFI_SUCCESS - Open the volume successfully. - -**/ -EFI_STATUS -EFIAPI -FatOpenVolume ( - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **File - ); - -// -// ReadWrite.c -// -/** - - This function reads data from a file or writes data to a file. - It uses OFile->PosRem to determine how much data can be accessed in one time. - - @param OFile - The open file. - @param IoMode - Indicate whether the access mode is reading or writing. - @param Position - The position where data will be accessed. - @param DataBufferSize - Size of Buffer. - @param UserBuffer - Buffer containing data. - @param Task point to task instance. - - @retval EFI_SUCCESS - Access the data successfully. - @return other - An error occurred when operating on the disk. - -**/ -EFI_STATUS -FatAccessOFile ( - IN FAT_OFILE *OFile, - IN IO_MODE IoMode, - IN UINTN Position, - IN UINTN *DataBufferSize, - IN UINT8 *UserBuffer, - IN FAT_TASK *Task - ); - -/** - - Expand OFile by appending zero bytes at the end of OFile. - - @param OFile - The open file. - @param ExpandedSize - The number of zero bytes appended at the end of the file. - - @retval EFI_SUCCESS - The file is expanded successfully. - @return other - An error occurred when expanding file. - -**/ -EFI_STATUS -FatExpandOFile ( - IN FAT_OFILE *OFile, - IN UINT64 ExpandedSize - ); - -/** - - Write zero pool from the WritePos to the end of OFile. - - @param OFile - The open file to write zero pool. - @param WritePos - The number of zero bytes written. - - @retval EFI_SUCCESS - Write the zero pool successfully. - @retval EFI_OUT_OF_RESOURCES - Not enough memory to perform the operation. - @return other - An error occurred when writing disk. - -**/ -EFI_STATUS -FatWriteZeroPool ( - IN FAT_OFILE *OFile, - IN UINTN WritePos - ); - -/** - - Truncate the OFile to smaller file size. - - @param OFile - The open file. - @param TruncatedSize - The new file size. - - @retval EFI_SUCCESS - The file is truncated successfully. - @return other - An error occurred when truncating file. - -**/ -EFI_STATUS -FatTruncateOFile ( - IN FAT_OFILE *OFile, - IN UINTN TruncatedSize - ); - -// -// DirectoryManage.c -// -/** - - Set the OFile's current directory cursor to the list head. - - @param OFile - The directory OFile whose directory cursor is reset. - -**/ -VOID -FatResetODirCursor ( - IN FAT_OFILE *OFile - ); - -/** - - Set the directory's cursor to the next and get the next directory entry. - - @param OFile - The parent OFile. - @param PtrDirEnt - The next directory entry. - - @retval EFI_SUCCESS - We get the next directory entry successfully. - @return other - An error occurred when get next directory entry. - -**/ -EFI_STATUS -FatGetNextDirEnt ( - IN FAT_OFILE *OFile, - OUT FAT_DIRENT **PtrDirEnt - ); - -/** - - Remove this directory entry node from the list of directory entries and hash table. - - @param OFile - The parent OFile. - @param DirEnt - The directory entry to be removed. - - @retval EFI_SUCCESS - The directory entry is successfully removed. - @return other - An error occurred when removing the directory entry. - -**/ -EFI_STATUS -FatRemoveDirEnt ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ); - -/** - - Save the directory entry to disk. - - @param OFile - The parent OFile which needs to update. - @param DirEnt - The directory entry to be saved. - - @retval EFI_SUCCESS - Store the directory entry successfully. - @return other - An error occurred when writing the directory entry. - -**/ -EFI_STATUS -FatStoreDirEnt ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ); - -/** - - Create a directory entry in the parent OFile. - - @param OFile - The parent OFile. - @param FileName - The filename of the newly-created directory entry. - @param Attributes - The attribute of the newly-created directory entry. - @param PtrDirEnt - The pointer to the newly-created directory entry. - - @retval EFI_SUCCESS - The directory entry is successfully created. - @retval EFI_OUT_OF_RESOURCES - Not enough memory to create the directory entry. - @return other - An error occurred when creating the directory entry. - -**/ -EFI_STATUS -FatCreateDirEnt ( - IN FAT_OFILE *OFile, - IN CHAR16 *FileName, - IN UINT8 Attributes, - OUT FAT_DIRENT **PtrDirEnt - ); - -/** - - Determine whether the directory entry is "." or ".." entry. - - @param DirEnt - The corresponding directory entry. - - @retval TRUE - The directory entry is "." or ".." directory entry - @retval FALSE - The directory entry is not "." or ".." directory entry - -**/ -BOOLEAN -FatIsDotDirEnt ( - IN FAT_DIRENT *DirEnt - ); - -/** - - Set the OFile's cluster and size info in its directory entry. - - @param OFile - The corresponding OFile. - -**/ -VOID -FatUpdateDirEntClusterSizeInfo ( - IN FAT_OFILE *OFile - ); - -/** - - Copy all the information of DirEnt2 to DirEnt1 except for 8.3 name. - - @param DirEnt1 - The destination directory entry. - @param DirEnt2 - The source directory entry. - -**/ -VOID -FatCloneDirEnt ( - IN FAT_DIRENT *DirEnt1, - IN FAT_DIRENT *DirEnt2 - ); - -/** - - Get the directory entry's info into Buffer. - - @param Volume - FAT file system volume. - @param DirEnt - The corresponding directory entry. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing file info. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_BUFFER_TOO_SMALL - The buffer is too small. - -**/ -EFI_STATUS -FatGetDirEntInfo ( - IN FAT_VOLUME *Volume, - IN FAT_DIRENT *DirEnt, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -/** - - Open the directory entry to get the OFile. - - @param Parent - The parent OFile. - @param DirEnt - The directory entry to be opened. - - @retval EFI_SUCCESS - The directory entry is successfully opened. - @retval EFI_OUT_OF_RESOURCES - not enough memory to allocate a new OFile. - @return other - An error occurred when opening the directory entry. - -**/ -EFI_STATUS -FatOpenDirEnt ( - IN FAT_OFILE *OFile, - IN FAT_DIRENT *DirEnt - ); - -/** - - Create "." and ".." directory entries in the newly-created parent OFile. - - @param OFile - The parent OFile. - - @retval EFI_SUCCESS - The dot directory entries are successfully created. - @return other - An error occurred when creating the directory entry. - -**/ -EFI_STATUS -FatCreateDotDirEnts ( - IN FAT_OFILE *OFile - ); - -/** - - Close the directory entry and free the OFile. - - @param DirEnt - The directory entry to be closed. - -**/ -VOID -FatCloseDirEnt ( - IN FAT_DIRENT *DirEnt - ); - -/** - - Traverse filename and open all OFiles that can be opened. - Update filename pointer to the component that can't be opened. - If more than one name component remains, returns an error; - otherwise, return the remaining name component so that the caller might choose to create it. - - @param PtrOFile - As input, the reference OFile; as output, the located OFile. - @param FileName - The file name relevant to the OFile. - @param Attributes - The attribute of the destination OFile. - @param NewFileName - The remaining file name. - - @retval EFI_NOT_FOUND - The file name can't be opened and there is more than one - components within the name left (this means the name can - not be created either). - @retval EFI_INVALID_PARAMETER - The parameter is not valid. - @retval EFI_SUCCESS - Open the file successfully. - @return other - An error occured when locating the OFile. - -**/ -EFI_STATUS -FatLocateOFile ( - IN OUT FAT_OFILE **PtrOFile, - IN CHAR16 *FileName, - IN UINT8 Attributes, - OUT CHAR16 *NewFileName - ); - -/** - - Get the directory entry for the volume. - - @param Volume - FAT file system volume. - @param Name - The file name of the volume. - - @retval EFI_SUCCESS - Update the volume with the directory entry sucessfully. - @return others - An error occurred when getting volume label. - -**/ -EFI_STATUS -FatGetVolumeEntry ( - IN FAT_VOLUME *Volume, - IN CHAR16 *Name - ); - -/** - - Set the relevant directory entry into disk for the volume. - - @param Volume - FAT file system volume. - @param Name - The new file name of the volume. - - @retval EFI_SUCCESS - Update the Volume sucessfully. - @retval EFI_UNSUPPORTED - The input label is not a valid volume label. - @return other - An error occurred when setting volume label. - -**/ -EFI_STATUS -FatSetVolumeEntry ( - IN FAT_VOLUME *Volume, - IN CHAR16 *Name - ); - -// -// Hash.c -// -/** - - Search the long name hash table for the directory entry. - - @param ODir - The directory to be searched. - @param LongNameString - The long name string to search. - - @return The previous long name hash node of the directory entry. - -**/ -FAT_DIRENT ** -FatLongNameHashSearch ( - IN FAT_ODIR *ODir, - IN CHAR16 *LongNameString - ); - -/** - - Search the short name hash table for the directory entry. - - @param ODir - The directory to be searched. - @param ShortNameString - The short name string to search. - - @return The previous short name hash node of the directory entry. - -**/ -FAT_DIRENT ** -FatShortNameHashSearch ( - IN FAT_ODIR *ODir, - IN CHAR8 *ShortNameString - ); - -/** - - Insert directory entry to hash table. - - @param ODir - The parent directory. - @param DirEnt - The directory entry node. - -**/ -VOID -FatInsertToHashTable ( - IN FAT_ODIR *ODir, - IN FAT_DIRENT *DirEnt - ); - -/** - - Delete directory entry from hash table. - - @param ODir - The parent directory. - @param DirEnt - The directory entry node. - -**/ -VOID -FatDeleteFromHashTable ( - IN FAT_ODIR *ODir, - IN FAT_DIRENT *DirEnt - ); - -// -// FileName.c -// -/** - - This function checks whether the input FileName is a valid 8.3 short name. - If the input FileName is a valid 8.3, the output is the 8.3 short name; - otherwise, the output is the base tag of 8.3 short name. - - @param FileName - The input unicode filename. - @param File8Dot3Name - The output ascii 8.3 short name or base tag of 8.3 short name. - - @retval TRUE - The input unicode filename is a valid 8.3 short name. - @retval FALSE - The input unicode filename is not a valid 8.3 short name. - -**/ -BOOLEAN -FatCheckIs8Dot3Name ( - IN CHAR16 *FileName, - OUT CHAR8 *File8Dot3Name - ); - -/** - - This function generates 8Dot3 name from user specified name for a newly created file. - - @param Parent - The parent directory. - @param DirEnt - The directory entry whose 8Dot3Name needs to be generated. - -**/ -VOID -FatCreate8Dot3Name ( - IN FAT_OFILE *Parent, - IN FAT_DIRENT *DirEnt - ); - -/** - - Convert the ascii fat name to the unicode string and strip trailing spaces, - and if necessary, convert the unicode string to lower case. - - @param FatName - The Char8 string needs to be converted. - @param Len - The length of the fat name. - @param LowerCase - Indicate whether to convert the string to lower case. - @param Str - The result of the convertion. - -**/ -VOID -FatNameToStr ( - IN CHAR8 *FatName, - IN UINTN Len, - IN UINTN LowerCase, - IN CHAR16 *Str - ); - -/** - - Set the caseflag value for the directory entry. - - @param DirEnt - The logical directory entry whose caseflag value is to be set. - -**/ -VOID -FatSetCaseFlag ( - IN FAT_DIRENT *DirEnt - ); - -/** - - Convert the 8.3 ASCII fat name to cased Unicode string according to case flag. - - @param DirEnt - The corresponding directory entry. - @param FileString - The output Unicode file name. - @param FileStringMax The max length of FileString. - -**/ -VOID -FatGetFileNameViaCaseFlag ( - IN FAT_DIRENT *DirEnt, - IN OUT CHAR16 *FileString, - IN UINTN FileStringMax - ); - -/** - - Get the Check sum for a short name. - - @param ShortNameString - The short name for a file. - - @retval Sum - UINT8 checksum. - -**/ -UINT8 -FatCheckSum ( - IN CHAR8 *ShortNameString - ); - -/** - - Takes Path as input, returns the next name component - in Name, and returns the position after Name (e.g., the - start of the next name component) - - @param Path - The path of one file. - @param Name - The next name component in Path. - - The position after Name in the Path - -**/ -CHAR16* -FatGetNextNameComponent ( - IN CHAR16 *Path, - OUT CHAR16 *Name - ); - -/** - - Check whether the IFileName is valid long file name. If the IFileName is a valid - long file name, then we trim the possible leading blanks and leading/trailing dots. - the trimmed filename is stored in OutputFileName - - @param InputFileName - The input file name. - @param OutputFileName - The output file name. - - @retval TRUE - The InputFileName is a valid long file name. - @retval FALSE - The InputFileName is not a valid long file name. - -**/ -BOOLEAN -FatFileNameIsValid ( - IN CHAR16 *InputFileName, - OUT CHAR16 *OutputFileName - ); - -// -// DirectoryCache.c -// -/** - - Discard the directory structure when an OFile will be freed. - Volume will cache this directory if the OFile does not represent a deleted file. - - @param OFile - The OFile whose directory structure is to be discarded. - -**/ -VOID -FatDiscardODir ( - IN FAT_OFILE *OFile - ); - -/** - - Request the directory structure when an OFile is newly generated. - If the directory structure is cached by volume, then just return this directory; - Otherwise, allocate a new one for OFile. - - @param OFile - The OFile which requests directory structure. - -**/ -VOID -FatRequestODir ( - IN FAT_OFILE *OFile - ); - -/** - - Clean up all the cached directory structures when the volume is going to be abandoned. - - @param Volume - FAT file system volume. - -**/ -VOID -FatCleanupODirCache ( - IN FAT_VOLUME *Volume - ); - -// -// Global Variables -// -extern EFI_DRIVER_BINDING_PROTOCOL gFatDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gFatComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gFatComponentName2; -extern EFI_LOCK FatFsLock; -extern EFI_LOCK FatTaskLock; -extern EFI_FILE_PROTOCOL FatFileInterface; - -#endif diff --git a/FatPkg/EnhancedFatDxe/Fat.inf b/FatPkg/EnhancedFatDxe/Fat.inf deleted file mode 100644 index e7044cda6c..0000000000 --- a/FatPkg/EnhancedFatDxe/Fat.inf +++ /dev/null @@ -1,94 +0,0 @@ -## @file -# Component Description File for FAT module. -# -# This UEFI driver detects the FAT file system in the disk. -# It also produces the Simple File System protocol for the consumer to -# perform file and directory operations on the disk. -# Copyright (c) 2007 - 2014, Intel Corporation. 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 = Fat - MODULE_UNI_FILE = Fat.uni - FILE_GUID = 961578FE-B6B7-44c3-AF35-6BC705CD2B1F - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - - ENTRY_POINT = FatEntryPoint - UNLOAD_IMAGE = FatUnload - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# -# DRIVER_BINDING = gFatDriverBinding -# COMPONENT_NAME = gFatComponentName -# COMPONENT_NAME2 = gFatComponentName2 -# - -[Sources] - DirectoryCache.c - DiskCache.c - FileName.c - Hash.c - DirectoryManage.c - ComponentName.c - FatFileSystem.h - Fat.h - ReadWrite.c - OpenVolume.c - Open.c - Misc.c - Init.c - Info.c - FileSpace.c - Flush.c - Fat.c - Delete.c - Data.c - UnicodeCollation.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiRuntimeServicesTableLib - UefiBootServicesTableLib - MemoryAllocationLib - BaseMemoryLib - BaseLib - UefiLib - UefiDriverEntryPoint - DebugLib - PcdLib - -[Guids] - gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## UNDEFINED - gEfiFileSystemInfoGuid ## SOMETIMES_CONSUMES ## UNDEFINED - gEfiFileSystemVolumeLabelInfoIdGuid ## SOMETIMES_CONSUMES ## UNDEFINED - -[Protocols] - gEfiDiskIoProtocolGuid ## TO_START - gEfiDiskIo2ProtocolGuid ## TO_START - gEfiBlockIoProtocolGuid ## TO_START - gEfiSimpleFileSystemProtocolGuid ## BY_START - gEfiUnicodeCollationProtocolGuid ## TO_START - gEfiUnicodeCollation2ProtocolGuid ## TO_START - -[Pcd] - gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLang ## SOMETIMES_CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang ## SOMETIMES_CONSUMES -[UserExtensions.TianoCore."ExtraFiles"] - FatExtra.uni diff --git a/FatPkg/EnhancedFatDxe/Fat.uni b/FatPkg/EnhancedFatDxe/Fat.uni deleted file mode 100644 index 75999c7600..0000000000 --- a/FatPkg/EnhancedFatDxe/Fat.uni +++ /dev/null @@ -1,24 +0,0 @@ -// /** @file -// Component description file for FAT module. -// -// This UEFI driver detects the FAT file system in the disk. -// It also produces the Simple File System protocol for the consumer to -// perform file and directory operations on the disk. -// -// Copyright (c) 2007 - 2014, Intel Corporation. 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. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "This UEFI driver detects the FAT file system in the disk." - -#string STR_MODULE_DESCRIPTION #language en-US "It also produces the Simple File System protocol for the consumer to perform file and directory operations on the disk." - diff --git a/FatPkg/EnhancedFatDxe/FatExtra.uni b/FatPkg/EnhancedFatDxe/FatExtra.uni deleted file mode 100644 index 1c66929861..0000000000 --- a/FatPkg/EnhancedFatDxe/FatExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// Fat Localized Strings and Content -// -// Copyright (c) 2013, Intel Corporation. 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. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"FAT File System DXE Driver" - - diff --git a/FatPkg/EnhancedFatDxe/FatFileSystem.h b/FatPkg/EnhancedFatDxe/FatFileSystem.h deleted file mode 100644 index 80cb802b08..0000000000 --- a/FatPkg/EnhancedFatDxe/FatFileSystem.h +++ /dev/null @@ -1,214 +0,0 @@ -/** @file - Definitions for on-disk FAT structures. - -Copyright (c) 2005 - 2017, Intel Corporation. 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 _FATFILESYSTEM_H_ -#define _FATFILESYSTEM_H_ - -#pragma pack(1) -// -// FAT info signature -// -#define FAT_INFO_SIGNATURE 0x41615252 -#define FAT_INFO_BEGIN_SIGNATURE 0x61417272 -#define FAT_INFO_END_SIGNATURE 0xAA550000 -// -// FAT entry values -// -#define FAT_CLUSTER_SPECIAL_EXT (MAX_UINTN & (~0xF)) -#define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07) -#define FAT_CLUSTER_FREE 0 -#define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL) -#define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL) -#define FAT_CLUSTER_LAST (-1) -#define FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL)) -#define FAT_MIN_CLUSTER 2 -#define FAT_MAX_FAT12_CLUSTER 0xFF5 -#define FAT_MAX_FAT16_CLUSTER 0xFFF5 -#define FAT_CLUSTER_SPECIAL_FAT12 0xFF7 -#define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7 -#define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7 -#define FAT_CLUSTER_MASK_FAT12 0xFFF -#define FAT_CLUSTER_UNMASK_FAT12 0xF000 -#define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF -#define FAT_CLUSTER_UNMASK_FAT32 0xF0000000 -#define FAT_POS_FAT12(a) ((a) * 3 / 2) -#define FAT_POS_FAT16(a) ((a) * 2) -#define FAT_POS_FAT32(a) ((a) * 4) -#define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0) - - -// -// FAT attribute define -// -#define FAT_ATTRIBUTE_READ_ONLY 0x01 -#define FAT_ATTRIBUTE_HIDDEN 0x02 -#define FAT_ATTRIBUTE_SYSTEM 0x04 -#define FAT_ATTRIBUTE_VOLUME_ID 0x08 -#define FAT_ATTRIBUTE_DIRECTORY 0x10 -#define FAT_ATTRIBUTE_ARCHIVE 0x20 -#define FAT_ATTRIBUTE_DEVICE 0x40 -#define FAT_ATTRIBUTE_LFN 0x0F -// -// Some Long File Name definitions -// -#define FAT_LFN_LAST 0x40 // Ordinal field -#define MAX_LFN_ENTRIES 20 -#define LFN_CHAR1_LEN 5 -#define LFN_CHAR2_LEN 6 -#define LFN_CHAR3_LEN 2 -#define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN) -#define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL) -// -// Some 8.3 File Name definitions -// -#define FAT_MAIN_NAME_LEN 8 -#define FAT_EXTEND_NAME_LEN 3 -#define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN) -// -// Some directory entry information -// -#define FAT_ENTRY_INFO_OFFSET 13 -#define DELETE_ENTRY_MARK 0xE5 -#define EMPTY_ENTRY_MARK 0x00 - -// -// Volume dirty Mask -// -#define FAT16_DIRTY_MASK 0x7fff -#define FAT32_DIRTY_MASK 0xf7ffffff -// -// internal flag -// -#define FAT_CASE_MIXED 0x01 -#define FAT_CASE_NAME_LOWER 0x08 -#define FAT_CASE_EXT_LOWER 0x10 - -typedef struct { - UINT8 Ia32Jump[3]; - CHAR8 OemId[8]; - UINT16 SectorSize; - UINT8 SectorsPerCluster; - UINT16 ReservedSectors; - UINT8 NumFats; - UINT16 RootEntries; // < FAT32, root dir is fixed size - UINT16 Sectors; - UINT8 Media; - UINT16 SectorsPerFat; // < FAT32 - UINT16 SectorsPerTrack; // (ignored) - UINT16 Heads; // (ignored) - UINT32 HiddenSectors; // (ignored) - UINT32 LargeSectors; // Used if Sectors==0 -} FAT_BOOT_SECTOR_BASIC; - -typedef struct { - UINT8 PhysicalDriveNumber; // (ignored) - UINT8 CurrentHead; // holds boot_sector_dirty bit - UINT8 Signature; // (ignored) - CHAR8 Id[4]; - CHAR8 FatLabel[11]; - CHAR8 SystemId[8]; -} FAT_BOOT_SECTOR_EXT; - -typedef struct { - UINT32 LargeSectorsPerFat; // FAT32 - UINT16 ExtendedFlags; // FAT32 (ignored) - UINT16 FsVersion; // FAT32 (ignored) - UINT32 RootDirFirstCluster; // FAT32 - UINT16 FsInfoSector; // FAT32 - UINT16 BackupBootSector; // FAT32 - UINT8 Reserved[12]; // FAT32 (ignored) - UINT8 PhysicalDriveNumber; // (ignored) - UINT8 CurrentHead; // holds boot_sector_dirty bit - UINT8 Signature; // (ignored) - CHAR8 Id[4]; - CHAR8 FatLabel[11]; - CHAR8 SystemId[8]; -} FAT32_BOOT_SECTOR_EXT; - -typedef union { - FAT_BOOT_SECTOR_EXT FatBse; - FAT32_BOOT_SECTOR_EXT Fat32Bse; - } FAT_BSE; - -typedef struct { - FAT_BOOT_SECTOR_BASIC FatBsb; - FAT_BSE FatBse; -} FAT_BOOT_SECTOR; - -// -// FAT Info Structure -// -typedef struct { - UINT32 ClusterCount; - UINT32 NextCluster; -} FAT_FREE_INFO; - -typedef struct { - UINT32 Signature; - UINT8 ExtraBootCode[480]; - UINT32 InfoBeginSignature; - FAT_FREE_INFO FreeInfo; - UINT8 Reserved[12]; - UINT32 InfoEndSignature; -} FAT_INFO_SECTOR; - -// -// Directory Entry -// -#define FAT_MAX_YEAR_FROM_1980 0x7f -typedef struct { - UINT16 Day : 5; - UINT16 Month : 4; - UINT16 Year : 7; // From 1980 -} FAT_DATE; - -typedef struct { - UINT16 DoubleSecond : 5; - UINT16 Minute : 6; - UINT16 Hour : 5; -} FAT_TIME; - -typedef struct { - FAT_TIME Time; - FAT_DATE Date; -} FAT_DATE_TIME; - -typedef struct { - CHAR8 FileName[11]; // 8.3 filename - UINT8 Attributes; - UINT8 CaseFlag; - UINT8 CreateMillisecond; // (creation milliseconds - ignored) - FAT_DATE_TIME FileCreateTime; - FAT_DATE FileLastAccess; - UINT16 FileClusterHigh; // >= FAT32 - FAT_DATE_TIME FileModificationTime; - UINT16 FileCluster; - UINT32 FileSize; -} FAT_DIRECTORY_ENTRY; - -typedef struct { - UINT8 Ordinal; - CHAR8 Name1[10]; // (Really 5 chars, but not WCHAR aligned) - UINT8 Attributes; - UINT8 Type; - UINT8 Checksum; - CHAR16 Name2[6]; - UINT16 MustBeZero; - CHAR16 Name3[2]; -} FAT_DIRECTORY_LFN; - -#pragma pack() - -#endif diff --git a/FatPkg/EnhancedFatDxe/FileName.c b/FatPkg/EnhancedFatDxe/FileName.c deleted file mode 100644 index 8aa37456ab..0000000000 --- a/FatPkg/EnhancedFatDxe/FileName.c +++ /dev/null @@ -1,505 +0,0 @@ -/** @file - Functions for manipulating file names. - -Copyright (c) 2005 - 2015, Intel Corporation. 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 "Fat.h" - -/** - - This function checks whether the input FileName is a valid 8.3 short name. - If the input FileName is a valid 8.3, the output is the 8.3 short name; - otherwise, the output is the base tag of 8.3 short name. - - @param FileName - The input unicode filename. - @param File8Dot3Name - The output ascii 8.3 short name or base tag of 8.3 short name. - - @retval TRUE - The input unicode filename is a valid 8.3 short name. - @retval FALSE - The input unicode filename is not a valid 8.3 short name. - -**/ -BOOLEAN -FatCheckIs8Dot3Name ( - IN CHAR16 *FileName, - OUT CHAR8 *File8Dot3Name - ) -{ - BOOLEAN PossibleShortName; - CHAR16 *TempName; - CHAR16 *ExtendName; - CHAR16 *SeparateDot; - UINTN MainNameLen; - UINTN ExtendNameLen; - - PossibleShortName = TRUE; - SeparateDot = NULL; - SetMem (File8Dot3Name, FAT_NAME_LEN, ' '); - for (TempName = FileName; *TempName != '\0'; TempName++) { - if (*TempName == L'.') { - SeparateDot = TempName; - } - } - - if (SeparateDot == NULL) { - // - // Extended filename is not detected - // - MainNameLen = TempName - FileName; - ExtendName = TempName; - ExtendNameLen = 0; - } else { - // - // Extended filename is detected - // - MainNameLen = SeparateDot - FileName; - ExtendName = SeparateDot + 1; - ExtendNameLen = TempName - ExtendName; - } - // - // We scan the filename for the second time - // to check if there exists any extra blanks and dots - // - while (--TempName >= FileName) { - if ((*TempName == L'.' || *TempName == L' ') && (TempName != SeparateDot)) { - // - // There exist extra blanks and dots - // - PossibleShortName = FALSE; - } - } - - if (MainNameLen == 0) { - PossibleShortName = FALSE; - } - - if (MainNameLen > FAT_MAIN_NAME_LEN) { - PossibleShortName = FALSE; - MainNameLen = FAT_MAIN_NAME_LEN; - } - - if (ExtendNameLen > FAT_EXTEND_NAME_LEN) { - PossibleShortName = FALSE; - ExtendNameLen = FAT_EXTEND_NAME_LEN; - } - - if (FatStrToFat (FileName, MainNameLen, File8Dot3Name)) { - PossibleShortName = FALSE; - } - - if (FatStrToFat (ExtendName, ExtendNameLen, File8Dot3Name + FAT_MAIN_NAME_LEN)) { - PossibleShortName = FALSE; - } - - return PossibleShortName; -} - -/** - - Trim the trailing blanks of fat name. - - @param Name - The Char8 string needs to be trimed. - @param Len - The length of the fat name. - - The real length of the fat name after the trailing blanks are trimmed. - -**/ -STATIC -UINTN -FatTrimAsciiTrailingBlanks ( - IN CHAR8 *Name, - IN UINTN Len - ) -{ - while (Len > 0 && Name[Len - 1] == ' ') { - Len--; - } - - return Len; -} - -/** - - Convert the ascii fat name to the unicode string and strip trailing spaces, - and if necessary, convert the unicode string to lower case. - - @param FatName - The Char8 string needs to be converted. - @param Len - The length of the fat name. - @param LowerCase - Indicate whether to convert the string to lower case. - @param Str - The result of the convertion. - -**/ -VOID -FatNameToStr ( - IN CHAR8 *FatName, - IN UINTN Len, - IN UINTN LowerCase, - OUT CHAR16 *Str - ) -{ - // - // First, trim the trailing blanks - // - Len = FatTrimAsciiTrailingBlanks (FatName, Len); - // - // Convert fat string to unicode string - // - FatFatToStr (Len, FatName, Str); - - // - // If the name is to be lower cased, do it now - // - if (LowerCase != 0) { - FatStrLwr (Str); - } -} - -/** - - This function generates 8Dot3 name from user specified name for a newly created file. - - @param Parent - The parent directory. - @param DirEnt - The directory entry whose 8Dot3Name needs to be generated. - -**/ -VOID -FatCreate8Dot3Name ( - IN FAT_OFILE *Parent, - IN FAT_DIRENT *DirEnt - ) -{ - CHAR8 *ShortName; - CHAR8 *ShortNameChar; - UINTN BaseTagLen; - UINTN Index; - UINTN Retry; - UINT8 Segment; - union { - UINT32 Crc; - struct HEX_DATA { - UINT8 Segment : HASH_VALUE_TAG_LEN; - } Hex[HASH_VALUE_TAG_LEN]; - } HashValue; - // - // Make sure the whole directory has been loaded - // - ASSERT (Parent->ODir->EndOfDir); - ShortName = DirEnt->Entry.FileName; - - // - // Trim trailing blanks of 8.3 name - // - BaseTagLen = FatTrimAsciiTrailingBlanks (ShortName, FAT_MAIN_NAME_LEN); - if (BaseTagLen > SPEC_BASE_TAG_LEN) { - BaseTagLen = SPEC_BASE_TAG_LEN; - } - // - // We first use the algorithm described by spec. - // - ShortNameChar = ShortName + BaseTagLen; - *ShortNameChar++ = '~'; - *ShortNameChar = '1'; - Retry = 0; - while (*FatShortNameHashSearch (Parent->ODir, ShortName) != NULL) { - *ShortNameChar = (CHAR8)(*ShortNameChar + 1); - if (++Retry == MAX_SPEC_RETRY) { - // - // We use new algorithm to generate 8.3 name - // - ASSERT (DirEnt->FileString != NULL); - gBS->CalculateCrc32 (DirEnt->FileString, StrSize (DirEnt->FileString), &HashValue.Crc); - - if (BaseTagLen > HASH_BASE_TAG_LEN) { - BaseTagLen = HASH_BASE_TAG_LEN; - } - - ShortNameChar = ShortName + BaseTagLen; - for (Index = 0; Index < HASH_VALUE_TAG_LEN; Index++) { - Segment = HashValue.Hex[Index].Segment; - if (Segment > 9) { - *ShortNameChar++ = (CHAR8)(Segment - 10 + 'A'); - } else { - *ShortNameChar++ = (CHAR8)(Segment + '0'); - } - } - - *ShortNameChar++ = '~'; - *ShortNameChar = '1'; - } - } -} - -/** - - Check the string is lower case or upper case - and it is used by fatname to dir entry count - - @param Str - The string which needs to be checked. - @param InCaseFlag - The input case flag which is returned when the string is lower case. - - @retval OutCaseFlag - The output case flag. - -**/ -STATIC -UINT8 -FatCheckNameCase ( - IN CHAR16 *Str, - IN UINT8 InCaseFlag - ) -{ - CHAR16 Buffer[FAT_MAIN_NAME_LEN + 1 + FAT_EXTEND_NAME_LEN + 1]; - UINT8 OutCaseFlag; - - // - // Assume the case of input string is mixed - // - OutCaseFlag = FAT_CASE_MIXED; - // - // Lower case a copy of the string, if it matches the - // original then the string is lower case - // - StrCpyS (Buffer, ARRAY_SIZE (Buffer), Str); - FatStrLwr (Buffer); - if (StrCmp (Str, Buffer) == 0) { - OutCaseFlag = InCaseFlag; - } - // - // Upper case a copy of the string, if it matches the - // original then the string is upper case - // - StrCpyS (Buffer, ARRAY_SIZE (Buffer), Str); - FatStrUpr (Buffer); - if (StrCmp (Str, Buffer) == 0) { - OutCaseFlag = 0; - } - - return OutCaseFlag; -} - -/** - - Set the caseflag value for the directory entry. - - @param DirEnt - The logical directory entry whose caseflag value is to be set. - -**/ -VOID -FatSetCaseFlag ( - IN FAT_DIRENT *DirEnt - ) -{ - CHAR16 LfnBuffer[FAT_MAIN_NAME_LEN + 1 + FAT_EXTEND_NAME_LEN + 1]; - CHAR16 *TempCharPtr; - CHAR16 *ExtendName; - CHAR16 *FileNameCharPtr; - UINT8 CaseFlag; - - ExtendName = NULL; - TempCharPtr = LfnBuffer; - FileNameCharPtr = DirEnt->FileString; - ASSERT (StrSize (DirEnt->FileString) <= sizeof (LfnBuffer)); - while ((*TempCharPtr = *FileNameCharPtr) != 0) { - if (*TempCharPtr == L'.') { - ExtendName = TempCharPtr; - } - - TempCharPtr++; - FileNameCharPtr++; - } - - CaseFlag = 0; - if (ExtendName != NULL) { - *ExtendName = 0; - ExtendName++; - CaseFlag = (UINT8)(CaseFlag | FatCheckNameCase (ExtendName, FAT_CASE_EXT_LOWER)); - } - - CaseFlag = (UINT8)(CaseFlag | FatCheckNameCase (LfnBuffer, FAT_CASE_NAME_LOWER)); - if ((CaseFlag & FAT_CASE_MIXED) == 0) { - // - // We just need one directory entry to store this file name entry - // - DirEnt->Entry.CaseFlag = CaseFlag; - } else { - // - // We need one extra directory entry to store the mixed case entry - // - DirEnt->Entry.CaseFlag = 0; - DirEnt->EntryCount++; - } -} - -/** - - Convert the 8.3 ASCII fat name to cased Unicode string according to case flag. - - @param DirEnt - The corresponding directory entry. - @param FileString - The output Unicode file name. - @param FileStringMax The max length of FileString. - -**/ -VOID -FatGetFileNameViaCaseFlag ( - IN FAT_DIRENT *DirEnt, - IN OUT CHAR16 *FileString, - IN UINTN FileStringMax - ) -{ - UINT8 CaseFlag; - CHAR8 *File8Dot3Name; - CHAR16 TempExt[1 + FAT_EXTEND_NAME_LEN + 1]; - // - // Store file extension like ".txt" - // - CaseFlag = DirEnt->Entry.CaseFlag; - File8Dot3Name = DirEnt->Entry.FileName; - - FatNameToStr (File8Dot3Name, FAT_MAIN_NAME_LEN, CaseFlag & FAT_CASE_NAME_LOWER, FileString); - FatNameToStr (File8Dot3Name + FAT_MAIN_NAME_LEN, FAT_EXTEND_NAME_LEN, CaseFlag & FAT_CASE_EXT_LOWER, &TempExt[1]); - if (TempExt[1] != 0) { - TempExt[0] = L'.'; - StrCatS (FileString, FileStringMax, TempExt); - } -} - -/** - - Get the Check sum for a short name. - - @param ShortNameString - The short name for a file. - - @retval Sum - UINT8 checksum. - -**/ -UINT8 -FatCheckSum ( - IN CHAR8 *ShortNameString - ) -{ - UINTN ShortNameLen; - UINT8 Sum; - Sum = 0; - for (ShortNameLen = FAT_NAME_LEN; ShortNameLen != 0; ShortNameLen--) { - Sum = (UINT8)((((Sum & 1) != 0) ? 0x80 : 0) + (Sum >> 1) + *ShortNameString++); - } - - return Sum; -} - -/** - - Takes Path as input, returns the next name component - in Name, and returns the position after Name (e.g., the - start of the next name component) - - @param Path - The path of one file. - @param Name - The next name component in Path. - - The position after Name in the Path - -**/ -CHAR16 * -FatGetNextNameComponent ( - IN CHAR16 *Path, - OUT CHAR16 *Name - ) -{ - while (*Path != 0 && *Path != PATH_NAME_SEPARATOR) { - *Name++ = *Path++; - } - *Name = 0; - // - // Get off of trailing path name separator - // - while (*Path == PATH_NAME_SEPARATOR) { - Path++; - } - - return Path; -} - -/** - - Check whether the IFileName is valid long file name. If the IFileName is a valid - long file name, then we trim the possible leading blanks and leading/trailing dots. - the trimmed filename is stored in OutputFileName - - @param InputFileName - The input file name. - @param OutputFileName - The output file name. - - @retval TRUE - The InputFileName is a valid long file name. - @retval FALSE - The InputFileName is not a valid long file name. - -**/ -BOOLEAN -FatFileNameIsValid ( - IN CHAR16 *InputFileName, - OUT CHAR16 *OutputFileName - ) -{ - CHAR16 *TempNamePointer; - CHAR16 TempChar; - // - // Trim Leading blanks - // - while (*InputFileName == L' ') { - InputFileName++; - } - - TempNamePointer = OutputFileName; - while (*InputFileName != 0) { - *TempNamePointer++ = *InputFileName++; - } - // - // Trim Trailing blanks and dots - // - while (TempNamePointer > OutputFileName) { - TempChar = *(TempNamePointer - 1); - if (TempChar != L' ' && TempChar != L'.') { - break; - } - - TempNamePointer--; - } - - *TempNamePointer = 0; - - // - // Per FAT Spec the file name should meet the following criteria: - // C1. Length (FileLongName) <= 255 - // C2. Length (X:FileFullPath) <= 260 - // Here we check C1. - // - if (TempNamePointer - OutputFileName > EFI_FILE_STRING_LENGTH) { - return FALSE; - } - // - // See if there is any illegal characters within the name - // - do { - if (*OutputFileName < 0x20 || - *OutputFileName == '\"' || - *OutputFileName == '*' || - *OutputFileName == '/' || - *OutputFileName == ':' || - *OutputFileName == '<' || - *OutputFileName == '>' || - *OutputFileName == '?' || - *OutputFileName == '\\' || - *OutputFileName == '|' - ) { - return FALSE; - } - - OutputFileName++; - } while (*OutputFileName != 0); - return TRUE; -} diff --git a/FatPkg/EnhancedFatDxe/FileSpace.c b/FatPkg/EnhancedFatDxe/FileSpace.c deleted file mode 100644 index 1254cd68b5..0000000000 --- a/FatPkg/EnhancedFatDxe/FileSpace.c +++ /dev/null @@ -1,736 +0,0 @@ -/** @file - Routines dealing with disk spaces and FAT table entries. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - - -/** - - Get the FAT entry of the volume, which is identified with the Index. - - @param Volume - FAT file system volume. - @param Index - The index of the FAT entry of the volume. - - @return The buffer of the FAT entry - -**/ -STATIC -VOID * -FatLoadFatEntry ( - IN FAT_VOLUME *Volume, - IN UINTN Index - ) -{ - UINTN Pos; - EFI_STATUS Status; - - if (Index > (Volume->MaxCluster + 1)) { - Volume->FatEntryBuffer = (UINT32) -1; - return &Volume->FatEntryBuffer; - } - // - // Compute buffer position needed - // - switch (Volume->FatType) { - case Fat12: - Pos = FAT_POS_FAT12 (Index); - break; - - case Fat16: - Pos = FAT_POS_FAT16 (Index); - break; - - default: - Pos = FAT_POS_FAT32 (Index); - } - // - // Set the position and read the buffer - // - Volume->FatEntryPos = Volume->FatPos + Pos; - Status = FatDiskIo ( - Volume, - ReadFat, - Volume->FatEntryPos, - Volume->FatEntrySize, - &Volume->FatEntryBuffer, - NULL - ); - if (EFI_ERROR (Status)) { - Volume->FatEntryBuffer = (UINT32) -1; - } - - return &Volume->FatEntryBuffer; -} - -/** - - Get the FAT entry value of the volume, which is identified with the Index. - - @param Volume - FAT file system volume. - @param Index - The index of the FAT entry of the volume. - - @return The value of the FAT entry. - -**/ -STATIC -UINTN -FatGetFatEntry ( - IN FAT_VOLUME *Volume, - IN UINTN Index - ) -{ - VOID *Pos; - UINT8 *En12; - UINT16 *En16; - UINT32 *En32; - UINTN Accum; - - Pos = FatLoadFatEntry (Volume, Index); - - if (Index > (Volume->MaxCluster + 1)) { - return (UINTN) -1; - } - - switch (Volume->FatType) { - case Fat12: - En12 = Pos; - Accum = En12[0] | (En12[1] << 8); - Accum = FAT_ODD_CLUSTER_FAT12 (Index) ? (Accum >> 4) : (Accum & FAT_CLUSTER_MASK_FAT12); - Accum = Accum | ((Accum >= FAT_CLUSTER_SPECIAL_FAT12) ? FAT_CLUSTER_SPECIAL_EXT : 0); - break; - - case Fat16: - En16 = Pos; - Accum = *En16; - Accum = Accum | ((Accum >= FAT_CLUSTER_SPECIAL_FAT16) ? FAT_CLUSTER_SPECIAL_EXT : 0); - break; - - default: - En32 = Pos; - Accum = *En32 & FAT_CLUSTER_MASK_FAT32; - Accum = Accum | ((Accum >= FAT_CLUSTER_SPECIAL_FAT32) ? FAT_CLUSTER_SPECIAL_EXT : 0); - } - - return Accum; -} - -/** - - Set the FAT entry value of the volume, which is identified with the Index. - - @param Volume - FAT file system volume. - @param Index - The index of the FAT entry of the volume. - @param Value - The new value of the FAT entry. - - @retval EFI_SUCCESS - Set the new FAT entry value sucessfully. - @retval EFI_VOLUME_CORRUPTED - The FAT type of the volume is error. - @return other - An error occurred when operation the FAT entries. - -**/ -STATIC -EFI_STATUS -FatSetFatEntry ( - IN FAT_VOLUME *Volume, - IN UINTN Index, - IN UINTN Value - ) -{ - VOID *Pos; - UINT8 *En12; - UINT16 *En16; - UINT32 *En32; - UINTN Accum; - EFI_STATUS Status; - UINTN OriginalVal; - - if (Index < FAT_MIN_CLUSTER) { - return EFI_VOLUME_CORRUPTED; - } - - OriginalVal = FatGetFatEntry (Volume, Index); - if (Value == FAT_CLUSTER_FREE && OriginalVal != FAT_CLUSTER_FREE) { - Volume->FatInfoSector.FreeInfo.ClusterCount += 1; - if (Index < Volume->FatInfoSector.FreeInfo.NextCluster) { - Volume->FatInfoSector.FreeInfo.NextCluster = (UINT32) Index; - } - } else if (Value != FAT_CLUSTER_FREE && OriginalVal == FAT_CLUSTER_FREE) { - if (Volume->FatInfoSector.FreeInfo.ClusterCount != 0) { - Volume->FatInfoSector.FreeInfo.ClusterCount -= 1; - } - } - // - // Make sure the entry is in memory - // - Pos = FatLoadFatEntry (Volume, Index); - - // - // Update the value - // - switch (Volume->FatType) { - case Fat12: - En12 = Pos; - Accum = En12[0] | (En12[1] << 8); - Value = Value & FAT_CLUSTER_MASK_FAT12; - - if (FAT_ODD_CLUSTER_FAT12 (Index)) { - Accum = (Value << 4) | (Accum & 0xF); - } else { - Accum = Value | (Accum & FAT_CLUSTER_UNMASK_FAT12); - } - - En12[0] = (UINT8) (Accum & 0xFF); - En12[1] = (UINT8) (Accum >> 8); - break; - - case Fat16: - En16 = Pos; - *En16 = (UINT16) Value; - break; - - default: - En32 = Pos; - *En32 = (*En32 & FAT_CLUSTER_UNMASK_FAT32) | (UINT32) (Value & FAT_CLUSTER_MASK_FAT32); - } - // - // If the volume's dirty bit is not set, set it now - // - if (!Volume->FatDirty && Volume->FatType != Fat12) { - Volume->FatDirty = TRUE; - FatAccessVolumeDirty (Volume, WriteFat, &Volume->DirtyValue); - } - // - // Write the updated fat entry value to the volume - // The fat is the first fat, and other fat will be in sync - // when the FAT cache flush back. - // - Status = FatDiskIo ( - Volume, - WriteFat, - Volume->FatEntryPos, - Volume->FatEntrySize, - &Volume->FatEntryBuffer, - NULL - ); - return Status; -} - -/** - - Free the cluster clain. - - @param Volume - FAT file system volume. - @param Cluster - The first cluster of cluster chain. - - @retval EFI_SUCCESS - The cluster chain is freed successfully. - @retval EFI_VOLUME_CORRUPTED - There are errors in the file's clusters. - -**/ -STATIC -EFI_STATUS -FatFreeClusters ( - IN FAT_VOLUME *Volume, - IN UINTN Cluster - ) -{ - UINTN LastCluster; - - while (!FAT_END_OF_FAT_CHAIN (Cluster)) { - if (Cluster == FAT_CLUSTER_FREE || Cluster >= FAT_CLUSTER_SPECIAL) { - - DEBUG ((EFI_D_INIT | EFI_D_ERROR, "FatShrinkEof: cluster chain corrupt\n")); - return EFI_VOLUME_CORRUPTED; - } - - LastCluster = Cluster; - Cluster = FatGetFatEntry (Volume, Cluster); - FatSetFatEntry (Volume, LastCluster, FAT_CLUSTER_FREE); - } - - return EFI_SUCCESS; -} - -/** - - Allocate a free cluster and return the cluster index. - - @param Volume - FAT file system volume. - - @return The index of the free cluster - -**/ -STATIC -UINTN -FatAllocateCluster ( - IN FAT_VOLUME *Volume - ) -{ - UINTN Cluster; - - // - // Start looking at FatFreePos for the next unallocated cluster - // - if (Volume->DiskError) { - return (UINTN) FAT_CLUSTER_LAST; - } - - for (;;) { - // - // If the end of the list, return no available cluster - // - if (Volume->FatInfoSector.FreeInfo.NextCluster > (Volume->MaxCluster + 1)) { - if (Volume->FreeInfoValid && 0 < (INT32) (Volume->FatInfoSector.FreeInfo.ClusterCount)) { - Volume->FreeInfoValid = FALSE; - } - - FatComputeFreeInfo (Volume); - if (Volume->FatInfoSector.FreeInfo.NextCluster > (Volume->MaxCluster + 1)) { - return (UINTN) FAT_CLUSTER_LAST; - } - } - - Cluster = FatGetFatEntry (Volume, Volume->FatInfoSector.FreeInfo.NextCluster); - if (Cluster == FAT_CLUSTER_FREE) { - break; - } - // - // Try the next cluster - // - Volume->FatInfoSector.FreeInfo.NextCluster += 1; - } - - Cluster = Volume->FatInfoSector.FreeInfo.NextCluster; - Volume->FatInfoSector.FreeInfo.NextCluster += 1; - return Cluster; -} - -/** - - Count the number of clusters given a size. - - @param Volume - The file system volume. - @param Size - The size in bytes. - - @return The number of the clusters. - -**/ -STATIC -UINTN -FatSizeToClusters ( - IN FAT_VOLUME *Volume, - IN UINTN Size - ) -{ - UINTN Clusters; - - Clusters = Size >> Volume->ClusterAlignment; - if ((Size & (Volume->ClusterSize - 1)) > 0) { - Clusters += 1; - } - - return Clusters; -} - -/** - - Shrink the end of the open file base on the file size. - - @param OFile - The open file. - - @retval EFI_SUCCESS - Shrinked sucessfully. - @retval EFI_VOLUME_CORRUPTED - There are errors in the file's clusters. - -**/ -EFI_STATUS -FatShrinkEof ( - IN FAT_OFILE *OFile - ) -{ - FAT_VOLUME *Volume; - UINTN NewSize; - UINTN CurSize; - UINTN Cluster; - UINTN LastCluster; - - Volume = OFile->Volume; - ASSERT_VOLUME_LOCKED (Volume); - - NewSize = FatSizeToClusters (Volume, OFile->FileSize); - - // - // Find the address of the last cluster - // - Cluster = OFile->FileCluster; - LastCluster = FAT_CLUSTER_FREE; - - if (NewSize != 0) { - - for (CurSize = 0; CurSize < NewSize; CurSize++) { - if (Cluster == FAT_CLUSTER_FREE || Cluster >= FAT_CLUSTER_SPECIAL) { - - DEBUG ((EFI_D_INIT | EFI_D_ERROR, "FatShrinkEof: cluster chain corrupt\n")); - return EFI_VOLUME_CORRUPTED; - } - - LastCluster = Cluster; - Cluster = FatGetFatEntry (Volume, Cluster); - } - - FatSetFatEntry (Volume, LastCluster, (UINTN) FAT_CLUSTER_LAST); - - } else { - // - // Check to see if the file is already completely truncated - // - if (Cluster == FAT_CLUSTER_FREE) { - return EFI_SUCCESS; - } - // - // The file is being completely truncated. - // - OFile->FileCluster = FAT_CLUSTER_FREE; - } - // - // Set CurrentCluster == FileCluster - // to force a recalculation of Position related stuffs - // - OFile->FileCurrentCluster = OFile->FileCluster; - OFile->FileLastCluster = LastCluster; - OFile->Dirty = TRUE; - // - // Free the remaining cluster chain - // - return FatFreeClusters (Volume, Cluster); -} - -/** - - Grow the end of the open file base on the NewSizeInBytes. - - @param OFile - The open file. - @param NewSizeInBytes - The new size in bytes of the open file. - - @retval EFI_SUCCESS - The file is grown sucessfully. - @retval EFI_UNSUPPORTED - The file size is larger than 4GB. - @retval EFI_VOLUME_CORRUPTED - There are errors in the files' clusters. - @retval EFI_VOLUME_FULL - The volume is full and can not grow the file. - -**/ -EFI_STATUS -FatGrowEof ( - IN FAT_OFILE *OFile, - IN UINT64 NewSizeInBytes - ) -{ - FAT_VOLUME *Volume; - EFI_STATUS Status; - UINTN Cluster; - UINTN CurSize; - UINTN NewSize; - UINTN LastCluster; - UINTN NewCluster; - UINTN ClusterCount; - - // - // For FAT file system, the max file is 4GB. - // - if (NewSizeInBytes > 0x0FFFFFFFFL) { - return EFI_UNSUPPORTED; - } - - Volume = OFile->Volume; - ASSERT_VOLUME_LOCKED (Volume); - // - // If the file is already large enough, do nothing - // - CurSize = FatSizeToClusters (Volume, OFile->FileSize); - NewSize = FatSizeToClusters (Volume, (UINTN) NewSizeInBytes); - - if (CurSize < NewSize) { - // - // If we haven't found the files last cluster do it now - // - if ((OFile->FileCluster != 0) && (OFile->FileLastCluster == 0)) { - Cluster = OFile->FileCluster; - ClusterCount = 0; - - while (!FAT_END_OF_FAT_CHAIN (Cluster)) { - if (Cluster == FAT_CLUSTER_FREE || Cluster >= FAT_CLUSTER_SPECIAL) { - - DEBUG ( - (EFI_D_INIT | EFI_D_ERROR, - "FatGrowEof: cluster chain corrupt\n") - ); - Status = EFI_VOLUME_CORRUPTED; - goto Done; - } - - ClusterCount++; - OFile->FileLastCluster = Cluster; - Cluster = FatGetFatEntry (Volume, Cluster); - } - - if (ClusterCount != CurSize) { - DEBUG ( - (EFI_D_INIT | EFI_D_ERROR, - "FatGrowEof: cluster chain size does not match file size\n") - ); - Status = EFI_VOLUME_CORRUPTED; - goto Done; - } - - } - // - // Loop until we've allocated enough space - // - LastCluster = OFile->FileLastCluster; - - while (CurSize < NewSize) { - NewCluster = FatAllocateCluster (Volume); - if (FAT_END_OF_FAT_CHAIN (NewCluster)) { - if (LastCluster != FAT_CLUSTER_FREE) { - FatSetFatEntry (Volume, LastCluster, (UINTN) FAT_CLUSTER_LAST); - OFile->FileLastCluster = LastCluster; - } - - Status = EFI_VOLUME_FULL; - goto Done; - } - - if (LastCluster != 0) { - FatSetFatEntry (Volume, LastCluster, NewCluster); - } else { - OFile->FileCluster = NewCluster; - OFile->FileCurrentCluster = NewCluster; - } - - LastCluster = NewCluster; - CurSize += 1; - } - // - // Terminate the cluster list - // - FatSetFatEntry (Volume, LastCluster, (UINTN) FAT_CLUSTER_LAST); - OFile->FileLastCluster = LastCluster; - } - - OFile->FileSize = (UINTN) NewSizeInBytes; - OFile->Dirty = TRUE; - return EFI_SUCCESS; - -Done: - FatShrinkEof (OFile); - return Status; -} - -/** - - Seek OFile to requested position, and calculate the number of - consecutive clusters from the position in the file - - @param OFile - The open file. - @param Position - The file's position which will be accessed. - @param PosLimit - The maximum length current reading/writing may access - - @retval EFI_SUCCESS - Set the info successfully. - @retval EFI_VOLUME_CORRUPTED - Cluster chain corrupt. - -**/ -EFI_STATUS -FatOFilePosition ( - IN FAT_OFILE *OFile, - IN UINTN Position, - IN UINTN PosLimit - ) -{ - FAT_VOLUME *Volume; - UINTN ClusterSize; - UINTN Cluster; - UINTN StartPos; - UINTN Run; - - Volume = OFile->Volume; - ClusterSize = Volume->ClusterSize; - - ASSERT_VOLUME_LOCKED (Volume); - - // - // If this is the fixed root dir, then compute it's position - // from it's fixed info in the fat bpb - // - if (OFile->IsFixedRootDir) { - OFile->PosDisk = Volume->RootPos + Position; - Run = OFile->FileSize - Position; - } else { - // - // Run the file's cluster chain to find the current position - // If possible, run from the current cluster rather than - // start from beginning - // Assumption: OFile->Position is always consistent with - // OFile->FileCurrentCluster. - // OFile->Position is not modified outside this function; - // OFile->FileCurrentCluster is modified outside this function - // to be the same as OFile->FileCluster - // when OFile->FileCluster is updated, so make a check of this - // and invalidate the original OFile->Position in this case - // - Cluster = OFile->FileCurrentCluster; - StartPos = OFile->Position; - if (Position < StartPos || OFile->FileCluster == Cluster) { - StartPos = 0; - Cluster = OFile->FileCluster; - } - - while (StartPos + ClusterSize <= Position) { - StartPos += ClusterSize; - if (Cluster == FAT_CLUSTER_FREE || (Cluster >= FAT_CLUSTER_SPECIAL)) { - DEBUG ((EFI_D_INIT | EFI_D_ERROR, "FatOFilePosition:"" cluster chain corrupt\n")); - return EFI_VOLUME_CORRUPTED; - } - - Cluster = FatGetFatEntry (Volume, Cluster); - } - - if (Cluster < FAT_MIN_CLUSTER) { - return EFI_VOLUME_CORRUPTED; - } - - OFile->PosDisk = Volume->FirstClusterPos + - LShiftU64 (Cluster - FAT_MIN_CLUSTER, Volume->ClusterAlignment) + - Position - StartPos; - OFile->FileCurrentCluster = Cluster; - OFile->Position = StartPos; - - // - // Compute the number of consecutive clusters in the file - // - Run = StartPos + ClusterSize - Position; - if (!FAT_END_OF_FAT_CHAIN (Cluster)) { - while ((FatGetFatEntry (Volume, Cluster) == Cluster + 1) && Run < PosLimit) { - Run += ClusterSize; - Cluster += 1; - } - } - } - - OFile->PosRem = Run; - return EFI_SUCCESS; -} - -/** - - Get the size of directory of the open file. - - @param Volume - The File System Volume. - @param Cluster - The Starting cluster. - - @return The physical size of the file starting at the input cluster, if there is error in the - cluster chain, the return value is 0. - -**/ -UINTN -FatPhysicalDirSize ( - IN FAT_VOLUME *Volume, - IN UINTN Cluster - ) -{ - UINTN Size; - ASSERT_VOLUME_LOCKED (Volume); - // - // Run the cluster chain for the OFile - // - Size = 0; - // - // N.B. ".." directories on some media do not contain a starting - // cluster. In the case of "." or ".." we don't need the size anyway. - // - if (Cluster != 0) { - while (!FAT_END_OF_FAT_CHAIN (Cluster)) { - if (Cluster == FAT_CLUSTER_FREE || Cluster >= FAT_CLUSTER_SPECIAL) { - DEBUG ( - (EFI_D_INIT | EFI_D_ERROR, - "FATDirSize: cluster chain corrupt\n") - ); - return 0; - } - - Size += Volume->ClusterSize; - Cluster = FatGetFatEntry (Volume, Cluster); - } - } - - return Size; -} - -/** - - Get the physical size of a file on the disk. - - @param Volume - The file system volume. - @param RealSize - The real size of a file. - - @return The physical size of a file on the disk. - -**/ -UINT64 -FatPhysicalFileSize ( - IN FAT_VOLUME *Volume, - IN UINTN RealSize - ) -{ - UINTN ClusterSizeMask; - UINT64 PhysicalSize; - ClusterSizeMask = Volume->ClusterSize - 1; - PhysicalSize = (RealSize + ClusterSizeMask) & (~((UINT64) ClusterSizeMask)); - return PhysicalSize; -} - -/** - - Update the free cluster info of FatInfoSector of the volume. - - @param Volume - FAT file system volume. - -**/ -VOID -FatComputeFreeInfo ( - IN FAT_VOLUME *Volume - ) -{ - UINTN Index; - - // - // If we don't have valid info, compute it now - // - if (!Volume->FreeInfoValid) { - - Volume->FreeInfoValid = TRUE; - Volume->FatInfoSector.FreeInfo.ClusterCount = 0; - for (Index = Volume->MaxCluster + 1; Index >= FAT_MIN_CLUSTER; Index--) { - if (Volume->DiskError) { - break; - } - - if (FatGetFatEntry (Volume, Index) == FAT_CLUSTER_FREE) { - Volume->FatInfoSector.FreeInfo.ClusterCount += 1; - Volume->FatInfoSector.FreeInfo.NextCluster = (UINT32) Index; - } - } - - Volume->FatInfoSector.Signature = FAT_INFO_SIGNATURE; - Volume->FatInfoSector.InfoBeginSignature = FAT_INFO_BEGIN_SIGNATURE; - Volume->FatInfoSector.InfoEndSignature = FAT_INFO_END_SIGNATURE; - } -} diff --git a/FatPkg/EnhancedFatDxe/Flush.c b/FatPkg/EnhancedFatDxe/Flush.c deleted file mode 100644 index 9cb0d9ac18..0000000000 --- a/FatPkg/EnhancedFatDxe/Flush.c +++ /dev/null @@ -1,474 +0,0 @@ -/** @file - Routines that check references and flush OFiles - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - -/** - - Flushes all data associated with the file handle. - - @param FHand - Handle to file to flush. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Flushed the file successfully. - @retval EFI_WRITE_PROTECTED - The volume is read only. - @retval EFI_ACCESS_DENIED - The file is read only. - @return Others - Flushing of the file failed. - -**/ -EFI_STATUS -EFIAPI -FatFlushEx ( - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_FILE_IO_TOKEN *Token - ) -{ - FAT_IFILE *IFile; - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - EFI_STATUS Status; - FAT_TASK *Task; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - Volume = OFile->Volume; - Task = NULL; - - // - // If the file has a permanent error, return it - // - if (EFI_ERROR (OFile->Error)) { - return OFile->Error; - } - - if (Volume->ReadOnly) { - return EFI_WRITE_PROTECTED; - } - // - // If read only, return error - // - if (IFile->ReadOnly) { - return EFI_ACCESS_DENIED; - } - - if (Token == NULL) { - FatWaitNonblockingTask (IFile); - } else { - // - // Caller shouldn't call the non-blocking interfaces if the low layer doesn't support DiskIo2. - // But if it calls, the below check can avoid crash. - // - if (FHand->Revision < EFI_FILE_PROTOCOL_REVISION2) { - return EFI_UNSUPPORTED; - } - Task = FatCreateTask (IFile, Token); - if (Task == NULL) { - return EFI_OUT_OF_RESOURCES; - } - } - - // - // Flush the OFile - // - FatAcquireLock (); - Status = FatOFileFlush (OFile); - Status = FatCleanupVolume (OFile->Volume, OFile, Status, Task); - FatReleaseLock (); - - if (Token != NULL) { - if (!EFI_ERROR (Status)) { - Status = FatQueueTask (IFile, Task); - } else { - FatDestroyTask (Task); - } - } - - return Status; -} - -/** - - Flushes all data associated with the file handle. - - @param FHand - Handle to file to flush. - - @retval EFI_SUCCESS - Flushed the file successfully. - @retval EFI_WRITE_PROTECTED - The volume is read only. - @retval EFI_ACCESS_DENIED - The file is read only. - @return Others - Flushing of the file failed. - -**/ -EFI_STATUS -EFIAPI -FatFlush ( - IN EFI_FILE_PROTOCOL *FHand - ) -{ - return FatFlushEx (FHand, NULL); -} - -/** - - Flushes & Closes the file handle. - - @param FHand - Handle to the file to delete. - - @retval EFI_SUCCESS - Closed the file successfully. - -**/ -EFI_STATUS -EFIAPI -FatClose ( - IN EFI_FILE_PROTOCOL *FHand - ) -{ - FAT_IFILE *IFile; - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - Volume = OFile->Volume; - - // - // Lock the volume - // - FatAcquireLock (); - - // - // Close the file instance handle - // - FatIFileClose (IFile); - - // - // Done. Unlock the volume - // - FatCleanupVolume (Volume, OFile, EFI_SUCCESS, NULL); - FatReleaseLock (); - - // - // Close always succeed - // - return EFI_SUCCESS; -} - -/** - - Close the open file instance. - - @param IFile - Open file instance. - - @retval EFI_SUCCESS - Closed the file successfully. - -**/ -EFI_STATUS -FatIFileClose ( - FAT_IFILE *IFile - ) -{ - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - - OFile = IFile->OFile; - Volume = OFile->Volume; - - ASSERT_VOLUME_LOCKED (Volume); - - FatWaitNonblockingTask (IFile); - - // - // Remove the IFile struct - // - RemoveEntryList (&IFile->Link); - - // - // Add the OFile to the check reference list - // - if (OFile->CheckLink.ForwardLink == NULL) { - InsertHeadList (&Volume->CheckRef, &OFile->CheckLink); - } - // - // Done. Free the open instance structure - // - FreePool (IFile); - return EFI_SUCCESS; -} - -/** - - Flush the data associated with an open file. - In this implementation, only last Mod/Access time is updated. - - @param OFile - The open file. - - @retval EFI_SUCCESS - The OFile is flushed successfully. - @return Others - An error occurred when flushing this OFile. - -**/ -EFI_STATUS -FatOFileFlush ( - IN FAT_OFILE *OFile - ) -{ - EFI_STATUS Status; - FAT_OFILE *Parent; - FAT_DIRENT *DirEnt; - FAT_DATE_TIME FatNow; - - // - // Flush each entry up the tree while dirty - // - do { - // - // If the file has a permanant error, then don't write any - // of its data to the device (may be from different media) - // - if (EFI_ERROR (OFile->Error)) { - return OFile->Error; - } - - Parent = OFile->Parent; - DirEnt = OFile->DirEnt; - if (OFile->Dirty) { - // - // Update the last modification time - // - FatGetCurrentFatTime (&FatNow); - CopyMem (&DirEnt->Entry.FileLastAccess, &FatNow.Date, sizeof (FAT_DATE)); - if (!OFile->PreserveLastModification) { - FatGetCurrentFatTime (&DirEnt->Entry.FileModificationTime); - } - - OFile->PreserveLastModification = FALSE; - if (OFile->Archive) { - DirEnt->Entry.Attributes |= FAT_ATTRIBUTE_ARCHIVE; - OFile->Archive = FALSE; - } - // - // Write the directory entry - // - if (Parent != NULL && !DirEnt->Invalid) { - // - // Write the OFile's directory entry - // - Status = FatStoreDirEnt (Parent, DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - } - - OFile->Dirty = FALSE; - } - // - // Check the parent - // - OFile = Parent; - } while (OFile != NULL); - return EFI_SUCCESS; -} - -/** - - Check the references of the OFile. - If the OFile (that is checked) is no longer - referenced, then it is freed. - - @param OFile - The OFile to be checked. - - @retval TRUE - The OFile is not referenced and freed. - @retval FALSE - The OFile is kept. - -**/ -BOOLEAN -FatCheckOFileRef ( - IN FAT_OFILE *OFile - ) -{ - // - // If the OFile is on the check ref list, remove it - // - if (OFile->CheckLink.ForwardLink != NULL) { - RemoveEntryList (&OFile->CheckLink); - OFile->CheckLink.ForwardLink = NULL; - } - - FatOFileFlush (OFile); - // - // Are there any references to this OFile? - // - if (!IsListEmpty (&OFile->Opens) || !IsListEmpty (&OFile->ChildHead)) { - // - // The OFile cannot be freed - // - return FALSE; - } - // - // Free the Ofile - // - FatCloseDirEnt (OFile->DirEnt); - return TRUE; -} - -/** - - Check the references of all open files on the volume. - Any open file (that is checked) that is no longer - referenced, is freed - and it's parent open file - is then referenced checked. - - @param Volume - The volume to check the pending open file list. - -**/ -STATIC -VOID -FatCheckVolumeRef ( - IN FAT_VOLUME *Volume - ) -{ - FAT_OFILE *OFile; - FAT_OFILE *Parent; - - // - // Check all files on the pending check list - // - while (!IsListEmpty (&Volume->CheckRef)) { - // - // Start with the first file listed - // - Parent = OFILE_FROM_CHECKLINK (Volume->CheckRef.ForwardLink); - // - // Go up the tree cleaning up any un-referenced OFiles - // - while (Parent != NULL) { - OFile = Parent; - Parent = OFile->Parent; - if (!FatCheckOFileRef (OFile)) { - break; - } - } - } -} - -/** - - Set error status for a specific OFile, reference checking the volume. - If volume is already marked as invalid, and all resources are freed - after reference checking, the file system protocol is uninstalled and - the volume structure is freed. - - @param Volume - the Volume that is to be reference checked and unlocked. - @param OFile - the OFile whose permanent error code is to be set. - @param EfiStatus - error code to be set. - @param Task point to task instance. - - @retval EFI_SUCCESS - Clean up the volume successfully. - @return Others - Cleaning up of the volume is failed. - -**/ -EFI_STATUS -FatCleanupVolume ( - IN FAT_VOLUME *Volume, - IN FAT_OFILE *OFile, - IN EFI_STATUS EfiStatus, - IN FAT_TASK *Task - ) -{ - EFI_STATUS Status; - // - // Flag the OFile - // - if (OFile != NULL) { - FatSetVolumeError (OFile, EfiStatus); - } - // - // Clean up any dangling OFiles that don't have IFiles - // we don't check return status here because we want the - // volume be cleaned up even the volume is invalid. - // - FatCheckVolumeRef (Volume); - if (Volume->Valid) { - // - // Update the free hint info. Volume->FreeInfoPos != 0 - // indicates this a FAT32 volume - // - if (Volume->FreeInfoValid && Volume->FatDirty && Volume->FreeInfoPos) { - Status = FatDiskIo (Volume, WriteDisk, Volume->FreeInfoPos, sizeof (FAT_INFO_SECTOR), &Volume->FatInfoSector, Task); - if (EFI_ERROR (Status)) { - return Status; - } - } - // - // Update that the volume is not dirty - // - if (Volume->FatDirty && Volume->FatType != Fat12) { - Volume->FatDirty = FALSE; - Status = FatAccessVolumeDirty (Volume, WriteFat, &Volume->NotDirtyValue); - if (EFI_ERROR (Status)) { - return Status; - } - } - // - // Flush all dirty cache entries to disk - // - Status = FatVolumeFlushCache (Volume, Task); - if (EFI_ERROR (Status)) { - return Status; - } - } - // - // If the volume is cleared , remove it. - // The only time volume be invalidated is in DriverBindingStop. - // - if (Volume->Root == NULL && !Volume->Valid) { - // - // Free the volume structure - // - FatFreeVolume (Volume); - } - - return EfiStatus; -} - -/** - - Set the OFile and its child OFile with the error Status - - @param OFile - The OFile whose permanent error code is to be set. - @param Status - Error code to be set. - -**/ -VOID -FatSetVolumeError ( - IN FAT_OFILE *OFile, - IN EFI_STATUS Status - ) -{ - LIST_ENTRY *Link; - FAT_OFILE *ChildOFile; - - // - // If this OFile doesn't already have an error, set one - // - if (!EFI_ERROR (OFile->Error)) { - OFile->Error = Status; - } - // - // Set the error on each child OFile - // - for (Link = OFile->ChildHead.ForwardLink; Link != &OFile->ChildHead; Link = Link->ForwardLink) { - ChildOFile = OFILE_FROM_CHILDLINK (Link); - FatSetVolumeError (ChildOFile, Status); - } -} diff --git a/FatPkg/EnhancedFatDxe/Hash.c b/FatPkg/EnhancedFatDxe/Hash.c deleted file mode 100644 index 5a9bbda754..0000000000 --- a/FatPkg/EnhancedFatDxe/Hash.c +++ /dev/null @@ -1,172 +0,0 @@ -/** @file - Hash table operations. - -Copyright (c) 2005 - 2015, Intel Corporation. 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 "Fat.h" - -/** - - Get hash value for long name. - - @param LongNameString - The long name string to be hashed. - - @return HashValue. - -**/ -STATIC -UINT32 -FatHashLongName ( - IN CHAR16 *LongNameString - ) -{ - UINT32 HashValue; - CHAR16 UpCasedLongFileName[EFI_PATH_STRING_LENGTH]; - StrnCpyS ( - UpCasedLongFileName, - ARRAY_SIZE (UpCasedLongFileName), - LongNameString, - ARRAY_SIZE (UpCasedLongFileName) - 1 - ); - FatStrUpr (UpCasedLongFileName); - gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue); - return (HashValue & HASH_TABLE_MASK); -} - -/** - - Get hash value for short name. - - @param ShortNameString - The short name string to be hashed. - - @return HashValue - -**/ -STATIC -UINT32 -FatHashShortName ( - IN CHAR8 *ShortNameString - ) -{ - UINT32 HashValue; - gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue); - return (HashValue & HASH_TABLE_MASK); -} - -/** - - Search the long name hash table for the directory entry. - - @param ODir - The directory to be searched. - @param LongNameString - The long name string to search. - - @return The previous long name hash node of the directory entry. - -**/ -FAT_DIRENT ** -FatLongNameHashSearch ( - IN FAT_ODIR *ODir, - IN CHAR16 *LongNameString - ) -{ - FAT_DIRENT **PreviousHashNode; - for (PreviousHashNode = &ODir->LongNameHashTable[FatHashLongName (LongNameString)]; - *PreviousHashNode != NULL; - PreviousHashNode = &(*PreviousHashNode)->LongNameForwardLink - ) { - if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) { - break; - } - } - - return PreviousHashNode; -} - -/** - - Search the short name hash table for the directory entry. - - @param ODir - The directory to be searched. - @param ShortNameString - The short name string to search. - - @return The previous short name hash node of the directory entry. - -**/ -FAT_DIRENT ** -FatShortNameHashSearch ( - IN FAT_ODIR *ODir, - IN CHAR8 *ShortNameString - ) -{ - FAT_DIRENT **PreviousHashNode; - for (PreviousHashNode = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)]; - *PreviousHashNode != NULL; - PreviousHashNode = &(*PreviousHashNode)->ShortNameForwardLink - ) { - if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) { - break; - } - } - - return PreviousHashNode; -} - -/** - - Insert directory entry to hash table. - - @param ODir - The parent directory. - @param DirEnt - The directory entry node. - -**/ -VOID -FatInsertToHashTable ( - IN FAT_ODIR *ODir, - IN FAT_DIRENT *DirEnt - ) -{ - FAT_DIRENT **HashTable; - UINT32 HashTableIndex; - - // - // Insert hash table index for short name - // - HashTableIndex = FatHashShortName (DirEnt->Entry.FileName); - HashTable = ODir->ShortNameHashTable; - DirEnt->ShortNameForwardLink = HashTable[HashTableIndex]; - HashTable[HashTableIndex] = DirEnt; - // - // Insert hash table index for long name - // - HashTableIndex = FatHashLongName (DirEnt->FileString); - HashTable = ODir->LongNameHashTable; - DirEnt->LongNameForwardLink = HashTable[HashTableIndex]; - HashTable[HashTableIndex] = DirEnt; -} - -/** - - Delete directory entry from hash table. - - @param ODir - The parent directory. - @param DirEnt - The directory entry node. - -**/ -VOID -FatDeleteFromHashTable ( - IN FAT_ODIR *ODir, - IN FAT_DIRENT *DirEnt - ) -{ - *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink; - *FatLongNameHashSearch (ODir, DirEnt->FileString) = DirEnt->LongNameForwardLink; -} diff --git a/FatPkg/EnhancedFatDxe/Info.c b/FatPkg/EnhancedFatDxe/Info.c deleted file mode 100644 index 50b840b961..0000000000 --- a/FatPkg/EnhancedFatDxe/Info.c +++ /dev/null @@ -1,601 +0,0 @@ -/** @file - Routines dealing with setting/getting file/volume info - -Copyright (c) 2005 - 2015, Intel Corporation. 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 "Fat.h" - -/** - - Get the volume's info into Buffer. - - @param Volume - FAT file system volume. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing volume info. - - @retval EFI_SUCCESS - Get the volume info successfully. - @retval EFI_BUFFER_TOO_SMALL - The buffer is too small. - -**/ -EFI_STATUS -FatGetVolumeInfo ( - IN FAT_VOLUME *Volume, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -/** - - Set the volume's info. - - @param Volume - FAT file system volume. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing the new volume info. - - @retval EFI_SUCCESS - Set the volume info successfully. - @retval EFI_BAD_BUFFER_SIZE - The buffer size is error. - @retval EFI_WRITE_PROTECTED - The volume is read only. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -FatSetVolumeInfo ( - IN FAT_VOLUME *Volume, - IN UINTN BufferSize, - IN VOID *Buffer - ); - -/** - - Set or Get the some types info of the file into Buffer. - - @param IsSet - TRUE:The access is set, else is get - @param FHand - The handle of file - @param Type - The type of the info - @param BufferSize - Size of Buffer - @param Buffer - Buffer containing volume info - - @retval EFI_SUCCESS - Get the info successfully - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file - -**/ -EFI_STATUS -FatSetOrGetInfo ( - IN BOOLEAN IsSet, - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_GUID *Type, - IN OUT UINTN *BufferSize, - IN OUT VOID *Buffer - ); - -/** - - Get the open file's info into Buffer. - - @param OFile - The open file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing file info. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_BUFFER_TOO_SMALL - The buffer is too small. - -**/ -EFI_STATUS -FatGetFileInfo ( - IN FAT_OFILE *OFile, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - return FatGetDirEntInfo (OFile->Volume, OFile->DirEnt, BufferSize, Buffer); -} - -/** - - Get the volume's info into Buffer. - - @param Volume - FAT file system volume. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing volume info. - - @retval EFI_SUCCESS - Get the volume info successfully. - @retval EFI_BUFFER_TOO_SMALL - The buffer is too small. - -**/ -EFI_STATUS -FatGetVolumeInfo ( - IN FAT_VOLUME *Volume, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - UINTN Size; - UINTN NameSize; - UINTN ResultSize; - CHAR16 Name[FAT_NAME_LEN + 1]; - EFI_STATUS Status; - EFI_FILE_SYSTEM_INFO *Info; - UINT8 ClusterAlignment; - - Size = SIZE_OF_EFI_FILE_SYSTEM_INFO; - Status = FatGetVolumeEntry (Volume, Name); - NameSize = StrSize (Name); - ResultSize = Size + NameSize; - ClusterAlignment = Volume->ClusterAlignment; - - // - // If we don't have valid info, compute it now - // - FatComputeFreeInfo (Volume); - - Status = EFI_BUFFER_TOO_SMALL; - if (*BufferSize >= ResultSize) { - Status = EFI_SUCCESS; - - Info = Buffer; - ZeroMem (Info, SIZE_OF_EFI_FILE_SYSTEM_INFO); - - Info->Size = ResultSize; - Info->ReadOnly = Volume->ReadOnly; - Info->BlockSize = (UINT32) Volume->ClusterSize; - Info->VolumeSize = LShiftU64 (Volume->MaxCluster, ClusterAlignment); - Info->FreeSpace = LShiftU64 ( - Volume->FatInfoSector.FreeInfo.ClusterCount, - ClusterAlignment - ); - CopyMem ((CHAR8 *) Buffer + Size, Name, NameSize); - } - - *BufferSize = ResultSize; - return Status; -} - -/** - - Get the volume's label info into Buffer. - - @param Volume - FAT file system volume. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing volume's label info. - - @retval EFI_SUCCESS - Get the volume's label info successfully. - @retval EFI_BUFFER_TOO_SMALL - The buffer is too small. - -**/ -EFI_STATUS -FatGetVolumeLabelInfo ( - IN FAT_VOLUME *Volume, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - UINTN Size; - UINTN NameSize; - UINTN ResultSize; - CHAR16 Name[FAT_NAME_LEN + 1]; - EFI_STATUS Status; - - Size = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL; - Status = FatGetVolumeEntry (Volume, Name); - NameSize = StrSize (Name); - ResultSize = Size + NameSize; - - Status = EFI_BUFFER_TOO_SMALL; - if (*BufferSize >= ResultSize) { - Status = EFI_SUCCESS; - CopyMem ((CHAR8 *) Buffer + Size, Name, NameSize); - } - - *BufferSize = ResultSize; - return Status; -} - -/** - - Set the volume's info. - - @param Volume - FAT file system volume. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing the new volume info. - - @retval EFI_SUCCESS - Set the volume info successfully. - @retval EFI_BAD_BUFFER_SIZE - The buffer size is error. - @retval EFI_WRITE_PROTECTED - The volume is read only. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -FatSetVolumeInfo ( - IN FAT_VOLUME *Volume, - IN UINTN BufferSize, - IN VOID *Buffer - ) -{ - EFI_FILE_SYSTEM_INFO *Info; - - Info = (EFI_FILE_SYSTEM_INFO *) Buffer; - - if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + 2 || Info->Size > BufferSize) { - return EFI_BAD_BUFFER_SIZE; - } - - return FatSetVolumeEntry (Volume, Info->VolumeLabel); -} - -/** - - Set the volume's label info. - - @param Volume - FAT file system volume. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing the new volume label info. - - @retval EFI_SUCCESS - Set the volume label info successfully. - @retval EFI_WRITE_PROTECTED - The disk is write protected. - @retval EFI_BAD_BUFFER_SIZE - The buffer size is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -FatSetVolumeLabelInfo ( - IN FAT_VOLUME *Volume, - IN UINTN BufferSize, - IN VOID *Buffer - ) -{ - EFI_FILE_SYSTEM_VOLUME_LABEL *Info; - - Info = (EFI_FILE_SYSTEM_VOLUME_LABEL *) Buffer; - - if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL + 2) { - return EFI_BAD_BUFFER_SIZE; - } - - return FatSetVolumeEntry (Volume, Info->VolumeLabel); -} - -/** - - Set the file info. - - @param Volume - FAT file system volume. - @param IFile - The instance of the open file. - @param OFile - The open file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing the new file info. - - @retval EFI_SUCCESS - Set the file info successfully. - @retval EFI_ACCESS_DENIED - It is the root directory - or the directory attribute bit can not change - or try to change a directory size - or something else. - @retval EFI_UNSUPPORTED - The new file size is larger than 4GB. - @retval EFI_WRITE_PROTECTED - The disk is write protected. - @retval EFI_BAD_BUFFER_SIZE - The buffer size is error. - @retval EFI_INVALID_PARAMETER - The time info or attributes info is error. - @retval EFI_OUT_OF_RESOURCES - Can not allocate new memory. - @retval EFI_VOLUME_CORRUPTED - The volume is corrupted. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -FatSetFileInfo ( - IN FAT_VOLUME *Volume, - IN FAT_IFILE *IFile, - IN FAT_OFILE *OFile, - IN UINTN BufferSize, - IN VOID *Buffer - ) -{ - EFI_STATUS Status; - EFI_FILE_INFO *NewInfo; - FAT_OFILE *DotOFile; - FAT_OFILE *Parent; - CHAR16 NewFileName[EFI_PATH_STRING_LENGTH]; - EFI_TIME ZeroTime; - FAT_DIRENT *DirEnt; - FAT_DIRENT *TempDirEnt; - UINT8 NewAttribute; - BOOLEAN ReadOnly; - - ZeroMem (&ZeroTime, sizeof (EFI_TIME)); - Parent = OFile->Parent; - DirEnt = OFile->DirEnt; - // - // If this is the root directory, we can't make any updates - // - if (Parent == NULL) { - return EFI_ACCESS_DENIED; - } - // - // Make sure there's a valid input buffer - // - NewInfo = Buffer; - if (BufferSize < SIZE_OF_EFI_FILE_INFO + 2 || NewInfo->Size > BufferSize) { - return EFI_BAD_BUFFER_SIZE; - } - - ReadOnly = (BOOLEAN)(IFile->ReadOnly || (DirEnt->Entry.Attributes & EFI_FILE_READ_ONLY)); - // - // if a zero time is specified, then the original time is preserved - // - if (CompareMem (&ZeroTime, &NewInfo->CreateTime, sizeof (EFI_TIME)) != 0) { - if (!FatIsValidTime (&NewInfo->CreateTime)) { - return EFI_INVALID_PARAMETER; - } - - if (!ReadOnly) { - FatEfiTimeToFatTime (&NewInfo->CreateTime, &DirEnt->Entry.FileCreateTime); - } - } - - if (CompareMem (&ZeroTime, &NewInfo->ModificationTime, sizeof (EFI_TIME)) != 0) { - if (!FatIsValidTime (&NewInfo->ModificationTime)) { - return EFI_INVALID_PARAMETER; - } - - if (!ReadOnly) { - FatEfiTimeToFatTime (&NewInfo->ModificationTime, &DirEnt->Entry.FileModificationTime); - } - - OFile->PreserveLastModification = TRUE; - } - - if (NewInfo->Attribute & (~EFI_FILE_VALID_ATTR)) { - return EFI_INVALID_PARAMETER; - } - - NewAttribute = (UINT8) NewInfo->Attribute; - // - // Can not change the directory attribute bit - // - if ((NewAttribute ^ DirEnt->Entry.Attributes) & EFI_FILE_DIRECTORY) { - return EFI_ACCESS_DENIED; - } - // - // Set the current attributes even if the IFile->ReadOnly is TRUE - // - DirEnt->Entry.Attributes = (UINT8) ((DirEnt->Entry.Attributes &~EFI_FILE_VALID_ATTR) | NewAttribute); - // - // Open the filename and see if it refers to an existing file - // - Status = FatLocateOFile (&Parent, NewInfo->FileName, DirEnt->Entry.Attributes, NewFileName); - if (EFI_ERROR (Status)) { - return Status; - } - - if (*NewFileName != 0) { - // - // File was not found. We do not allow rename of the current directory if - // there are open files below the current directory - // - if (!IsListEmpty (&OFile->ChildHead) || Parent == OFile) { - return EFI_ACCESS_DENIED; - } - - if (ReadOnly) { - return EFI_ACCESS_DENIED; - } - - Status = FatRemoveDirEnt (OFile->Parent, DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - // - // Create new dirent - // - Status = FatCreateDirEnt (Parent, NewFileName, DirEnt->Entry.Attributes, &TempDirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - FatCloneDirEnt (TempDirEnt, DirEnt); - FatFreeDirEnt (DirEnt); - DirEnt = TempDirEnt; - DirEnt->OFile = OFile; - OFile->DirEnt = DirEnt; - OFile->Parent = Parent; - RemoveEntryList (&OFile->ChildLink); - InsertHeadList (&Parent->ChildHead, &OFile->ChildLink); - // - // If this is a directory, synchronize its dot directory entry - // - if (OFile->ODir != NULL) { - // - // Syncronize its dot entry - // - FatResetODirCursor (OFile); - ASSERT (OFile->Parent != NULL); - for (DotOFile = OFile; DotOFile != OFile->Parent->Parent; DotOFile = DotOFile->Parent) { - Status = FatGetNextDirEnt (OFile, &DirEnt); - if (EFI_ERROR (Status) || DirEnt == NULL || !FatIsDotDirEnt (DirEnt)) { - return EFI_VOLUME_CORRUPTED; - } - - FatCloneDirEnt (DirEnt, DotOFile->DirEnt); - Status = FatStoreDirEnt (OFile, DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - // - // If the file is renamed, we should append the ARCHIVE attribute - // - OFile->Archive = TRUE; - } else if (Parent != OFile) { - // - // filename is to a different filename that already exists - // - return EFI_ACCESS_DENIED; - } - // - // If the file size has changed, apply it - // - if (NewInfo->FileSize != OFile->FileSize) { - if (OFile->ODir != NULL || ReadOnly) { - // - // If this is a directory or the file is read only, we can't change the file size - // - return EFI_ACCESS_DENIED; - } - - if (NewInfo->FileSize > OFile->FileSize) { - Status = FatExpandOFile (OFile, NewInfo->FileSize); - } else { - Status = FatTruncateOFile (OFile, (UINTN) NewInfo->FileSize); - } - - if (EFI_ERROR (Status)) { - return Status; - } - - FatUpdateDirEntClusterSizeInfo (OFile); - } - - OFile->Dirty = TRUE; - return FatOFileFlush (OFile); -} - -/** - - Set or Get the some types info of the file into Buffer. - - @param IsSet - TRUE:The access is set, else is get - @param FHand - The handle of file - @param Type - The type of the info - @param BufferSize - Size of Buffer - @param Buffer - Buffer containing volume info - - @retval EFI_SUCCESS - Get the info successfully - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file - -**/ -EFI_STATUS -FatSetOrGetInfo ( - IN BOOLEAN IsSet, - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_GUID *Type, - IN OUT UINTN *BufferSize, - IN OUT VOID *Buffer - ) -{ - FAT_IFILE *IFile; - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - EFI_STATUS Status; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - Volume = OFile->Volume; - - Status = OFile->Error; - if (Status == EFI_NOT_FOUND) { - return EFI_DEVICE_ERROR; - } - - FatWaitNonblockingTask (IFile); - - FatAcquireLock (); - - // - // Verify the file handle isn't in an error state - // - if (!EFI_ERROR (Status)) { - // - // Get the proper information based on the request - // - Status = EFI_UNSUPPORTED; - if (IsSet) { - if (CompareGuid (Type, &gEfiFileInfoGuid)) { - Status = Volume->ReadOnly ? EFI_WRITE_PROTECTED : FatSetFileInfo (Volume, IFile, OFile, *BufferSize, Buffer); - } - - if (CompareGuid (Type, &gEfiFileSystemInfoGuid)) { - Status = Volume->ReadOnly ? EFI_WRITE_PROTECTED : FatSetVolumeInfo (Volume, *BufferSize, Buffer); - } - - if (CompareGuid (Type, &gEfiFileSystemVolumeLabelInfoIdGuid)) { - Status = Volume->ReadOnly ? EFI_WRITE_PROTECTED : FatSetVolumeLabelInfo (Volume, *BufferSize, Buffer); - } - } else { - if (CompareGuid (Type, &gEfiFileInfoGuid)) { - Status = FatGetFileInfo (OFile, BufferSize, Buffer); - } - - if (CompareGuid (Type, &gEfiFileSystemInfoGuid)) { - Status = FatGetVolumeInfo (Volume, BufferSize, Buffer); - } - - if (CompareGuid (Type, &gEfiFileSystemVolumeLabelInfoIdGuid)) { - Status = FatGetVolumeLabelInfo (Volume, BufferSize, Buffer); - } - } - } - - Status = FatCleanupVolume (Volume, NULL, Status, NULL); - - FatReleaseLock (); - return Status; -} - -/** - - Get the some types info of the file into Buffer. - - @param FHand - The handle of file. - @param Type - The type of the info. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing volume info. - - @retval EFI_SUCCESS - Get the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - -**/ -EFI_STATUS -EFIAPI -FatGetInfo ( - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_GUID *Type, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - return FatSetOrGetInfo (FALSE, FHand, Type, BufferSize, Buffer); -} - -/** - - Set the some types info of the file into Buffer. - - @param FHand - The handle of file. - @param Type - The type of the info. - @param BufferSize - Size of Buffer - @param Buffer - Buffer containing volume info. - - @retval EFI_SUCCESS - Set the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - -**/ -EFI_STATUS -EFIAPI -FatSetInfo ( - IN EFI_FILE_PROTOCOL *FHand, - IN EFI_GUID *Type, - IN UINTN BufferSize, - IN VOID *Buffer - ) -{ - return FatSetOrGetInfo (TRUE, FHand, Type, &BufferSize, Buffer); -} diff --git a/FatPkg/EnhancedFatDxe/Init.c b/FatPkg/EnhancedFatDxe/Init.c deleted file mode 100644 index 6febffcddd..0000000000 --- a/FatPkg/EnhancedFatDxe/Init.c +++ /dev/null @@ -1,393 +0,0 @@ -/** @file - Initialization routines. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - -/** - - Allocates volume structure, detects FAT file system, installs protocol, - and initialize cache. - - @param Handle - The handle of parent device. - @param DiskIo - The DiskIo of parent device. - @param DiskIo2 - The DiskIo2 of parent device. - @param BlockIo - The BlockIo of parent devicel - - @retval EFI_SUCCESS - Allocate a new volume successfully. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - @return Others - Allocating a new volume failed. - -**/ -EFI_STATUS -FatAllocateVolume ( - IN EFI_HANDLE Handle, - IN EFI_DISK_IO_PROTOCOL *DiskIo, - IN EFI_DISK_IO2_PROTOCOL *DiskIo2, - IN EFI_BLOCK_IO_PROTOCOL *BlockIo - ) -{ - EFI_STATUS Status; - FAT_VOLUME *Volume; - - // - // Allocate a volume structure - // - Volume = AllocateZeroPool (sizeof (FAT_VOLUME)); - if (Volume == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // - // Initialize the structure - // - Volume->Signature = FAT_VOLUME_SIGNATURE; - Volume->Handle = Handle; - Volume->DiskIo = DiskIo; - Volume->DiskIo2 = DiskIo2; - Volume->BlockIo = BlockIo; - Volume->MediaId = BlockIo->Media->MediaId; - Volume->ReadOnly = BlockIo->Media->ReadOnly; - Volume->VolumeInterface.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION; - Volume->VolumeInterface.OpenVolume = FatOpenVolume; - InitializeListHead (&Volume->CheckRef); - InitializeListHead (&Volume->DirCacheList); - // - // Initialize Root Directory entry - // - Volume->RootDirEnt.FileString = Volume->RootFileString; - Volume->RootDirEnt.Entry.Attributes = FAT_ATTRIBUTE_DIRECTORY; - // - // Check to see if there's a file system on the volume - // - Status = FatOpenDevice (Volume); - if (EFI_ERROR (Status)) { - goto Done; - } - // - // Initialize cache - // - Status = FatInitializeDiskCache (Volume); - if (EFI_ERROR (Status)) { - goto Done; - } - // - // Install our protocol interfaces on the device's handle - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &Volume->Handle, - &gEfiSimpleFileSystemProtocolGuid, - &Volume->VolumeInterface, - NULL - ); - if (EFI_ERROR (Status)) { - goto Done; - } - // - // Volume installed - // - DEBUG ((EFI_D_INIT, "Installed Fat filesystem on %p\n", Handle)); - Volume->Valid = TRUE; - -Done: - if (EFI_ERROR (Status)) { - FatFreeVolume (Volume); - } - - return Status; -} - -/** - - Called by FatDriverBindingStop(), Abandon the volume. - - @param Volume - The volume to be abandoned. - - @retval EFI_SUCCESS - Abandoned the volume successfully. - @return Others - Can not uninstall the protocol interfaces. - -**/ -EFI_STATUS -FatAbandonVolume ( - IN FAT_VOLUME *Volume - ) -{ - EFI_STATUS Status; - BOOLEAN LockedByMe; - - // - // Uninstall the protocol interface. - // - if (Volume->Handle != NULL) { - Status = gBS->UninstallMultipleProtocolInterfaces ( - Volume->Handle, - &gEfiSimpleFileSystemProtocolGuid, - &Volume->VolumeInterface, - NULL - ); - if (EFI_ERROR (Status)) { - return Status; - } - } - - LockedByMe = FALSE; - - // - // Acquire the lock. - // If the caller has already acquired the lock (which - // means we are in the process of some Fat operation), - // we can not acquire again. - // - Status = FatAcquireLockOrFail (); - if (!EFI_ERROR (Status)) { - LockedByMe = TRUE; - } - // - // The volume is still being used. Hence, set error flag for all OFiles still in - // use. In two cases, we could get here. One is EFI_MEDIA_CHANGED, the other is - // EFI_NO_MEDIA. - // - if (Volume->Root != NULL) { - FatSetVolumeError ( - Volume->Root, - Volume->BlockIo->Media->MediaPresent ? EFI_MEDIA_CHANGED : EFI_NO_MEDIA - ); - } - - Volume->Valid = FALSE; - - // - // Release the lock. - // If locked by me, this means DriverBindingStop is NOT - // called within an on-going Fat operation, so we should - // take responsibility to cleanup and free the volume. - // Otherwise, the DriverBindingStop is called within an on-going - // Fat operation, we shouldn't check reference, so just let outer - // FatCleanupVolume do the task. - // - if (LockedByMe) { - FatCleanupVolume (Volume, NULL, EFI_SUCCESS, NULL); - FatReleaseLock (); - } - - return EFI_SUCCESS; -} - -/** - - Detects FAT file system on Disk and set relevant fields of Volume. - - @param Volume - The volume structure. - - @retval EFI_SUCCESS - The Fat File System is detected successfully - @retval EFI_UNSUPPORTED - The volume is not FAT file system. - @retval EFI_VOLUME_CORRUPTED - The volume is corrupted. - -**/ -EFI_STATUS -FatOpenDevice ( - IN OUT FAT_VOLUME *Volume - ) -{ - EFI_STATUS Status; - UINT32 BlockSize; - UINT32 DirtyMask; - EFI_DISK_IO_PROTOCOL *DiskIo; - FAT_BOOT_SECTOR FatBs; - FAT_VOLUME_TYPE FatType; - UINTN RootDirSectors; - UINTN FatLba; - UINTN RootLba; - UINTN FirstClusterLba; - UINTN Sectors; - UINTN SectorsPerFat; - UINT8 SectorsPerClusterAlignment; - UINT8 BlockAlignment; - - // - // Read the FAT_BOOT_SECTOR BPB info - // This is the only part of FAT code that uses parent DiskIo, - // Others use FatDiskIo which utilizes a Cache. - // - DiskIo = Volume->DiskIo; - Status = DiskIo->ReadDisk (DiskIo, Volume->MediaId, 0, sizeof (FatBs), &FatBs); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_INIT, "FatOpenDevice: read of part_lba failed %r\n", Status)); - return Status; - } - - FatType = FatUndefined; - - // - // Use LargeSectors if Sectors is 0 - // - Sectors = FatBs.FatBsb.Sectors; - if (Sectors == 0) { - Sectors = FatBs.FatBsb.LargeSectors; - } - - SectorsPerFat = FatBs.FatBsb.SectorsPerFat; - if (SectorsPerFat == 0) { - SectorsPerFat = FatBs.FatBse.Fat32Bse.LargeSectorsPerFat; - FatType = Fat32; - } - // - // Is boot sector a fat sector? - // (Note that so far we only know if the sector is FAT32 or not, we don't - // know if the sector is Fat16 or Fat12 until later when we can compute - // the volume size) - // - if (FatBs.FatBsb.ReservedSectors == 0 || FatBs.FatBsb.NumFats == 0 || Sectors == 0) { - return EFI_UNSUPPORTED; - } - - if ((FatBs.FatBsb.SectorSize & (FatBs.FatBsb.SectorSize - 1)) != 0) { - return EFI_UNSUPPORTED; - } - - BlockAlignment = (UINT8) HighBitSet32 (FatBs.FatBsb.SectorSize); - if (BlockAlignment > MAX_BLOCK_ALIGNMENT || BlockAlignment < MIN_BLOCK_ALIGNMENT) { - return EFI_UNSUPPORTED; - } - - if ((FatBs.FatBsb.SectorsPerCluster & (FatBs.FatBsb.SectorsPerCluster - 1)) != 0) { - return EFI_UNSUPPORTED; - } - - SectorsPerClusterAlignment = (UINT8) HighBitSet32 (FatBs.FatBsb.SectorsPerCluster); - if (SectorsPerClusterAlignment > MAX_SECTORS_PER_CLUSTER_ALIGNMENT) { - return EFI_UNSUPPORTED; - } - - if (FatBs.FatBsb.Media <= 0xf7 && - FatBs.FatBsb.Media != 0xf0 && - FatBs.FatBsb.Media != 0x00 && - FatBs.FatBsb.Media != 0x01 - ) { - return EFI_UNSUPPORTED; - } - // - // Initialize fields the volume information for this FatType - // - if (FatType != Fat32) { - if (FatBs.FatBsb.RootEntries == 0) { - return EFI_UNSUPPORTED; - } - // - // Unpack fat12, fat16 info - // - Volume->RootEntries = FatBs.FatBsb.RootEntries; - } else { - // - // If this is fat32, refuse to mount mirror-disabled volumes - // - if ((SectorsPerFat == 0 || FatBs.FatBse.Fat32Bse.FsVersion != 0) || (FatBs.FatBse.Fat32Bse.ExtendedFlags & 0x80)) { - return EFI_UNSUPPORTED; - } - // - // Unpack fat32 info - // - Volume->RootCluster = FatBs.FatBse.Fat32Bse.RootDirFirstCluster; - } - - Volume->NumFats = FatBs.FatBsb.NumFats; - // - // Compute some fat locations - // - BlockSize = FatBs.FatBsb.SectorSize; - RootDirSectors = ((Volume->RootEntries * sizeof (FAT_DIRECTORY_ENTRY)) + (BlockSize - 1)) / BlockSize; - - FatLba = FatBs.FatBsb.ReservedSectors; - RootLba = FatBs.FatBsb.NumFats * SectorsPerFat + FatLba; - FirstClusterLba = RootLba + RootDirSectors; - - Volume->FatPos = FatLba * BlockSize; - Volume->FatSize = SectorsPerFat * BlockSize; - - Volume->VolumeSize = LShiftU64 (Sectors, BlockAlignment); - Volume->RootPos = LShiftU64 (RootLba, BlockAlignment); - Volume->FirstClusterPos = LShiftU64 (FirstClusterLba, BlockAlignment); - Volume->MaxCluster = (Sectors - FirstClusterLba) >> SectorsPerClusterAlignment; - Volume->ClusterAlignment = (UINT8)(BlockAlignment + SectorsPerClusterAlignment); - Volume->ClusterSize = (UINTN)1 << (Volume->ClusterAlignment); - - // - // If this is not a fat32, determine if it's a fat16 or fat12 - // - if (FatType != Fat32) { - if (Volume->MaxCluster >= FAT_MAX_FAT16_CLUSTER) { - return EFI_VOLUME_CORRUPTED; - } - - FatType = Volume->MaxCluster < FAT_MAX_FAT12_CLUSTER ? Fat12 : Fat16; - // - // fat12 & fat16 fat-entries are 2 bytes - // - Volume->FatEntrySize = sizeof (UINT16); - DirtyMask = FAT16_DIRTY_MASK; - } else { - if (Volume->MaxCluster < FAT_MAX_FAT16_CLUSTER) { - return EFI_VOLUME_CORRUPTED; - } - // - // fat32 fat-entries are 4 bytes - // - Volume->FatEntrySize = sizeof (UINT32); - DirtyMask = FAT32_DIRTY_MASK; - } - // - // Get the DirtyValue and NotDirtyValue - // We should keep the initial value as the NotDirtyValue - // in case the volume is dirty already - // - if (FatType != Fat12) { - Status = FatAccessVolumeDirty (Volume, ReadDisk, &Volume->NotDirtyValue); - if (EFI_ERROR (Status)) { - return Status; - } - - Volume->DirtyValue = Volume->NotDirtyValue & DirtyMask; - } - // - // If present, read the fat hint info - // - if (FatType == Fat32) { - Volume->FreeInfoPos = FatBs.FatBse.Fat32Bse.FsInfoSector * BlockSize; - if (FatBs.FatBse.Fat32Bse.FsInfoSector != 0) { - FatDiskIo (Volume, ReadDisk, Volume->FreeInfoPos, sizeof (FAT_INFO_SECTOR), &Volume->FatInfoSector, NULL); - if (Volume->FatInfoSector.Signature == FAT_INFO_SIGNATURE && - Volume->FatInfoSector.InfoBeginSignature == FAT_INFO_BEGIN_SIGNATURE && - Volume->FatInfoSector.InfoEndSignature == FAT_INFO_END_SIGNATURE && - Volume->FatInfoSector.FreeInfo.ClusterCount <= Volume->MaxCluster - ) { - Volume->FreeInfoValid = TRUE; - } - } - } - // - // Just make up a FreeInfo.NextCluster for use by allocate cluster - // - if (FAT_MIN_CLUSTER > Volume->FatInfoSector.FreeInfo.NextCluster || - Volume->FatInfoSector.FreeInfo.NextCluster > Volume->MaxCluster + 1 - ) { - Volume->FatInfoSector.FreeInfo.NextCluster = FAT_MIN_CLUSTER; - } - // - // We are now defining FAT Type - // - Volume->FatType = FatType; - ASSERT (FatType != FatUndefined); - - return EFI_SUCCESS; -} diff --git a/FatPkg/EnhancedFatDxe/Misc.c b/FatPkg/EnhancedFatDxe/Misc.c deleted file mode 100644 index c035670bf7..0000000000 --- a/FatPkg/EnhancedFatDxe/Misc.c +++ /dev/null @@ -1,609 +0,0 @@ -/** @file - Miscellaneous functions. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" -UINT8 mMonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -/** - - Create the task - - @param IFile - The instance of the open file. - @param Token - A pointer to the token associated with the transaction. - - @return FAT_TASK * - Return the task instance. - -**/ -FAT_TASK * -FatCreateTask ( - FAT_IFILE *IFile, - EFI_FILE_IO_TOKEN *Token - ) -{ - FAT_TASK *Task; - - Task = AllocateZeroPool (sizeof (*Task)); - if (Task != NULL) { - Task->Signature = FAT_TASK_SIGNATURE; - Task->IFile = IFile; - Task->FileIoToken = Token; - InitializeListHead (&Task->Subtasks); - InitializeListHead (&Task->Link); - } - return Task; -} - -/** - - Destroy the task. - - @param Task - The task to be destroyed. - -**/ -VOID -FatDestroyTask ( - FAT_TASK *Task - ) -{ - LIST_ENTRY *Link; - FAT_SUBTASK *Subtask; - - Link = GetFirstNode (&Task->Subtasks); - while (!IsNull (&Task->Subtasks, Link)) { - Subtask = CR (Link, FAT_SUBTASK, Link, FAT_SUBTASK_SIGNATURE); - Link = FatDestroySubtask (Subtask); - } - FreePool (Task); -} - -/** - - Wait all non-blocking requests complete. - - @param IFile - The instance of the open file. - -**/ -VOID -FatWaitNonblockingTask ( - FAT_IFILE *IFile - ) -{ - BOOLEAN TaskQueueEmpty; - - do { - EfiAcquireLock (&FatTaskLock); - TaskQueueEmpty = IsListEmpty (&IFile->Tasks); - EfiReleaseLock (&FatTaskLock); - } while (!TaskQueueEmpty); -} - -/** - - Remove the subtask from subtask list. - - @param Subtask - The subtask to be removed. - - @return LIST_ENTRY * - The next node in the list. - -**/ -LIST_ENTRY * -FatDestroySubtask ( - FAT_SUBTASK *Subtask - ) -{ - LIST_ENTRY *Link; - - gBS->CloseEvent (Subtask->DiskIo2Token.Event); - - Link = RemoveEntryList (&Subtask->Link); - FreePool (Subtask); - - return Link; -} - -/** - - Execute the task. - - @param IFile - The instance of the open file. - @param Task - The task to be executed. - - @retval EFI_SUCCESS - The task was executed sucessfully. - @return other - An error occurred when executing the task. - -**/ -EFI_STATUS -FatQueueTask ( - IN FAT_IFILE *IFile, - IN FAT_TASK *Task - ) -{ - EFI_STATUS Status; - LIST_ENTRY *Link; - FAT_SUBTASK *Subtask; - - // - // Sometimes the Task doesn't contain any subtasks, signal the event directly. - // - if (IsListEmpty (&Task->Subtasks)) { - Task->FileIoToken->Status = EFI_SUCCESS; - gBS->SignalEvent (Task->FileIoToken->Event); - FreePool (Task); - return EFI_SUCCESS; - } - - EfiAcquireLock (&FatTaskLock); - InsertTailList (&IFile->Tasks, &Task->Link); - EfiReleaseLock (&FatTaskLock); - - Status = EFI_SUCCESS; - for ( Link = GetFirstNode (&Task->Subtasks) - ; !IsNull (&Task->Subtasks, Link) - ; Link = GetNextNode (&Task->Subtasks, Link) - ) { - Subtask = CR (Link, FAT_SUBTASK, Link, FAT_SUBTASK_SIGNATURE); - if (Subtask->Write) { - - Status = IFile->OFile->Volume->DiskIo2->WriteDiskEx ( - IFile->OFile->Volume->DiskIo2, - IFile->OFile->Volume->MediaId, - Subtask->Offset, - &Subtask->DiskIo2Token, - Subtask->BufferSize, - Subtask->Buffer - ); - } else { - Status = IFile->OFile->Volume->DiskIo2->ReadDiskEx ( - IFile->OFile->Volume->DiskIo2, - IFile->OFile->Volume->MediaId, - Subtask->Offset, - &Subtask->DiskIo2Token, - Subtask->BufferSize, - Subtask->Buffer - ); - } - if (EFI_ERROR (Status)) { - break; - } - } - - if (EFI_ERROR (Status)) { - EfiAcquireLock (&FatTaskLock); - // - // Remove all the remaining subtasks when failure. - // We shouldn't remove all the tasks because the non-blocking requests have - // been submitted and cannot be canceled. - // - while (!IsNull (&Task->Subtasks, Link)) { - Subtask = CR (Link, FAT_SUBTASK, Link, FAT_SUBTASK_SIGNATURE); - Link = FatDestroySubtask (Subtask); - } - - if (IsListEmpty (&Task->Subtasks)) { - RemoveEntryList (&Task->Link); - FreePool (Task); - } else { - // - // If one or more subtasks have been already submitted, set FileIoToken - // to NULL so that the callback won't signal the event. - // - Task->FileIoToken = NULL; - } - - EfiReleaseLock (&FatTaskLock); - } - - return Status; -} - -/** - - Set the volume as dirty or not. - - @param Volume - FAT file system volume. - @param IoMode - The access mode. - @param DirtyValue - Set the volume as dirty or not. - - @retval EFI_SUCCESS - Set the new FAT entry value sucessfully. - @return other - An error occurred when operation the FAT entries. - -**/ -EFI_STATUS -FatAccessVolumeDirty ( - IN FAT_VOLUME *Volume, - IN IO_MODE IoMode, - IN VOID *DirtyValue - ) -{ - UINTN WriteCount; - - WriteCount = Volume->FatEntrySize; - return FatDiskIo (Volume, IoMode, Volume->FatPos + WriteCount, WriteCount, DirtyValue, NULL); -} - -/** - Invoke a notification event. - - @param Event Event whose notification function is being invoked. - @param Context The pointer to the notification function's context, - which is implementation-dependent. - -**/ -VOID -EFIAPI -FatOnAccessComplete ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - FAT_SUBTASK *Subtask; - FAT_TASK *Task; - - // - // Avoid someone in future breaks the below assumption. - // - ASSERT (EfiGetCurrentTpl () == FatTaskLock.Tpl); - - Subtask = (FAT_SUBTASK *) Context; - Task = Subtask->Task; - Status = Subtask->DiskIo2Token.TransactionStatus; - - ASSERT (Task->Signature == FAT_TASK_SIGNATURE); - ASSERT (Subtask->Signature == FAT_SUBTASK_SIGNATURE); - - // - // Remove the task unconditionally - // - FatDestroySubtask (Subtask); - - // - // Task->FileIoToken is NULL which means the task will be ignored (just recycle the subtask and task memory). - // - if (Task->FileIoToken != NULL) { - if (IsListEmpty (&Task->Subtasks) || EFI_ERROR (Status)) { - Task->FileIoToken->Status = Status; - gBS->SignalEvent (Task->FileIoToken->Event); - // - // Mark Task->FileIoToken to NULL so that the subtasks belonging to the task will be ignored. - // - Task->FileIoToken = NULL; - } - } - - if (IsListEmpty (&Task->Subtasks)) { - RemoveEntryList (&Task->Link); - FreePool (Task); - } -} - -/** - - General disk access function. - - @param Volume - FAT file system volume. - @param IoMode - The access mode (disk read/write or cache access). - @param Offset - The starting byte offset to read from. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing read data. - @param Task point to task instance. - - @retval EFI_SUCCESS - The operation is performed successfully. - @retval EFI_VOLUME_CORRUPTED - The accesss is - @return Others - The status of read/write the disk - -**/ -EFI_STATUS -FatDiskIo ( - IN FAT_VOLUME *Volume, - IN IO_MODE IoMode, - IN UINT64 Offset, - IN UINTN BufferSize, - IN OUT VOID *Buffer, - IN FAT_TASK *Task - ) -{ - EFI_STATUS Status; - EFI_DISK_IO_PROTOCOL *DiskIo; - EFI_DISK_READ IoFunction; - FAT_SUBTASK *Subtask; - - // - // Verify the IO is in devices range - // - Status = EFI_VOLUME_CORRUPTED; - if (Offset + BufferSize <= Volume->VolumeSize) { - if (CACHE_ENABLED (IoMode)) { - // - // Access cache - // - Status = FatAccessCache (Volume, CACHE_TYPE (IoMode), RAW_ACCESS (IoMode), Offset, BufferSize, Buffer, Task); - } else { - // - // Access disk directly - // - if (Task == NULL) { - // - // Blocking access - // - DiskIo = Volume->DiskIo; - IoFunction = (IoMode == ReadDisk) ? DiskIo->ReadDisk : DiskIo->WriteDisk; - Status = IoFunction (DiskIo, Volume->MediaId, Offset, BufferSize, Buffer); - } else { - // - // Non-blocking access - // - Subtask = AllocateZeroPool (sizeof (*Subtask)); - if (Subtask == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } else { - Subtask->Signature = FAT_SUBTASK_SIGNATURE; - Subtask->Task = Task; - Subtask->Write = (BOOLEAN) (IoMode == WriteDisk); - Subtask->Offset = Offset; - Subtask->Buffer = Buffer; - Subtask->BufferSize = BufferSize; - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - FatOnAccessComplete, - Subtask, - &Subtask->DiskIo2Token.Event - ); - if (!EFI_ERROR (Status)) { - InsertTailList (&Task->Subtasks, &Subtask->Link); - } else { - FreePool (Subtask); - } - } - } - } - } - - if (EFI_ERROR (Status)) { - Volume->DiskError = TRUE; - DEBUG ((EFI_D_ERROR, "FatDiskIo: error %r\n", Status)); - } - - return Status; -} - -/** - - Lock the volume. - -**/ -VOID -FatAcquireLock ( - VOID - ) -{ - EfiAcquireLock (&FatFsLock); -} - -/** - - Lock the volume. - If the lock is already in the acquired state, then EFI_ACCESS_DENIED is returned. - Otherwise, EFI_SUCCESS is returned. - - @retval EFI_SUCCESS - The volume is locked. - @retval EFI_ACCESS_DENIED - The volume could not be locked because it is already locked. - -**/ -EFI_STATUS -FatAcquireLockOrFail ( - VOID - ) -{ - return EfiAcquireLockOrFail (&FatFsLock); -} - -/** - - Unlock the volume. - -**/ -VOID -FatReleaseLock ( - VOID - ) -{ - EfiReleaseLock (&FatFsLock); -} - -/** - - Free directory entry. - - @param DirEnt - The directory entry to be freed. - -**/ -VOID -FatFreeDirEnt ( - IN FAT_DIRENT *DirEnt - ) -{ - if (DirEnt->FileString != NULL) { - FreePool (DirEnt->FileString); - } - - FreePool (DirEnt); -} - -/** - - Free volume structure (including the contents of directory cache and disk cache). - - @param Volume - The volume structure to be freed. - -**/ -VOID -FatFreeVolume ( - IN FAT_VOLUME *Volume - ) -{ - // - // Free disk cache - // - if (Volume->CacheBuffer != NULL) { - FreePool (Volume->CacheBuffer); - } - // - // Free directory cache - // - FatCleanupODirCache (Volume); - FreePool (Volume); -} - -/** - - Translate EFI time to FAT time. - - @param ETime - The time of EFI_TIME. - @param FTime - The time of FAT_DATE_TIME. - -**/ -VOID -FatEfiTimeToFatTime ( - IN EFI_TIME *ETime, - OUT FAT_DATE_TIME *FTime - ) -{ - // - // ignores timezone info in source ETime - // - if (ETime->Year > 1980) { - FTime->Date.Year = (UINT16) (ETime->Year - 1980); - } - - if (ETime->Year >= 1980 + FAT_MAX_YEAR_FROM_1980) { - FTime->Date.Year = FAT_MAX_YEAR_FROM_1980; - } - - FTime->Date.Month = ETime->Month; - FTime->Date.Day = ETime->Day; - FTime->Time.Hour = ETime->Hour; - FTime->Time.Minute = ETime->Minute; - FTime->Time.DoubleSecond = (UINT16) (ETime->Second / 2); -} - -/** - - Translate Fat time to EFI time. - - @param FTime - The time of FAT_DATE_TIME. - @param ETime - The time of EFI_TIME.. - -**/ -VOID -FatFatTimeToEfiTime ( - IN FAT_DATE_TIME *FTime, - OUT EFI_TIME *ETime - ) -{ - ETime->Year = (UINT16) (FTime->Date.Year + 1980); - ETime->Month = (UINT8) FTime->Date.Month; - ETime->Day = (UINT8) FTime->Date.Day; - ETime->Hour = (UINT8) FTime->Time.Hour; - ETime->Minute = (UINT8) FTime->Time.Minute; - ETime->Second = (UINT8) (FTime->Time.DoubleSecond * 2); - ETime->Nanosecond = 0; - ETime->TimeZone = EFI_UNSPECIFIED_TIMEZONE; - ETime->Daylight = 0; -} - -/** - - Get Current FAT time. - - @param FatNow - Current FAT time. - -**/ -VOID -FatGetCurrentFatTime ( - OUT FAT_DATE_TIME *FatNow - ) -{ - EFI_STATUS Status; - EFI_TIME Now; - - Status = gRT->GetTime (&Now, NULL); - if (!EFI_ERROR (Status)) { - FatEfiTimeToFatTime (&Now, FatNow); - } else { - ZeroMem (&Now, sizeof (EFI_TIME)); - Now.Year = 1980; - Now.Month = 1; - Now.Day = 1; - FatEfiTimeToFatTime (&Now, FatNow); - } -} - -/** - - Check whether a time is valid. - - @param Time - The time of EFI_TIME. - - @retval TRUE - The time is valid. - @retval FALSE - The time is not valid. - -**/ -BOOLEAN -FatIsValidTime ( - IN EFI_TIME *Time - ) -{ - UINTN Day; - BOOLEAN ValidTime; - - ValidTime = TRUE; - - // - // Check the fields for range problems - // Fat can only support from 1980 - // - if (Time->Year < 1980 || - Time->Month < 1 || - Time->Month > 12 || - Time->Day < 1 || - Time->Day > 31 || - Time->Hour > 23 || - Time->Minute > 59 || - Time->Second > 59 || - Time->Nanosecond > 999999999 - ) { - - ValidTime = FALSE; - - } else { - // - // Perform a more specific check of the day of the month - // - Day = mMonthDays[Time->Month - 1]; - if (Time->Month == 2 && IS_LEAP_YEAR (Time->Year)) { - Day += 1; - // - // 1 extra day this month - // - } - if (Time->Day > Day) { - ValidTime = FALSE; - } - } - - return ValidTime; -} diff --git a/FatPkg/EnhancedFatDxe/Open.c b/FatPkg/EnhancedFatDxe/Open.c deleted file mode 100644 index 7b273fe1b1..0000000000 --- a/FatPkg/EnhancedFatDxe/Open.c +++ /dev/null @@ -1,326 +0,0 @@ -/** @file - Routines dealing with file open. - -Copyright (c) 2005 - 2014, Intel Corporation. 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 "Fat.h" - -/** - - Create an Open instance for the existing OFile. - The IFile of the newly opened file is passed out. - - @param OFile - The file that serves as a starting reference point. - @param PtrIFile - The newly generated IFile instance. - - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory for the IFile - @retval EFI_SUCCESS - Create the new IFile for the OFile successfully - -**/ -EFI_STATUS -FatAllocateIFile ( - IN FAT_OFILE *OFile, - OUT FAT_IFILE **PtrIFile - ) -{ - FAT_IFILE *IFile; - - ASSERT_VOLUME_LOCKED (OFile->Volume); - - // - // Allocate a new open instance - // - IFile = AllocateZeroPool (sizeof (FAT_IFILE)); - if (IFile == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - IFile->Signature = FAT_IFILE_SIGNATURE; - - CopyMem (&(IFile->Handle), &FatFileInterface, sizeof (EFI_FILE_PROTOCOL)); - - // - // Report the correct revision number based on the DiskIo2 availability - // - if (OFile->Volume->DiskIo2 != NULL) { - IFile->Handle.Revision = EFI_FILE_PROTOCOL_REVISION2; - } else { - IFile->Handle.Revision = EFI_FILE_PROTOCOL_REVISION; - } - - IFile->OFile = OFile; - InsertTailList (&OFile->Opens, &IFile->Link); - InitializeListHead (&IFile->Tasks); - - *PtrIFile = IFile; - return EFI_SUCCESS; -} - -/** - - Open a file for a file name relative to an existing OFile. - The IFile of the newly opened file is passed out. - - @param OFile - The file that serves as a starting reference point. - @param NewIFile - The newly generated IFile instance. - @param FileName - The file name relative to the OFile. - @param OpenMode - Open mode. - @param Attributes - Attributes to set if the file is created. - - - @retval EFI_SUCCESS - Open the file successfully. - @retval EFI_INVALID_PARAMETER - The open mode is conflict with the attributes - or the file name is not valid. - @retval EFI_NOT_FOUND - Conficts between dir intention and attribute. - @retval EFI_WRITE_PROTECTED - Can't open for write if the volume is read only. - @retval EFI_ACCESS_DENIED - If the file's attribute is read only, and the - open is for read-write fail it. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - -**/ -EFI_STATUS -FatOFileOpen ( - IN FAT_OFILE *OFile, - OUT FAT_IFILE **NewIFile, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT8 Attributes - ) -{ - FAT_VOLUME *Volume; - EFI_STATUS Status; - CHAR16 NewFileName[EFI_PATH_STRING_LENGTH]; - FAT_DIRENT *DirEnt; - UINT8 FileAttributes; - BOOLEAN WriteMode; - - DirEnt = NULL; - Volume = OFile->Volume; - ASSERT_VOLUME_LOCKED (Volume); - WriteMode = (BOOLEAN) (OpenMode & EFI_FILE_MODE_WRITE); - if (Volume->ReadOnly && WriteMode) { - return EFI_WRITE_PROTECTED; - } - // - // Verify the source file handle isn't in an error state - // - Status = OFile->Error; - if (EFI_ERROR (Status)) { - return Status; - } - // - // Get new OFile for the file - // - Status = FatLocateOFile (&OFile, FileName, Attributes, NewFileName); - if (EFI_ERROR (Status)) { - return Status; - } - - if (*NewFileName != 0) { - // - // If there's a remaining part of the name, then we had - // better be creating the file in the directory - // - if ((OpenMode & EFI_FILE_MODE_CREATE) == 0) { - return EFI_NOT_FOUND; - } - - Status = FatCreateDirEnt (OFile, NewFileName, Attributes, &DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - ASSERT (DirEnt != NULL); - Status = FatOpenDirEnt (OFile, DirEnt); - if (EFI_ERROR (Status)) { - return Status; - } - - OFile = DirEnt->OFile; - if (OFile->ODir != NULL) { - // - // If we just created a directory, we need to create "." and ".." - // - Status = FatCreateDotDirEnts (OFile); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - // - // If the file's attribute is read only, and the open is for - // read-write, then the access is denied. - // - FileAttributes = OFile->DirEnt->Entry.Attributes; - if ((FileAttributes & EFI_FILE_READ_ONLY) != 0 && (FileAttributes & FAT_ATTRIBUTE_DIRECTORY) == 0 && WriteMode) { - return EFI_ACCESS_DENIED; - } - // - // Create an open instance of the OFile - // - Status = FatAllocateIFile (OFile, NewIFile); - if (EFI_ERROR (Status)) { - return Status; - } - - (*NewIFile)->ReadOnly = (BOOLEAN)!WriteMode; - - DEBUG ((EFI_D_INFO, "FSOpen: Open '%S' %r\n", FileName, Status)); - return FatOFileFlush (OFile); -} - -/** - - Implements OpenEx() of Simple File System Protocol. - - @param FHand - File handle of the file serves as a starting reference point. - @param NewHandle - Handle of the file that is newly opened. - @param FileName - File name relative to FHand. - @param OpenMode - Open mode. - @param Attributes - Attributes to set if the file is created. - @param Token - A pointer to the token associated with the transaction.: - - @retval EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty. - The OpenMode is not supported. - The Attributes is not the valid attributes. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory for file string. - @retval EFI_SUCCESS - Open the file successfully. - @return Others - The status of open file. - -**/ -EFI_STATUS -EFIAPI -FatOpenEx ( - IN EFI_FILE_PROTOCOL *FHand, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes, - IN OUT EFI_FILE_IO_TOKEN *Token - ) -{ - FAT_IFILE *IFile; - FAT_IFILE *NewIFile; - FAT_OFILE *OFile; - EFI_STATUS Status; - FAT_TASK *Task; - - // - // Perform some parameter checking - // - if (FileName == NULL) { - return EFI_INVALID_PARAMETER; - } - // - // Check for a valid mode - // - switch (OpenMode) { - case EFI_FILE_MODE_READ: - case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE: - case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE: - break; - - default: - return EFI_INVALID_PARAMETER; - } - - // - // Check for valid Attributes for file creation case. - // - if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) && (Attributes & (EFI_FILE_READ_ONLY | (~EFI_FILE_VALID_ATTR))) != 0) { - return EFI_INVALID_PARAMETER; - } - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - Task = NULL; - - if (Token == NULL) { - FatWaitNonblockingTask (IFile); - } else { - // - // Caller shouldn't call the non-blocking interfaces if the low layer doesn't support DiskIo2. - // But if it calls, the below check can avoid crash. - // - if (FHand->Revision < EFI_FILE_PROTOCOL_REVISION2) { - return EFI_UNSUPPORTED; - } - Task = FatCreateTask (IFile, Token); - if (Task == NULL) { - return EFI_OUT_OF_RESOURCES; - } - } - - // - // Lock - // - FatAcquireLock (); - - // - // Open the file - // - Status = FatOFileOpen (OFile, &NewIFile, FileName, OpenMode, (UINT8) Attributes); - - // - // If the file was opened, return the handle to the caller - // - if (!EFI_ERROR (Status)) { - *NewHandle = &NewIFile->Handle; - } - // - // Unlock - // - Status = FatCleanupVolume (OFile->Volume, NULL, Status, Task); - FatReleaseLock (); - - if (Token != NULL) { - if (!EFI_ERROR (Status)) { - Status = FatQueueTask (IFile, Task); - } else { - FatDestroyTask (Task); - } - } - - return Status; -} - -/** - - Implements Open() of Simple File System Protocol. - - - @param FHand - File handle of the file serves as a starting reference point. - @param NewHandle - Handle of the file that is newly opened. - @param FileName - File name relative to FHand. - @param OpenMode - Open mode. - @param Attributes - Attributes to set if the file is created. - - @retval EFI_INVALID_PARAMETER - The FileName is NULL or the file string is empty. - The OpenMode is not supported. - The Attributes is not the valid attributes. - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory for file string. - @retval EFI_SUCCESS - Open the file successfully. - @return Others - The status of open file. - -**/ -EFI_STATUS -EFIAPI -FatOpen ( - IN EFI_FILE_PROTOCOL *FHand, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes - ) -{ - return FatOpenEx (FHand, NewHandle, FileName, OpenMode, Attributes, NULL); -} diff --git a/FatPkg/EnhancedFatDxe/OpenVolume.c b/FatPkg/EnhancedFatDxe/OpenVolume.c deleted file mode 100644 index 4e12db317e..0000000000 --- a/FatPkg/EnhancedFatDxe/OpenVolume.c +++ /dev/null @@ -1,64 +0,0 @@ -/** @file - OpenVolume() function of Simple File System Protocol. - -Copyright (c) 2005 - 2013, Intel Corporation. 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 "Fat.h" - -/** - - Implements Simple File System Protocol interface function OpenVolume(). - - @param This - Calling context. - @param File - the Root Directory of the volume. - - @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory. - @retval EFI_VOLUME_CORRUPTED - The FAT type is error. - @retval EFI_SUCCESS - Open the volume successfully. - -**/ -EFI_STATUS -EFIAPI -FatOpenVolume ( - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **File - ) -{ - EFI_STATUS Status; - FAT_VOLUME *Volume; - FAT_IFILE *IFile; - - Volume = VOLUME_FROM_VOL_INTERFACE (This); - FatAcquireLock (); - - // - // Open Root file - // - Status = FatOpenDirEnt (NULL, &Volume->RootDirEnt); - if (EFI_ERROR (Status)) { - goto Done; - } - // - // Open a new instance to the root - // - Status = FatAllocateIFile (Volume->Root, &IFile); - if (!EFI_ERROR (Status)) { - *File = &IFile->Handle; - } - -Done: - - Status = FatCleanupVolume (Volume, Volume->Root, Status, NULL); - FatReleaseLock (); - - return Status; -} diff --git a/FatPkg/EnhancedFatDxe/ReadWrite.c b/FatPkg/EnhancedFatDxe/ReadWrite.c deleted file mode 100644 index ad3c260412..0000000000 --- a/FatPkg/EnhancedFatDxe/ReadWrite.c +++ /dev/null @@ -1,626 +0,0 @@ -/** @file - Functions that perform file read/write. - -Copyright (c) 2005 - 2017, Intel Corporation. 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 "Fat.h" - -/** - - Get the file's position of the file. - - - @param FHand - The handle of file. - @param Position - The file's position of the file. - - @retval EFI_SUCCESS - Get the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_UNSUPPORTED - The open file is not a file. - -**/ -EFI_STATUS -EFIAPI -FatGetPosition ( - IN EFI_FILE_PROTOCOL *FHand, - OUT UINT64 *Position - ) -{ - FAT_IFILE *IFile; - FAT_OFILE *OFile; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - - if (OFile->Error == EFI_NOT_FOUND) { - return EFI_DEVICE_ERROR; - } - - if (OFile->ODir != NULL) { - return EFI_UNSUPPORTED; - } - - *Position = IFile->Position; - return EFI_SUCCESS; -} - -/** - - Set the file's position of the file. - - @param FHand - The handle of file. - @param Position - The file's position of the file. - - @retval EFI_SUCCESS - Set the info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_UNSUPPORTED - Set a directory with a not-zero position. - -**/ -EFI_STATUS -EFIAPI -FatSetPosition ( - IN EFI_FILE_PROTOCOL *FHand, - IN UINT64 Position - ) -{ - FAT_IFILE *IFile; - FAT_OFILE *OFile; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - - if (OFile->Error == EFI_NOT_FOUND) { - return EFI_DEVICE_ERROR; - } - - FatWaitNonblockingTask (IFile); - - // - // If this is a directory, we can only set back to position 0 - // - if (OFile->ODir != NULL) { - if (Position != 0) { - // - // Reset current directory cursor; - // - return EFI_UNSUPPORTED; - } - - FatResetODirCursor (OFile); - } - // - // Set the position - // - if (Position == (UINT64)-1) { - Position = OFile->FileSize; - } - // - // Set the position - // - IFile->Position = Position; - return EFI_SUCCESS; -} - -/** - - Get the file info from the open file of the IFile into Buffer. - - @param IFile - The instance of the open file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing read data. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval other - An error occurred when operation the disk. - -**/ -EFI_STATUS -FatIFileReadDir ( - IN FAT_IFILE *IFile, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - FAT_OFILE *OFile; - FAT_ODIR *ODir; - FAT_DIRENT *DirEnt; - UINT32 CurrentPos; - - OFile = IFile->OFile; - ODir = OFile->ODir; - CurrentPos = ((UINT32) IFile->Position) / sizeof (FAT_DIRECTORY_ENTRY); - - // - // We need to relocate the directory - // - if (CurrentPos < ODir->CurrentPos) { - // - // The directory cursor has been modified by another IFile, we reset the cursor - // - FatResetODirCursor (OFile); - } - // - // We seek the next directory entry's position - // - do { - Status = FatGetNextDirEnt (OFile, &DirEnt); - if (EFI_ERROR (Status) || DirEnt == NULL) { - // - // Something error occurred or reach the end of directory, - // return 0 buffersize - // - *BufferSize = 0; - goto Done; - } - } while (ODir->CurrentPos <= CurrentPos); - Status = FatGetDirEntInfo (OFile->Volume, DirEnt, BufferSize, Buffer); - -Done: - // - // Update IFile's Position - // - if (!EFI_ERROR (Status)) { - // - // Update IFile->Position, if everything is all right - // - CurrentPos = ODir->CurrentPos; - IFile->Position = CurrentPos * sizeof (FAT_DIRECTORY_ENTRY); - } - - return Status; -} - -/** - - Get the file info from the open file of the IFile into Buffer. - - @param FHand - The file handle to access. - @param IoMode - Indicate whether the access mode is reading or writing. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing read data. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @retval EFI_WRITE_PROTECTED - The disk is write protect. - @retval EFI_ACCESS_DENIED - The file is read-only. - @return other - An error occurred when operating on the disk. - -**/ -EFI_STATUS -FatIFileAccess ( - IN EFI_FILE_PROTOCOL *FHand, - IN IO_MODE IoMode, - IN OUT UINTN *BufferSize, - IN OUT VOID *Buffer, - IN EFI_FILE_IO_TOKEN *Token - ) -{ - EFI_STATUS Status; - FAT_IFILE *IFile; - FAT_OFILE *OFile; - FAT_VOLUME *Volume; - UINT64 EndPosition; - FAT_TASK *Task; - - IFile = IFILE_FROM_FHAND (FHand); - OFile = IFile->OFile; - Volume = OFile->Volume; - Task = NULL; - - // - // Write to a directory is unsupported - // - if ((OFile->ODir != NULL) && (IoMode == WriteData)) { - return EFI_UNSUPPORTED; - } - - if (OFile->Error == EFI_NOT_FOUND) { - return EFI_DEVICE_ERROR; - } - - if (IoMode == ReadData) { - // - // If position is at EOF, then return device error - // - if (IFile->Position > OFile->FileSize) { - return EFI_DEVICE_ERROR; - } - } else { - // - // Check if the we can write data - // - if (Volume->ReadOnly) { - return EFI_WRITE_PROTECTED; - } - - if (IFile->ReadOnly) { - return EFI_ACCESS_DENIED; - } - } - - if (Token == NULL) { - FatWaitNonblockingTask (IFile); - } else { - // - // Caller shouldn't call the non-blocking interfaces if the low layer doesn't support DiskIo2. - // But if it calls, the below check can avoid crash. - // - if (FHand->Revision < EFI_FILE_PROTOCOL_REVISION2) { - return EFI_UNSUPPORTED; - } - Task = FatCreateTask (IFile, Token); - if (Task == NULL) { - return EFI_OUT_OF_RESOURCES; - } - } - - FatAcquireLock (); - - Status = OFile->Error; - if (!EFI_ERROR (Status)) { - if (OFile->ODir != NULL) { - // - // Read a directory is supported - // - ASSERT (IoMode == ReadData); - Status = FatIFileReadDir (IFile, BufferSize, Buffer); - OFile = NULL; - } else { - // - // Access a file - // - EndPosition = IFile->Position + *BufferSize; - if (EndPosition > OFile->FileSize) { - // - // The position goes beyond the end of file - // - if (IoMode == ReadData) { - // - // Adjust the actual size read - // - *BufferSize -= (UINTN) EndPosition - OFile->FileSize; - } else { - // - // We expand the file size of OFile - // - Status = FatGrowEof (OFile, EndPosition); - if (EFI_ERROR (Status)) { - // - // Must update the file's info into the file's Directory Entry - // and then flush the dirty cache info into disk. - // - *BufferSize = 0; - FatOFileFlush (OFile); - OFile = NULL; - goto Done; - } - - FatUpdateDirEntClusterSizeInfo (OFile); - } - } - - Status = FatAccessOFile (OFile, IoMode, (UINTN) IFile->Position, BufferSize, Buffer, Task); - IFile->Position += *BufferSize; - } - } - - if (Token != NULL) { - if (!EFI_ERROR (Status)) { - Status = FatQueueTask (IFile, Task); - } else { - FatDestroyTask (Task); - } - } - -Done: - // - // On EFI_SUCCESS case, not calling FatCleanupVolume(): - // 1) The Cache flush operation is avoided to enhance - // performance. Caller is responsible to call Flush() when necessary. - // 2) The volume dirty bit is probably set already, and is expected to be - // cleaned in subsequent Flush() or other operations. - // 3) Write operation doesn't affect OFile/IFile structure, so - // Reference checking is not necessary. - // - if (EFI_ERROR (Status)) { - Status = FatCleanupVolume (Volume, OFile, Status, NULL); - } - - FatReleaseLock (); - return Status; -} - -/** - - Get the file info. - - @param FHand - The handle of the file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing read data. - - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatRead ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - return FatIFileAccess (FHand, ReadData, BufferSize, Buffer, NULL); -} - -/** - - Get the file info. - - @param FHand - The handle of the file. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatReadEx ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT EFI_FILE_IO_TOKEN *Token - ) -{ - return FatIFileAccess (FHand, ReadData, &Token->BufferSize, Token->Buffer, Token); -} - -/** - - Write the content of buffer into files. - - @param FHand - The handle of the file. - @param BufferSize - Size of Buffer. - @param Buffer - Buffer containing write data. - - @retval EFI_SUCCESS - Set the file info successfully. - @retval EFI_WRITE_PROTECTED - The disk is write protect. - @retval EFI_ACCESS_DENIED - The file is read-only. - @retval EFI_DEVICE_ERROR - The OFile is not valid. - @retval EFI_UNSUPPORTED - The open file is not a file. - - The writing file size is larger than 4GB. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatWrite ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - return FatIFileAccess (FHand, WriteData, BufferSize, Buffer, NULL); -} - -/** - - Get the file info. - - @param FHand - The handle of the file. - @param Token - A pointer to the token associated with the transaction. - - @retval EFI_SUCCESS - Get the file info successfully. - @retval EFI_DEVICE_ERROR - Can not find the OFile for the file. - @retval EFI_VOLUME_CORRUPTED - The file type of open file is error. - @return other - An error occurred when operation the disk. - -**/ -EFI_STATUS -EFIAPI -FatWriteEx ( - IN EFI_FILE_PROTOCOL *FHand, - IN OUT EFI_FILE_IO_TOKEN *Token - ) -{ - return FatIFileAccess (FHand, WriteData, &Token->BufferSize, Token->Buffer, Token); -} - -/** - - This function reads data from a file or writes data to a file. - It uses OFile->PosRem to determine how much data can be accessed in one time. - - @param OFile - The open file. - @param IoMode - Indicate whether the access mode is reading or writing. - @param Position - The position where data will be accessed. - @param DataBufferSize - Size of Buffer. - @param UserBuffer - Buffer containing data. - @param Task point to task instance. - - @retval EFI_SUCCESS - Access the data successfully. - @return other - An error occurred when operating on the disk. - -**/ -EFI_STATUS -FatAccessOFile ( - IN FAT_OFILE *OFile, - IN IO_MODE IoMode, - IN UINTN Position, - IN OUT UINTN *DataBufferSize, - IN OUT UINT8 *UserBuffer, - IN FAT_TASK *Task - ) -{ - FAT_VOLUME *Volume; - UINTN Len; - EFI_STATUS Status; - UINTN BufferSize; - - BufferSize = *DataBufferSize; - Volume = OFile->Volume; - ASSERT_VOLUME_LOCKED (Volume); - - Status = EFI_SUCCESS; - while (BufferSize > 0) { - // - // Seek the OFile to the file position - // - Status = FatOFilePosition (OFile, Position, BufferSize); - if (EFI_ERROR (Status)) { - break; - } - // - // Clip length to block run - // - Len = BufferSize > OFile->PosRem ? OFile->PosRem : BufferSize; - - // - // Write the data - // - Status = FatDiskIo (Volume, IoMode, OFile->PosDisk, Len, UserBuffer, Task); - if (EFI_ERROR (Status)) { - break; - } - // - // Data was successfully accessed - // - Position += Len; - UserBuffer += Len; - BufferSize -= Len; - if (IoMode == WriteData) { - OFile->Dirty = TRUE; - OFile->Archive = TRUE; - } - // - // Make sure no outbound occurred - // - ASSERT (Position <= OFile->FileSize); - } - // - // Update the number of bytes accessed - // - *DataBufferSize -= BufferSize; - return Status; -} - -/** - - Expand OFile by appending zero bytes at the end of OFile. - - @param OFile - The open file. - @param ExpandedSize - The number of zero bytes appended at the end of the file. - - @retval EFI_SUCCESS - The file is expanded successfully. - @return other - An error occurred when expanding file. - -**/ -EFI_STATUS -FatExpandOFile ( - IN FAT_OFILE *OFile, - IN UINT64 ExpandedSize - ) -{ - EFI_STATUS Status; - UINTN WritePos; - - WritePos = OFile->FileSize; - Status = FatGrowEof (OFile, ExpandedSize); - if (!EFI_ERROR (Status)) { - Status = FatWriteZeroPool (OFile, WritePos); - } - - return Status; -} - -/** - - Write zero pool from the WritePos to the end of OFile. - - @param OFile - The open file to write zero pool. - @param WritePos - The number of zero bytes written. - - @retval EFI_SUCCESS - Write the zero pool successfully. - @retval EFI_OUT_OF_RESOURCES - Not enough memory to perform the operation. - @return other - An error occurred when writing disk. - -**/ -EFI_STATUS -FatWriteZeroPool ( - IN FAT_OFILE *OFile, - IN UINTN WritePos - ) -{ - EFI_STATUS Status; - VOID *ZeroBuffer; - UINTN AppendedSize; - UINTN BufferSize; - UINTN WriteSize; - - AppendedSize = OFile->FileSize - WritePos; - BufferSize = AppendedSize; - if (AppendedSize > FAT_MAX_ALLOCATE_SIZE) { - // - // If the appended size is larger, maybe we can not allocate the whole - // memory once. So if the growed size is larger than 10M, we just - // allocate 10M memory (one healthy system should have 10M available - // memory), and then write the zerobuffer to the file several times. - // - BufferSize = FAT_MAX_ALLOCATE_SIZE; - } - - ZeroBuffer = AllocateZeroPool (BufferSize); - if (ZeroBuffer == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - do { - WriteSize = AppendedSize > BufferSize ? BufferSize : (UINTN) AppendedSize; - AppendedSize -= WriteSize; - Status = FatAccessOFile (OFile, WriteData, WritePos, &WriteSize, ZeroBuffer, NULL); - if (EFI_ERROR (Status)) { - break; - } - - WritePos += WriteSize; - } while (AppendedSize > 0); - - FreePool (ZeroBuffer); - return Status; -} - -/** - - Truncate the OFile to smaller file size. - - @param OFile - The open file. - @param TruncatedSize - The new file size. - - @retval EFI_SUCCESS - The file is truncated successfully. - @return other - An error occurred when truncating file. - -**/ -EFI_STATUS -FatTruncateOFile ( - IN FAT_OFILE *OFile, - IN UINTN TruncatedSize - ) -{ - OFile->FileSize = TruncatedSize; - return FatShrinkEof (OFile); -} diff --git a/FatPkg/EnhancedFatDxe/UnicodeCollation.c b/FatPkg/EnhancedFatDxe/UnicodeCollation.c deleted file mode 100644 index b240a931ff..0000000000 --- a/FatPkg/EnhancedFatDxe/UnicodeCollation.c +++ /dev/null @@ -1,281 +0,0 @@ -/** @file - Unicode Collation Support component that hides the trivial difference of Unicode Collation - and Unicode collation 2 Protocol. - - Copyright (c) 2007 - 2013, Intel Corporation. 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 "Fat.h" - -EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollationInterface = NULL; - -/** - Worker function to initialize Unicode Collation support. - - It tries to locate Unicode Collation (2) protocol and matches it with current - platform language code. - - @param AgentHandle The handle used to open Unicode Collation (2) protocol. - @param ProtocolGuid The pointer to Unicode Collation (2) protocol GUID. - @param VariableName The name of the RFC 4646 or ISO 639-2 language variable. - @param DefaultLanguage The default language in case the RFC 4646 or ISO 639-2 language is absent. - - @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located. - @retval Others The Unicode Collation (2) protocol has not been located. - -**/ -EFI_STATUS -InitializeUnicodeCollationSupportWorker ( - IN EFI_HANDLE AgentHandle, - IN EFI_GUID *ProtocolGuid, - IN CONST CHAR16 *VariableName, - IN CONST CHAR8 *DefaultLanguage - ) -{ - EFI_STATUS ReturnStatus; - EFI_STATUS Status; - UINTN NumHandles; - UINTN Index; - EFI_HANDLE *Handles; - EFI_UNICODE_COLLATION_PROTOCOL *Uci; - BOOLEAN Iso639Language; - CHAR8 *Language; - CHAR8 *BestLanguage; - - Status = gBS->LocateHandleBuffer ( - ByProtocol, - ProtocolGuid, - NULL, - &NumHandles, - &Handles - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Iso639Language = (BOOLEAN) (ProtocolGuid == &gEfiUnicodeCollationProtocolGuid); - GetEfiGlobalVariable2 (VariableName, (VOID**) &Language, NULL); - - ReturnStatus = EFI_UNSUPPORTED; - for (Index = 0; Index < NumHandles; Index++) { - // - // Open Unicode Collation Protocol - // - Status = gBS->OpenProtocol ( - Handles[Index], - ProtocolGuid, - (VOID **) &Uci, - AgentHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - continue; - } - - // - // Find the best matching matching language from the supported languages - // of Unicode Collation (2) protocol. - // - BestLanguage = GetBestLanguage ( - Uci->SupportedLanguages, - Iso639Language, - (Language == NULL) ? "" : Language, - DefaultLanguage, - NULL - ); - if (BestLanguage != NULL) { - FreePool (BestLanguage); - mUnicodeCollationInterface = Uci; - ReturnStatus = EFI_SUCCESS; - break; - } - } - - if (Language != NULL) { - FreePool (Language); - } - - FreePool (Handles); - - return ReturnStatus; -} - -/** - Initialize Unicode Collation support. - - It tries to locate Unicode Collation 2 protocol and matches it with current - platform language code. If for any reason the first attempt fails, it then tries to - use Unicode Collation Protocol. - - @param AgentHandle The handle used to open Unicode Collation (2) protocol. - - @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located. - @retval Others The Unicode Collation (2) protocol has not been located. - -**/ -EFI_STATUS -InitializeUnicodeCollationSupport ( - IN EFI_HANDLE AgentHandle - ) -{ - - EFI_STATUS Status; - - Status = EFI_UNSUPPORTED; - - // - // First try to use RFC 4646 Unicode Collation 2 Protocol. - // - Status = InitializeUnicodeCollationSupportWorker ( - AgentHandle, - &gEfiUnicodeCollation2ProtocolGuid, - L"PlatformLang", - (CONST CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang) - ); - // - // If the attempt to use Unicode Collation 2 Protocol fails, then we fall back - // on the ISO 639-2 Unicode Collation Protocol. - // - if (EFI_ERROR (Status)) { - Status = InitializeUnicodeCollationSupportWorker ( - AgentHandle, - &gEfiUnicodeCollationProtocolGuid, - L"Lang", - (CONST CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultLang) - ); - } - - return Status; -} - - -/** - Performs a case-insensitive comparison of two Null-terminated Unicode strings. - - @param S1 A pointer to a Null-terminated Unicode string. - @param S2 A pointer to a Null-terminated Unicode string. - - @retval 0 S1 is equivalent to S2. - @retval >0 S1 is lexically greater than S2. - @retval <0 S1 is lexically less than S2. -**/ -INTN -FatStriCmp ( - IN CHAR16 *S1, - IN CHAR16 *S2 - ) -{ - ASSERT (StrSize (S1) != 0); - ASSERT (StrSize (S2) != 0); - ASSERT (mUnicodeCollationInterface != NULL); - - return mUnicodeCollationInterface->StriColl ( - mUnicodeCollationInterface, - S1, - S2 - ); -} - - -/** - Uppercase a string. - - @param String The string which will be upper-cased. - - -**/ -VOID -FatStrUpr ( - IN OUT CHAR16 *String - ) -{ - ASSERT (StrSize (String) != 0); - ASSERT (mUnicodeCollationInterface != NULL); - - mUnicodeCollationInterface->StrUpr (mUnicodeCollationInterface, String); -} - - -/** - Lowercase a string - - @param String The string which will be lower-cased. - - -**/ -VOID -FatStrLwr ( - IN OUT CHAR16 *String - ) -{ - ASSERT (StrSize (String) != 0); - ASSERT (mUnicodeCollationInterface != NULL); - - mUnicodeCollationInterface->StrLwr (mUnicodeCollationInterface, String); -} - - -/** - Convert FAT string to unicode string. - - @param FatSize The size of FAT string. - @param Fat The FAT string. - @param String The unicode string. - - @return None. - -**/ -VOID -FatFatToStr ( - IN UINTN FatSize, - IN CHAR8 *Fat, - OUT CHAR16 *String - ) -{ - ASSERT (Fat != NULL); - ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); - ASSERT (mUnicodeCollationInterface != NULL); - - mUnicodeCollationInterface->FatToStr (mUnicodeCollationInterface, FatSize, Fat, String); -} - - -/** - Convert unicode string to Fat string. - - @param String The unicode string. - @param FatSize The size of the FAT string. - @param Fat The FAT string. - - @retval TRUE Convert successfully. - @retval FALSE Convert error. - -**/ -BOOLEAN -FatStrToFat ( - IN CHAR16 *String, - IN UINTN FatSize, - OUT CHAR8 *Fat - ) -{ - ASSERT (Fat != NULL); - ASSERT (StrSize (String) != 0); - ASSERT (mUnicodeCollationInterface != NULL); - - return mUnicodeCollationInterface->StrToFat ( - mUnicodeCollationInterface, - String, - FatSize, - Fat - ); -} diff --git a/FatPkg/FatPei/FatLiteAccess.c b/FatPkg/FatPei/FatLiteAccess.c deleted file mode 100644 index a92c5bff99..0000000000 --- a/FatPkg/FatPei/FatLiteAccess.c +++ /dev/null @@ -1,527 +0,0 @@ -/** @file - FAT file system access routines for FAT recovery PEIM - -Copyright (c) 2006 - 2017, Intel Corporation. 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 "FatLitePeim.h" - - -/** - Check if there is a valid FAT in the corresponding Block device - of the volume and if yes, fill in the relevant fields for the - volume structure. Note there should be a valid Block device number - already set. - - @param PrivateData Global memory map for accessing global - variables. - @param Volume On input, the BlockDeviceNumber field of the - Volume should be a valid value. On successful - output, all fields except the VolumeNumber - field is initialized. - - @retval EFI_SUCCESS A FAT is found and the volume structure is - initialized. - @retval EFI_NOT_FOUND There is no FAT on the corresponding device. - @retval EFI_DEVICE_ERROR There is something error while accessing device. - -**/ -EFI_STATUS -FatGetBpbInfo ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN OUT PEI_FAT_VOLUME *Volume - ) -{ - EFI_STATUS Status; - PEI_FAT_BOOT_SECTOR Bpb; - PEI_FAT_BOOT_SECTOR_EX BpbEx; - UINT32 Sectors; - UINT32 SectorsPerFat; - UINT32 RootDirSectors; - UINT64 FatLba; - UINT64 RootLba; - UINT64 FirstClusterLba; - - // - // Read in the BPB - // - Status = FatReadDisk ( - PrivateData, - Volume->BlockDeviceNo, - 0, - sizeof (PEI_FAT_BOOT_SECTOR_EX), - &BpbEx - ); - if (EFI_ERROR (Status)) { - return Status; - } - - CopyMem ( - (UINT8 *) (&Bpb), - (UINT8 *) (&BpbEx), - sizeof (PEI_FAT_BOOT_SECTOR) - ); - - Volume->FatType = FatUnknown; - - Sectors = Bpb.Sectors; - if (Sectors == 0) { - Sectors = Bpb.LargeSectors; - } - - SectorsPerFat = Bpb.SectorsPerFat; - if (SectorsPerFat == 0) { - SectorsPerFat = BpbEx.LargeSectorsPerFat; - Volume->FatType = Fat32; - } - // - // Filter out those not a FAT - // - if (Bpb.Ia32Jump[0] != 0xe9 && Bpb.Ia32Jump[0] != 0xeb && Bpb.Ia32Jump[0] != 0x49) { - return EFI_NOT_FOUND; - } - - if (Bpb.ReservedSectors == 0 || Bpb.NoFats == 0 || Sectors == 0) { - return EFI_NOT_FOUND; - } - - if (Bpb.SectorsPerCluster != 1 && - Bpb.SectorsPerCluster != 2 && - Bpb.SectorsPerCluster != 4 && - Bpb.SectorsPerCluster != 8 && - Bpb.SectorsPerCluster != 16 && - Bpb.SectorsPerCluster != 32 && - Bpb.SectorsPerCluster != 64 && - Bpb.SectorsPerCluster != 128 - ) { - return EFI_NOT_FOUND; - } - - if (Volume->FatType == Fat32 && (SectorsPerFat == 0 || BpbEx.FsVersion != 0)) { - return EFI_NOT_FOUND; - } - - if (Bpb.Media != 0xf0 && - Bpb.Media != 0xf8 && - Bpb.Media != 0xf9 && - Bpb.Media != 0xfb && - Bpb.Media != 0xfc && - Bpb.Media != 0xfd && - Bpb.Media != 0xfe && - Bpb.Media != 0xff && - // - // FujitsuFMR - // - Bpb.Media != 0x00 && - Bpb.Media != 0x01 && - Bpb.Media != 0xfa - ) { - return EFI_NOT_FOUND; - } - - if (Volume->FatType != Fat32 && Bpb.RootEntries == 0) { - return EFI_NOT_FOUND; - } - // - // If this is fat32, refuse to mount mirror-disabled volumes - // - if (Volume->FatType == Fat32 && ((BpbEx.ExtendedFlags & 0x80) != 0)) { - return EFI_NOT_FOUND; - } - // - // Fill in the volume structure fields - // (Sectors & SectorsPerFat is computed earlier already) - // - Volume->ClusterSize = Bpb.SectorSize * Bpb.SectorsPerCluster; - Volume->RootEntries = Bpb.RootEntries; - Volume->SectorSize = Bpb.SectorSize; - - RootDirSectors = ((Volume->RootEntries * sizeof (FAT_DIRECTORY_ENTRY)) + (Volume->SectorSize - 1)) / Volume->SectorSize; - - FatLba = Bpb.ReservedSectors; - RootLba = Bpb.NoFats * SectorsPerFat + FatLba; - FirstClusterLba = RootLba + RootDirSectors; - - Volume->VolumeSize = MultU64x32 (Sectors, Volume->SectorSize); - Volume->FatPos = MultU64x32 (FatLba, Volume->SectorSize); - Volume->RootDirPos = MultU64x32 (RootLba, Volume->SectorSize); - Volume->FirstClusterPos = MultU64x32 (FirstClusterLba, Volume->SectorSize); - Volume->MaxCluster = (UINT32) (Sectors - FirstClusterLba) / Bpb.SectorsPerCluster; - Volume->RootDirCluster = BpbEx.RootDirFirstCluster; - - // - // If this is not a fat32, determine if it's a fat16 or fat12 - // - if (Volume->FatType != Fat32) { - - if (Volume->MaxCluster >= 65525) { - return EFI_NOT_FOUND; - } - - Volume->FatType = Volume->MaxCluster < 4085 ? Fat12 : Fat16; - } - - return EFI_SUCCESS; -} - - -/** - Gets the next cluster in the cluster chain - - @param PrivateData Global memory map for accessing global variables - @param Volume The volume - @param Cluster The cluster - @param NextCluster The cluster number of the next cluster - - @retval EFI_SUCCESS The address is got - @retval EFI_INVALID_PARAMETER ClusterNo exceeds the MaxCluster of the volume. - @retval EFI_DEVICE_ERROR Read disk error - -**/ -EFI_STATUS -FatGetNextCluster ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_VOLUME *Volume, - IN UINT32 Cluster, - OUT UINT32 *NextCluster - ) -{ - EFI_STATUS Status; - UINT64 FatEntryPos; - UINT32 Dummy; - - *NextCluster = 0; - - if (Volume->FatType == Fat32) { - FatEntryPos = Volume->FatPos + MultU64x32 (4, Cluster); - - Status = FatReadDisk (PrivateData, Volume->BlockDeviceNo, FatEntryPos, 4, NextCluster); - *NextCluster &= 0x0fffffff; - - // - // Pad high bits for our FAT_CLUSTER_... macro definitions to work - // - if ((*NextCluster) >= 0x0ffffff7) { - *NextCluster |= (-1 &~0xf); - } - - } else if (Volume->FatType == Fat16) { - FatEntryPos = Volume->FatPos + MultU64x32 (2, Cluster); - - Status = FatReadDisk (PrivateData, Volume->BlockDeviceNo, FatEntryPos, 2, NextCluster); - - // - // Pad high bits for our FAT_CLUSTER_... macro definitions to work - // - if ((*NextCluster) >= 0xfff7) { - *NextCluster |= (-1 &~0xf); - } - - } else { - FatEntryPos = Volume->FatPos + DivU64x32Remainder (MultU64x32 (3, Cluster), 2, &Dummy); - - Status = FatReadDisk (PrivateData, Volume->BlockDeviceNo, FatEntryPos, 2, NextCluster); - - if ((Cluster & 0x01) != 0) { - *NextCluster = (*NextCluster) >> 4; - } else { - *NextCluster = (*NextCluster) & 0x0fff; - } - // - // Pad high bits for our FAT_CLUSTER_... macro definitions to work - // - if ((*NextCluster) >= 0x0ff7) { - *NextCluster |= (-1 &~0xf); - } - } - - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - return EFI_SUCCESS; - -} - - -/** - Set a file's CurrentPos and CurrentCluster, then compute StraightReadAmount. - - @param PrivateData the global memory map - @param File the file - @param Pos the Position which is offset from the file's - CurrentPos - - @retval EFI_SUCCESS Success. - @retval EFI_INVALID_PARAMETER Pos is beyond file's size. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatSetFilePos ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_FILE *File, - IN UINT32 Pos - ) -{ - EFI_STATUS Status; - UINT32 AlignedPos; - UINT32 Offset; - UINT32 Cluster; - UINT32 PrevCluster; - - if (File->IsFixedRootDir) { - - if (Pos >= MultU64x32 (File->Volume->RootEntries, 32) - File->CurrentPos) { - return EFI_INVALID_PARAMETER; - } - - File->CurrentPos += Pos; - File->StraightReadAmount = (UINT32) (MultU64x32 (File->Volume->RootEntries, 32) - File->CurrentPos); - - } else { - - DivU64x32Remainder (File->CurrentPos, File->Volume->ClusterSize, &Offset); - AlignedPos = (UINT32) File->CurrentPos - (UINT32) Offset; - - while - ( - !FAT_CLUSTER_FUNCTIONAL (File->CurrentCluster) && - AlignedPos + File->Volume->ClusterSize <= File->CurrentPos + Pos - ) { - AlignedPos += File->Volume->ClusterSize; - Status = FatGetNextCluster ( - PrivateData, - File->Volume, - File->CurrentCluster, - &File->CurrentCluster - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - } - - if (FAT_CLUSTER_FUNCTIONAL (File->CurrentCluster)) { - return EFI_INVALID_PARAMETER; - } - - File->CurrentPos += Pos; - // - // Calculate the amount of consecutive cluster occupied by the file. - // FatReadFile() will use it to read these blocks once. - // - File->StraightReadAmount = 0; - Cluster = File->CurrentCluster; - while (!FAT_CLUSTER_FUNCTIONAL (Cluster)) { - File->StraightReadAmount += File->Volume->ClusterSize; - PrevCluster = Cluster; - Status = FatGetNextCluster (PrivateData, File->Volume, Cluster, &Cluster); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - if (Cluster != PrevCluster + 1) { - break; - } - } - - DivU64x32Remainder (File->CurrentPos, File->Volume->ClusterSize, &Offset); - File->StraightReadAmount -= (UINT32) Offset; - - } - - return EFI_SUCCESS; -} - - -/** - Reads file data. Updates the file's CurrentPos. - - @param PrivateData Global memory map for accessing global variables - @param File The file. - @param Size The amount of data to read. - @param Buffer The buffer storing the data. - - @retval EFI_SUCCESS The data is read. - @retval EFI_INVALID_PARAMETER File is invalid. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatReadFile ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_FILE *File, - IN UINTN Size, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - CHAR8 *BufferPtr; - UINT32 Offset; - UINT64 PhysicalAddr; - UINTN Amount; - - BufferPtr = Buffer; - - if (File->IsFixedRootDir) { - // - // This is the fixed root dir in FAT12 and FAT16 - // - if (File->CurrentPos + Size > File->Volume->RootEntries * sizeof (FAT_DIRECTORY_ENTRY)) { - return EFI_INVALID_PARAMETER; - } - - Status = FatReadDisk ( - PrivateData, - File->Volume->BlockDeviceNo, - File->Volume->RootDirPos + File->CurrentPos, - Size, - Buffer - ); - File->CurrentPos += (UINT32) Size; - return Status; - - } else { - - if ((File->Attributes & FAT_ATTR_DIRECTORY) == 0) { - Size = Size < (File->FileSize - File->CurrentPos) ? Size : (File->FileSize - File->CurrentPos); - } - // - // This is a normal cluster based file - // - while (Size != 0) { - DivU64x32Remainder (File->CurrentPos, File->Volume->ClusterSize, &Offset); - PhysicalAddr = File->Volume->FirstClusterPos + MultU64x32 (File->Volume->ClusterSize, File->CurrentCluster - 2); - - Amount = File->StraightReadAmount; - Amount = Size > Amount ? Amount : Size; - Status = FatReadDisk ( - PrivateData, - File->Volume->BlockDeviceNo, - PhysicalAddr + Offset, - Amount, - BufferPtr - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - // - // Advance the file's current pos and current cluster - // - FatSetFilePos (PrivateData, File, (UINT32) Amount); - - BufferPtr += Amount; - Size -= Amount; - } - - return EFI_SUCCESS; - } -} - - -/** - This function reads the next item in the parent directory and - initializes the output parameter SubFile (CurrentPos is initialized to 0). - The function updates the CurrentPos of the parent dir to after the item read. - If no more items were found, the function returns EFI_NOT_FOUND. - - @param PrivateData Global memory map for accessing global variables - @param ParentDir The parent directory. - @param SubFile The File structure containing the sub file that - is caught. - - @retval EFI_SUCCESS The next sub file is obtained. - @retval EFI_INVALID_PARAMETER The ParentDir is not a directory. - @retval EFI_NOT_FOUND No more sub file exists. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatReadNextDirectoryEntry ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_FILE *ParentDir, - OUT PEI_FAT_FILE *SubFile - ) -{ - EFI_STATUS Status; - FAT_DIRECTORY_ENTRY DirEntry; - CHAR16 *Pos; - CHAR16 BaseName[9]; - CHAR16 Ext[4]; - - ZeroMem ((UINT8 *) SubFile, sizeof (PEI_FAT_FILE)); - - // - // Pick a valid directory entry - // - while (1) { - // - // Read one entry - // - Status = FatReadFile (PrivateData, ParentDir, 32, &DirEntry); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - // - // We only search for *FILE* in root directory - // Long file name entry is *NOT* supported - // - if (((DirEntry.Attributes & FAT_ATTR_DIRECTORY) == FAT_ATTR_DIRECTORY) || (DirEntry.Attributes == FAT_ATTR_LFN)) { - continue; - } - // - // if this is a terminator dir entry, just return EFI_NOT_FOUND - // - if (DirEntry.FileName[0] == EMPTY_ENTRY_MARK) { - return EFI_NOT_FOUND; - } - // - // If this not an invalid entry neither an empty entry, this is what we want. - // otherwise we will start a new loop to continue to find something meaningful - // - if ((UINT8) DirEntry.FileName[0] != DELETE_ENTRY_MARK) { - break; - } - } - // - // fill in the output parameter - // - EngFatToStr (8, DirEntry.FileName, BaseName); - EngFatToStr (3, DirEntry.FileName + 8, Ext); - - Pos = (UINT16 *) SubFile->FileName; - SetMem ((UINT8 *) Pos, FAT_MAX_FILE_NAME_LENGTH, 0); - CopyMem ((UINT8 *) Pos, (UINT8 *) BaseName, 2 * (StrLen (BaseName) + 1)); - - if (Ext[0] != 0) { - Pos += StrLen (BaseName); - *Pos = '.'; - Pos++; - CopyMem ((UINT8 *) Pos, (UINT8 *) Ext, 2 * (StrLen (Ext) + 1)); - } - - SubFile->Attributes = DirEntry.Attributes; - SubFile->CurrentCluster = DirEntry.FileCluster; - if (ParentDir->Volume->FatType == Fat32) { - SubFile->CurrentCluster |= DirEntry.FileClusterHigh << 16; - } - - SubFile->CurrentPos = 0; - SubFile->FileSize = DirEntry.FileSize; - SubFile->StartingCluster = SubFile->CurrentCluster; - SubFile->Volume = ParentDir->Volume; - - // - // in Pei phase, time parameters do not need to be filled for minimum use. - // - return Status; -} diff --git a/FatPkg/FatPei/FatLiteApi.c b/FatPkg/FatPei/FatLiteApi.c deleted file mode 100644 index e302657132..0000000000 --- a/FatPkg/FatPei/FatLiteApi.c +++ /dev/null @@ -1,685 +0,0 @@ -/** @file - FAT recovery PEIM entry point, Ppi Functions and FAT Api functions. - -Copyright (c) 2006 - 2016, Intel Corporation. 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 "FatLitePeim.h" - -PEI_FAT_PRIVATE_DATA *mPrivateData = NULL; - -/** - BlockIo installation nofication function. Find out all the current BlockIO - PPIs in the system and add them into private data. Assume there is - - @param PeiServices General purpose services available to every - PEIM. - @param NotifyDescriptor The typedef structure of the notification - descriptor. Not used in this function. - @param Ppi The typedef structure of the PPI descriptor. - Not used in this function. - - @retval EFI_SUCCESS The function completed successfully. - -**/ -EFI_STATUS -EFIAPI -BlockIoNotifyEntry ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, - IN VOID *Ppi - ); - - -/** - Discover all the block I/O devices to find the FAT volume. - - @param PrivateData Global memory map for accessing global - variables. - @param BlockIo2 Boolean to show whether using BlockIo2 or BlockIo - - @retval EFI_SUCCESS The function completed successfully. - -**/ -EFI_STATUS -UpdateBlocksAndVolumes ( - IN OUT PEI_FAT_PRIVATE_DATA *PrivateData, - IN BOOLEAN BlockIo2 - ) -{ - EFI_STATUS Status; - EFI_PEI_PPI_DESCRIPTOR *TempPpiDescriptor; - UINTN BlockIoPpiInstance; - EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIoPpi; - EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2Ppi; - UINTN NumberBlockDevices; - UINTN Index; - EFI_PEI_BLOCK_IO_MEDIA Media; - EFI_PEI_BLOCK_IO2_MEDIA Media2; - PEI_FAT_VOLUME Volume; - EFI_PEI_SERVICES **PeiServices; - - PeiServices = (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (); - BlockIo2Ppi = NULL; - BlockIoPpi = NULL; - // - // Clean up caches - // - for (Index = 0; Index < PEI_FAT_CACHE_SIZE; Index++) { - PrivateData->CacheBuffer[Index].Valid = FALSE; - } - - PrivateData->BlockDeviceCount = 0; - - // - // Find out all Block Io Ppi instances within the system - // Assuming all device Block Io Peims are dispatched already - // - for (BlockIoPpiInstance = 0; BlockIoPpiInstance < PEI_FAT_MAX_BLOCK_IO_PPI; BlockIoPpiInstance++) { - if (BlockIo2) { - Status = PeiServicesLocatePpi ( - &gEfiPeiVirtualBlockIo2PpiGuid, - BlockIoPpiInstance, - &TempPpiDescriptor, - (VOID **) &BlockIo2Ppi - ); - } else { - Status = PeiServicesLocatePpi ( - &gEfiPeiVirtualBlockIoPpiGuid, - BlockIoPpiInstance, - &TempPpiDescriptor, - (VOID **) &BlockIoPpi - ); - } - if (EFI_ERROR (Status)) { - // - // Done with all Block Io Ppis - // - break; - } - - if (BlockIo2) { - Status = BlockIo2Ppi->GetNumberOfBlockDevices ( - PeiServices, - BlockIo2Ppi, - &NumberBlockDevices - ); - } else { - Status = BlockIoPpi->GetNumberOfBlockDevices ( - PeiServices, - BlockIoPpi, - &NumberBlockDevices - ); - } - if (EFI_ERROR (Status)) { - continue; - } - - for (Index = 1; Index <= NumberBlockDevices && PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE; Index++) { - - if (BlockIo2) { - Status = BlockIo2Ppi->GetBlockDeviceMediaInfo ( - PeiServices, - BlockIo2Ppi, - Index, - &Media2 - ); - if (EFI_ERROR (Status) || !Media2.MediaPresent) { - continue; - } - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo2 = BlockIo2Ppi; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].InterfaceType = Media2.InterfaceType; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media2.LastBlock; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = Media2.BlockSize; - } else { - Status = BlockIoPpi->GetBlockDeviceMediaInfo ( - PeiServices, - BlockIoPpi, - Index, - &Media - ); - if (EFI_ERROR (Status) || !Media.MediaPresent) { - continue; - } - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockIo = BlockIoPpi; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].DevType = Media.DeviceType; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].LastBlock = Media.LastBlock; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].BlockSize = (UINT32) Media.BlockSize; - } - - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].IoAlign = 0; - // - // Not used here - // - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].Logical = FALSE; - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].PartitionChecked = FALSE; - - PrivateData->BlockDevice[PrivateData->BlockDeviceCount].PhysicalDevNo = (UINT8) Index; - PrivateData->BlockDeviceCount++; - } - } - // - // Find out all logical devices - // - FatFindPartitions (PrivateData); - - // - // Build up file system volume array - // - PrivateData->VolumeCount = 0; - for (Index = 0; Index < PrivateData->BlockDeviceCount; Index++) { - Volume.BlockDeviceNo = Index; - Status = FatGetBpbInfo (PrivateData, &Volume); - if (Status == EFI_SUCCESS) { - // - // Add the detected volume to the volume array - // - CopyMem ( - (UINT8 *) &(PrivateData->Volume[PrivateData->VolumeCount]), - (UINT8 *) &Volume, - sizeof (PEI_FAT_VOLUME) - ); - PrivateData->VolumeCount += 1; - if (PrivateData->VolumeCount >= PEI_FAT_MAX_VOLUME) { - break; - } - } - } - - return EFI_SUCCESS; -} - - -/** - BlockIo installation notification function. Find out all the current BlockIO - PPIs in the system and add them into private data. Assume there is - - @param PeiServices General purpose services available to every - PEIM. - @param NotifyDescriptor The typedef structure of the notification - descriptor. Not used in this function. - @param Ppi The typedef structure of the PPI descriptor. - Not used in this function. - - @retval EFI_SUCCESS The function completed successfully. - -**/ -EFI_STATUS -EFIAPI -BlockIoNotifyEntry ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, - IN VOID *Ppi - ) -{ - if (CompareGuid (NotifyDescriptor->Guid, &gEfiPeiVirtualBlockIo2PpiGuid)) { - UpdateBlocksAndVolumes (mPrivateData, TRUE); - } else { - UpdateBlocksAndVolumes (mPrivateData, FALSE); - } - return EFI_SUCCESS; -} - - -/** - Installs the Device Recovery Module PPI, Initialize BlockIo Ppi - installation notification - - @param FileHandle Handle of the file being invoked. Type - EFI_PEI_FILE_HANDLE is defined in - FfsFindNextFile(). - @param PeiServices Describes the list of possible PEI Services. - - @retval EFI_SUCCESS The entry point was executed successfully. - @retval EFI_OUT_OF_RESOURCES There is no enough memory to complete the - operations. - -**/ -EFI_STATUS -EFIAPI -FatPeimEntry ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS Address; - PEI_FAT_PRIVATE_DATA *PrivateData; - - Status = PeiServicesRegisterForShadow (FileHandle); - if (!EFI_ERROR (Status)) { - return Status; - } - - Status = PeiServicesAllocatePages ( - EfiBootServicesCode, - (sizeof (PEI_FAT_PRIVATE_DATA) - 1) / PEI_FAT_MEMMORY_PAGE_SIZE + 1, - &Address - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - PrivateData = (PEI_FAT_PRIVATE_DATA *) (UINTN) Address; - - // - // Initialize Private Data (to zero, as is required by subsequent operations) - // - ZeroMem ((UINT8 *) PrivateData, sizeof (PEI_FAT_PRIVATE_DATA)); - - PrivateData->Signature = PEI_FAT_PRIVATE_DATA_SIGNATURE; - - // - // Installs Ppi - // - PrivateData->DeviceRecoveryPpi.GetNumberRecoveryCapsules = GetNumberRecoveryCapsules; - PrivateData->DeviceRecoveryPpi.GetRecoveryCapsuleInfo = GetRecoveryCapsuleInfo; - PrivateData->DeviceRecoveryPpi.LoadRecoveryCapsule = LoadRecoveryCapsule; - - PrivateData->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); - PrivateData->PpiDescriptor.Guid = &gEfiPeiDeviceRecoveryModulePpiGuid; - PrivateData->PpiDescriptor.Ppi = &PrivateData->DeviceRecoveryPpi; - - Status = PeiServicesInstallPpi (&PrivateData->PpiDescriptor); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - // - // Other initializations - // - PrivateData->BlockDeviceCount = 0; - - UpdateBlocksAndVolumes (PrivateData, TRUE); - UpdateBlocksAndVolumes (PrivateData, FALSE); - - // - // PrivateData is allocated now, set it to the module variable - // - mPrivateData = PrivateData; - - // - // Installs Block Io Ppi notification function - // - PrivateData->NotifyDescriptor[0].Flags = - ( - EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK - ); - PrivateData->NotifyDescriptor[0].Guid = &gEfiPeiVirtualBlockIoPpiGuid; - PrivateData->NotifyDescriptor[0].Notify = BlockIoNotifyEntry; - PrivateData->NotifyDescriptor[1].Flags = - ( - EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | - EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST - ); - PrivateData->NotifyDescriptor[1].Guid = &gEfiPeiVirtualBlockIo2PpiGuid; - PrivateData->NotifyDescriptor[1].Notify = BlockIoNotifyEntry; - return PeiServicesNotifyPpi (&PrivateData->NotifyDescriptor[0]); -} - - -/** - Returns the number of DXE capsules residing on the device. - - This function searches for DXE capsules from the associated device and returns - the number and maximum size in bytes of the capsules discovered. Entry 1 is - assumed to be the highest load priority and entry N is assumed to be the lowest - priority. - - @param[in] PeiServices General-purpose services that are available - to every PEIM - @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI - instance. - @param[out] NumberRecoveryCapsules Pointer to a caller-allocated UINTN. On - output, *NumberRecoveryCapsules contains - the number of recovery capsule images - available for retrieval from this PEIM - instance. - - @retval EFI_SUCCESS One or more capsules were discovered. - @retval EFI_DEVICE_ERROR A device error occurred. - @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found. - -**/ -EFI_STATUS -EFIAPI -GetNumberRecoveryCapsules ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This, - OUT UINTN *NumberRecoveryCapsules - ) -{ - EFI_STATUS Status; - PEI_FAT_PRIVATE_DATA *PrivateData; - UINTN Index; - UINTN RecoveryCapsuleCount; - PEI_FILE_HANDLE Handle; - - PrivateData = PEI_FAT_PRIVATE_DATA_FROM_THIS (This); - - // - // Search each volume in the root directory for the Recovery capsule - // - RecoveryCapsuleCount = 0; - for (Index = 0; Index < PrivateData->VolumeCount; Index++) { - Status = FindRecoveryFile (PrivateData, Index, (CHAR16 *)PcdGetPtr(PcdRecoveryFileName), &Handle); - if (EFI_ERROR (Status)) { - continue; - } - - RecoveryCapsuleCount++; - } - - *NumberRecoveryCapsules = RecoveryCapsuleCount; - - if (*NumberRecoveryCapsules == 0) { - return EFI_NOT_FOUND; - } - - return EFI_SUCCESS; -} - - -/** - Returns the size and type of the requested recovery capsule. - - This function gets the size and type of the capsule specified by CapsuleInstance. - - @param[in] PeiServices General-purpose services that are available to every PEIM - @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI - instance. - @param[in] CapsuleInstance Specifies for which capsule instance to retrieve - the information. This parameter must be between - one and the value returned by GetNumberRecoveryCapsules() - in NumberRecoveryCapsules. - @param[out] Size A pointer to a caller-allocated UINTN in which - the size of the requested recovery module is - returned. - @param[out] CapsuleType A pointer to a caller-allocated EFI_GUID in which - the type of the requested recovery capsule is - returned. The semantic meaning of the value - returned is defined by the implementation. - - @retval EFI_SUCCESS One or more capsules were discovered. - @retval EFI_DEVICE_ERROR A device error occurred. - @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found. - -**/ -EFI_STATUS -EFIAPI -GetRecoveryCapsuleInfo ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This, - IN UINTN CapsuleInstance, - OUT UINTN *Size, - OUT EFI_GUID *CapsuleType - ) -{ - EFI_STATUS Status; - PEI_FAT_PRIVATE_DATA *PrivateData; - UINTN Index; - UINTN BlockDeviceNo; - UINTN RecoveryCapsuleCount; - PEI_FILE_HANDLE Handle; - UINTN NumberRecoveryCapsules; - - Status = GetNumberRecoveryCapsules (PeiServices, This, &NumberRecoveryCapsules); - - if (EFI_ERROR (Status)) { - return Status; - } - - if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) { - CapsuleInstance = CapsuleInstance + 1; - } - - if ((CapsuleInstance == 0) || (CapsuleInstance > NumberRecoveryCapsules)) { - return EFI_NOT_FOUND; - } - - PrivateData = PEI_FAT_PRIVATE_DATA_FROM_THIS (This); - - // - // Search each volume in the root directory for the Recovery capsule - // - RecoveryCapsuleCount = 0; - for (Index = 0; Index < PrivateData->VolumeCount; Index++) { - Status = FindRecoveryFile (PrivateData, Index, (CHAR16 *)PcdGetPtr(PcdRecoveryFileName), &Handle); - - if (EFI_ERROR (Status)) { - continue; - } - - if (CapsuleInstance - 1 == RecoveryCapsuleCount) { - // - // Get file size - // - *Size = (UINTN) (((PEI_FAT_FILE *) Handle)->FileSize); - - // - // Find corresponding physical block device - // - BlockDeviceNo = PrivateData->Volume[Index].BlockDeviceNo; - while (PrivateData->BlockDevice[BlockDeviceNo].Logical && BlockDeviceNo < PrivateData->BlockDeviceCount) { - BlockDeviceNo = PrivateData->BlockDevice[BlockDeviceNo].ParentDevNo; - } - // - // Fill in the Capsule Type GUID according to the block device type - // - if (BlockDeviceNo < PrivateData->BlockDeviceCount) { - if (PrivateData->BlockDevice[BlockDeviceNo].BlockIo2 != NULL) { - switch (PrivateData->BlockDevice[BlockDeviceNo].InterfaceType) { - case MSG_ATAPI_DP: - CopyGuid (CapsuleType, &gRecoveryOnFatIdeDiskGuid); - break; - - case MSG_USB_DP: - CopyGuid (CapsuleType, &gRecoveryOnFatUsbDiskGuid); - break; - - default: - break; - } - } - if (PrivateData->BlockDevice[BlockDeviceNo].BlockIo != NULL) { - switch (PrivateData->BlockDevice[BlockDeviceNo].DevType) { - case LegacyFloppy: - CopyGuid (CapsuleType, &gRecoveryOnFatFloppyDiskGuid); - break; - - case IdeCDROM: - case IdeLS120: - CopyGuid (CapsuleType, &gRecoveryOnFatIdeDiskGuid); - break; - - case UsbMassStorage: - CopyGuid (CapsuleType, &gRecoveryOnFatUsbDiskGuid); - break; - - default: - break; - } - } - } - - return EFI_SUCCESS; - } - - RecoveryCapsuleCount++; - } - - return EFI_NOT_FOUND; -} - - -/** - Loads a DXE capsule from some media into memory. - - This function, by whatever mechanism, retrieves a DXE capsule from some device - and loads it into memory. Note that the published interface is device neutral. - - @param[in] PeiServices General-purpose services that are available - to every PEIM - @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI - instance. - @param[in] CapsuleInstance Specifies which capsule instance to retrieve. - @param[out] Buffer Specifies a caller-allocated buffer in which - the requested recovery capsule will be returned. - - @retval EFI_SUCCESS The capsule was loaded correctly. - @retval EFI_DEVICE_ERROR A device error occurred. - @retval EFI_NOT_FOUND A requested recovery DXE capsule cannot be found. - -**/ -EFI_STATUS -EFIAPI -LoadRecoveryCapsule ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This, - IN UINTN CapsuleInstance, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - PEI_FAT_PRIVATE_DATA *PrivateData; - UINTN Index; - UINTN RecoveryCapsuleCount; - PEI_FILE_HANDLE Handle; - UINTN NumberRecoveryCapsules; - - Status = GetNumberRecoveryCapsules (PeiServices, This, &NumberRecoveryCapsules); - - if (EFI_ERROR (Status)) { - return Status; - } - - if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) { - CapsuleInstance = CapsuleInstance + 1; - } - - if ((CapsuleInstance == 0) || (CapsuleInstance > NumberRecoveryCapsules)) { - return EFI_NOT_FOUND; - } - - PrivateData = PEI_FAT_PRIVATE_DATA_FROM_THIS (This); - - // - // Search each volume in the root directory for the Recovery capsule - // - RecoveryCapsuleCount = 0; - for (Index = 0; Index < PrivateData->VolumeCount; Index++) { - Status = FindRecoveryFile (PrivateData, Index, (CHAR16 *)PcdGetPtr(PcdRecoveryFileName), &Handle); - if (EFI_ERROR (Status)) { - continue; - } - - if (CapsuleInstance - 1 == RecoveryCapsuleCount) { - - Status = FatReadFile ( - PrivateData, - Handle, - (UINTN) (((PEI_FAT_FILE *) Handle)->FileSize), - Buffer - ); - return Status; - } - - RecoveryCapsuleCount++; - } - - return EFI_NOT_FOUND; -} - - -/** - Finds the recovery file on a FAT volume. - This function finds the the recovery file named FileName on a specified FAT volume and returns - its FileHandle pointer. - - @param PrivateData Global memory map for accessing global - variables. - @param VolumeIndex The index of the volume. - @param FileName The recovery file name to find. - @param Handle The output file handle. - - @retval EFI_DEVICE_ERROR Some error occured when operating the FAT - volume. - @retval EFI_NOT_FOUND The recovery file was not found. - @retval EFI_SUCCESS The recovery file was successfully found on the - FAT volume. - -**/ -EFI_STATUS -FindRecoveryFile ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN VolumeIndex, - IN CHAR16 *FileName, - OUT PEI_FILE_HANDLE *Handle - ) -{ - EFI_STATUS Status; - PEI_FAT_FILE Parent; - PEI_FAT_FILE *File; - - File = &PrivateData->File; - - // - // VolumeIndex must be less than PEI_FAT_MAX_VOLUME because PrivateData->VolumeCount - // cannot be larger than PEI_FAT_MAX_VOLUME when detecting recovery volume. - // - ASSERT (VolumeIndex < PEI_FAT_MAX_VOLUME); - - // - // Construct root directory file - // - ZeroMem (&Parent, sizeof (PEI_FAT_FILE)); - Parent.IsFixedRootDir = (BOOLEAN) ((PrivateData->Volume[VolumeIndex].FatType == Fat32) ? FALSE : TRUE); - Parent.Attributes = FAT_ATTR_DIRECTORY; - Parent.CurrentPos = 0; - Parent.CurrentCluster = Parent.IsFixedRootDir ? 0 : PrivateData->Volume[VolumeIndex].RootDirCluster; - Parent.StartingCluster = Parent.CurrentCluster; - Parent.Volume = &PrivateData->Volume[VolumeIndex]; - - Status = FatSetFilePos (PrivateData, &Parent, 0); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - // - // Search for recovery capsule in root directory - // - Status = FatReadNextDirectoryEntry (PrivateData, &Parent, File); - while (Status == EFI_SUCCESS) { - // - // Compare whether the file name is recovery file name. - // - if (EngStriColl (PrivateData, FileName, File->FileName)) { - break; - } - - Status = FatReadNextDirectoryEntry (PrivateData, &Parent, File); - } - - if (EFI_ERROR (Status)) { - return EFI_NOT_FOUND; - } - - // - // Get the recovery file, set its file position to 0. - // - if (File->StartingCluster != 0) { - Status = FatSetFilePos (PrivateData, File, 0); - } - - *Handle = File; - - return EFI_SUCCESS; - -} diff --git a/FatPkg/FatPei/FatLiteApi.h b/FatPkg/FatPei/FatLiteApi.h deleted file mode 100644 index d1ad277f98..0000000000 --- a/FatPkg/FatPei/FatLiteApi.h +++ /dev/null @@ -1,31 +0,0 @@ -/** @file - Definitions for FAT recovery PEIM API functions - -Copyright (c) 2006 - 2010, Intel Corporation. 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 _FAT_API_H_ -#define _FAT_API_H_ - -// -// API data structures -// -typedef VOID *PEI_FILE_HANDLE; - -typedef enum { - Fat12, - Fat16, - Fat32, - FatUnknown -} PEI_FAT_TYPE; - -#endif diff --git a/FatPkg/FatPei/FatLiteFmt.h b/FatPkg/FatPei/FatLiteFmt.h deleted file mode 100644 index 9872200090..0000000000 --- a/FatPkg/FatPei/FatLiteFmt.h +++ /dev/null @@ -1,144 +0,0 @@ -/** @file - FAT format data structures - -Copyright (c) 2006 - 2017, Intel Corporation. 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 _FAT_FMT_H_ -#define _FAT_FMT_H_ - -// -// Definitions -// -#define FAT_ATTR_READ_ONLY 0x01 -#define FAT_ATTR_HIDDEN 0x02 -#define FAT_ATTR_SYSTEM 0x04 -#define FAT_ATTR_VOLUME_ID 0x08 -#define FAT_ATTR_DIRECTORY 0x10 -#define FAT_ATTR_ARCHIVE 0x20 -#define FAT_ATTR_LFN (FAT_ATTR_READ_ONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLUME_ID) - -#define FAT_CLUSTER_SPECIAL ((MAX_UINT32 &~0xF) | 0x7) -#define FAT_CLUSTER_FREE 0 -#define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL) -#define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL) -#define FAT_CLUSTER_LAST (-1) - -#define DELETE_ENTRY_MARK 0xE5 -#define EMPTY_ENTRY_MARK 0x00 - -#define FAT_CLUSTER_FUNCTIONAL(Cluster) (((Cluster) == 0) || ((Cluster) >= FAT_CLUSTER_SPECIAL)) -#define FAT_CLUSTER_END_OF_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL)) - -// -// Directory Entry -// -#pragma pack(1) - -typedef struct { - UINT16 Day : 5; - UINT16 Month : 4; - UINT16 Year : 7; // From 1980 -} FAT_DATE; - -typedef struct { - UINT16 DoubleSecond : 5; - UINT16 Minute : 6; - UINT16 Hour : 5; -} FAT_TIME; - -typedef struct { - FAT_TIME Time; - FAT_DATE Date; -} FAT_DATE_TIME; - -typedef struct { - CHAR8 FileName[11]; // 8.3 filename - UINT8 Attributes; - UINT8 CaseFlag; - UINT8 CreateMillisecond; // (creation milliseconds - ignored) - FAT_DATE_TIME FileCreateTime; - FAT_DATE FileLastAccess; - UINT16 FileClusterHigh; // >= FAT32 - FAT_DATE_TIME FileModificationTime; - UINT16 FileCluster; - UINT32 FileSize; -} FAT_DIRECTORY_ENTRY; - -#pragma pack() -// -// Boot Sector -// -#pragma pack(1) - -typedef struct { - - UINT8 Ia32Jump[3]; - CHAR8 OemId[8]; - - UINT16 SectorSize; - UINT8 SectorsPerCluster; - UINT16 ReservedSectors; - UINT8 NoFats; - UINT16 RootEntries; // < FAT32, root dir is fixed size - UINT16 Sectors; - UINT8 Media; // (ignored) - UINT16 SectorsPerFat; // < FAT32 - UINT16 SectorsPerTrack; // (ignored) - UINT16 Heads; // (ignored) - UINT32 HiddenSectors; // (ignored) - UINT32 LargeSectors; // => FAT32 - UINT8 PhysicalDriveNumber; // (ignored) - UINT8 CurrentHead; // holds boot_sector_dirty bit - UINT8 Signature; // (ignored) - CHAR8 Id[4]; - CHAR8 FatLabel[11]; - CHAR8 SystemId[8]; - -} PEI_FAT_BOOT_SECTOR; - -typedef struct { - - UINT8 Ia32Jump[3]; - CHAR8 OemId[8]; - - UINT16 SectorSize; - UINT8 SectorsPerCluster; - UINT16 ReservedSectors; - UINT8 NoFats; - UINT16 RootEntries; // < FAT32, root dir is fixed size - UINT16 Sectors; - UINT8 Media; // (ignored) - UINT16 SectorsPerFat; // < FAT32 - UINT16 SectorsPerTrack; // (ignored) - UINT16 Heads; // (ignored) - UINT32 HiddenSectors; // (ignored) - UINT32 LargeSectors; // Used if Sectors==0 - UINT32 LargeSectorsPerFat; // FAT32 - UINT16 ExtendedFlags; // FAT32 (ignored) - UINT16 FsVersion; // FAT32 (ignored) - UINT32 RootDirFirstCluster; // FAT32 - UINT16 FsInfoSector; // FAT32 - UINT16 BackupBootSector; // FAT32 - UINT8 Reserved[12]; // FAT32 (ignored) - UINT8 PhysicalDriveNumber; // (ignored) - UINT8 CurrentHead; // holds boot_sector_dirty bit - UINT8 Signature; // (ignored) - CHAR8 Id[4]; - CHAR8 FatLabel[11]; - CHAR8 SystemId[8]; - -} PEI_FAT_BOOT_SECTOR_EX; - -#pragma pack() - -#endif diff --git a/FatPkg/FatPei/FatLiteLib.c b/FatPkg/FatPei/FatLiteLib.c deleted file mode 100644 index 109789a54b..0000000000 --- a/FatPkg/FatPei/FatLiteLib.c +++ /dev/null @@ -1,376 +0,0 @@ -/** @file - General purpose supporting routines for FAT recovery PEIM - -Copyright (c) 2006 - 2015, Intel Corporation. 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 "FatLitePeim.h" - - -#define CHAR_FAT_VALID 0x01 - - -/** - Converts a union code character to upper case. - This functions converts a unicode character to upper case. - If the input Letter is not a lower-cased letter, - the original value is returned. - - @param Letter The input unicode character. - - @return The upper cased letter. - -**/ -CHAR16 -ToUpper ( - IN CHAR16 Letter - ) -{ - if ('a' <= Letter && Letter <= 'z') { - Letter = (CHAR16) (Letter - 0x20); - } - - return Letter; -} - - -/** - Reads a block of data from the block device by calling - underlying Block I/O service. - - @param PrivateData Global memory map for accessing global variables - @param BlockDeviceNo The index for the block device number. - @param Lba The logic block address to read data from. - @param BufferSize The size of data in byte to read. - @param Buffer The buffer of the - - @retval EFI_DEVICE_ERROR The specified block device number exceeds the maximum - device number. - @retval EFI_DEVICE_ERROR The maximum address has exceeded the maximum address - of the block device. - -**/ -EFI_STATUS -FatReadBlock ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN BlockDeviceNo, - IN EFI_PEI_LBA Lba, - IN UINTN BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - PEI_FAT_BLOCK_DEVICE *BlockDev; - - if (BlockDeviceNo > PEI_FAT_MAX_BLOCK_DEVICE - 1) { - return EFI_DEVICE_ERROR; - } - - Status = EFI_SUCCESS; - BlockDev = &(PrivateData->BlockDevice[BlockDeviceNo]); - - if (BufferSize > MultU64x32 (BlockDev->LastBlock - Lba + 1, BlockDev->BlockSize)) { - return EFI_DEVICE_ERROR; - } - - if (!BlockDev->Logical) { - // - // Status = BlockDev->ReadFunc - // (PrivateData->PeiServices, BlockDev->PhysicalDevNo, Lba, BufferSize, Buffer); - // - if (BlockDev->BlockIo2 != NULL) { - Status = BlockDev->BlockIo2->ReadBlocks ( - (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (), - BlockDev->BlockIo2, - BlockDev->PhysicalDevNo, - Lba, - BufferSize, - Buffer - ); - } else { - Status = BlockDev->BlockIo->ReadBlocks ( - (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (), - BlockDev->BlockIo, - BlockDev->PhysicalDevNo, - Lba, - BufferSize, - Buffer - ); - } - - } else { - Status = FatReadDisk ( - PrivateData, - BlockDev->ParentDevNo, - BlockDev->StartingPos + MultU64x32 (Lba, BlockDev->BlockSize), - BufferSize, - Buffer - ); - } - - return Status; -} - - -/** - Find a cache block designated to specific Block device and Lba. - If not found, invalidate an oldest one and use it. (LRU cache) - - @param PrivateData the global memory map. - @param BlockDeviceNo the Block device. - @param Lba the Logical Block Address - @param CachePtr Ptr to the starting address of the memory holding the - data; - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatGetCacheBlock ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN BlockDeviceNo, - IN UINT64 Lba, - OUT CHAR8 **CachePtr - ) -{ - EFI_STATUS Status; - PEI_FAT_CACHE_BUFFER *CacheBuffer; - INTN Index; - STATIC UINT8 Seed; - - Status = EFI_SUCCESS; - CacheBuffer = NULL; - - // - // go through existing cache buffers - // - for (Index = 0; Index < PEI_FAT_CACHE_SIZE; Index++) { - CacheBuffer = &(PrivateData->CacheBuffer[Index]); - if (CacheBuffer->Valid && CacheBuffer->BlockDeviceNo == BlockDeviceNo && CacheBuffer->Lba == Lba) { - break; - } - } - - if (Index < PEI_FAT_CACHE_SIZE) { - *CachePtr = (CHAR8 *) CacheBuffer->Buffer; - return EFI_SUCCESS; - } - // - // We have to find an invalid cache buffer - // - for (Index = 0; Index < PEI_FAT_CACHE_SIZE; Index++) { - if (!PrivateData->CacheBuffer[Index].Valid) { - break; - } - } - // - // Use the cache buffer - // - if (Index == PEI_FAT_CACHE_SIZE) { - Index = (Seed++) % PEI_FAT_CACHE_SIZE; - } - - // - // Current device ID should be less than maximum device ID. - // - if (BlockDeviceNo >= PEI_FAT_MAX_BLOCK_DEVICE) { - return EFI_DEVICE_ERROR; - } - - CacheBuffer = &(PrivateData->CacheBuffer[Index]); - - CacheBuffer->BlockDeviceNo = BlockDeviceNo; - CacheBuffer->Lba = Lba; - CacheBuffer->Size = PrivateData->BlockDevice[BlockDeviceNo].BlockSize; - - // - // Read in the data - // - Status = FatReadBlock ( - PrivateData, - BlockDeviceNo, - Lba, - CacheBuffer->Size, - CacheBuffer->Buffer - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - CacheBuffer->Valid = TRUE; - *CachePtr = (CHAR8 *) CacheBuffer->Buffer; - - return Status; -} - - -/** - Disk reading. - - @param PrivateData the global memory map; - @param BlockDeviceNo the block device to read; - @param StartingAddress the starting address. - @param Size the amount of data to read. - @param Buffer the buffer holding the data - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_DEVICE_ERROR Something error. - -**/ -EFI_STATUS -FatReadDisk ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN BlockDeviceNo, - IN UINT64 StartingAddress, - IN UINTN Size, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - UINT32 BlockSize; - CHAR8 *BufferPtr; - CHAR8 *CachePtr; - UINT32 Offset; - UINT64 Lba; - UINT64 OverRunLba; - UINTN Amount; - - Status = EFI_SUCCESS; - BufferPtr = Buffer; - BlockSize = PrivateData->BlockDevice[BlockDeviceNo].BlockSize; - - // - // Read underrun - // - Lba = DivU64x32Remainder (StartingAddress, BlockSize, &Offset); - Status = FatGetCacheBlock (PrivateData, BlockDeviceNo, Lba, &CachePtr); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Amount = Size < (BlockSize - Offset) ? Size : (BlockSize - Offset); - CopyMem (BufferPtr, CachePtr + Offset, Amount); - - if (Size == Amount) { - return EFI_SUCCESS; - } - - Size -= Amount; - BufferPtr += Amount; - StartingAddress += Amount; - Lba += 1; - - // - // Read aligned parts - // - OverRunLba = Lba + DivU64x32Remainder (Size, BlockSize, &Offset); - - Size -= Offset; - Status = FatReadBlock (PrivateData, BlockDeviceNo, Lba, Size, BufferPtr); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - BufferPtr += Size; - - // - // Read overrun - // - if (Offset != 0) { - Status = FatGetCacheBlock (PrivateData, BlockDeviceNo, OverRunLba, &CachePtr); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - CopyMem (BufferPtr, CachePtr, Offset); - } - - return Status; -} - - -/** - This version is different from the version in Unicode collation - protocol in that this version strips off trailing blanks. - Converts an 8.3 FAT file name using an OEM character set - to a Null-terminated Unicode string. - Here does not expand DBCS FAT chars. - - @param FatSize The size of the string Fat in bytes. - @param Fat A pointer to a Null-terminated string that contains - an 8.3 file name using an OEM character set. - @param Str A pointer to a Null-terminated Unicode string. The - string must be allocated in advance to hold FatSize - Unicode characters - -**/ -VOID -EngFatToStr ( - IN UINTN FatSize, - IN CHAR8 *Fat, - OUT CHAR16 *Str - ) -{ - CHAR16 *String; - - String = Str; - // - // No DBCS issues, just expand and add null terminate to end of string - // - while (*Fat != 0 && FatSize != 0) { - if (*Fat == ' ') { - break; - } - *String = *Fat; - String += 1; - Fat += 1; - FatSize -= 1; - } - - *String = 0; -} - - -/** - Performs a case-insensitive comparison of two Null-terminated Unicode strings. - - @param PrivateData Global memory map for accessing global variables - @param Str1 First string to perform case insensitive comparison. - @param Str2 Second string to perform case insensitive comparison. - -**/ -BOOLEAN -EngStriColl ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN CHAR16 *Str1, - IN CHAR16 *Str2 - ) -{ - CHAR16 UpperS1; - CHAR16 UpperS2; - - UpperS1 = ToUpper (*Str1); - UpperS2 = ToUpper (*Str2); - while (*Str1 != 0) { - if (UpperS1 != UpperS2) { - return FALSE; - } - - Str1++; - Str2++; - UpperS1 = ToUpper (*Str1); - UpperS2 = ToUpper (*Str2); - } - - return (BOOLEAN) ((*Str2 != 0) ? FALSE : TRUE); -} diff --git a/FatPkg/FatPei/FatLitePeim.h b/FatPkg/FatPei/FatLitePeim.h deleted file mode 100644 index d343d88f7e..0000000000 --- a/FatPkg/FatPei/FatLitePeim.h +++ /dev/null @@ -1,527 +0,0 @@ -/** @file - Data structures for FAT recovery PEIM - -Copyright (c) 2006 - 2016, Intel Corporation. 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 _FAT_PEIM_H_ -#define _FAT_PEIM_H_ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "FatLiteApi.h" -#include "FatLiteFmt.h" - -// -// Definitions -// - -#define PEI_FAT_CACHE_SIZE 4 -#define PEI_FAT_MAX_BLOCK_SIZE 8192 -#define FAT_MAX_FILE_NAME_LENGTH 128 -#define PEI_FAT_MAX_BLOCK_DEVICE 64 -#define PEI_FAT_MAX_BLOCK_IO_PPI 32 -#define PEI_FAT_MAX_VOLUME 64 - -#define PEI_FAT_MEMMORY_PAGE_SIZE 0x1000 - -// -// Data Structures -// -// -// The block device -// -typedef struct { - - UINT32 BlockSize; - UINT64 LastBlock; - UINT32 IoAlign; - BOOLEAN Logical; - BOOLEAN PartitionChecked; - - // - // Following fields only valid for logical device - // - CHAR8 PartitionFlag[8]; - UINT64 StartingPos; - UINTN ParentDevNo; - - // - // Following fields only valid for physical device - // - EFI_PEI_BLOCK_DEVICE_TYPE DevType; - UINT8 InterfaceType; - // - // EFI_PEI_READ_BLOCKS ReadFunc; - // - EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIo; - EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2; - UINT8 PhysicalDevNo; -} PEI_FAT_BLOCK_DEVICE; - -// -// the Volume structure -// -typedef struct { - - UINTN BlockDeviceNo; - UINTN VolumeNo; - UINT64 VolumeSize; - UINTN MaxCluster; - CHAR16 VolumeLabel[FAT_MAX_FILE_NAME_LENGTH]; - PEI_FAT_TYPE FatType; - UINT64 FatPos; - UINT32 SectorSize; - UINT32 ClusterSize; - UINT64 FirstClusterPos; - UINT64 RootDirPos; - UINT32 RootEntries; - UINT32 RootDirCluster; - -} PEI_FAT_VOLUME; - -// -// File instance -// -typedef struct { - - PEI_FAT_VOLUME *Volume; - CHAR16 FileName[FAT_MAX_FILE_NAME_LENGTH]; - - BOOLEAN IsFixedRootDir; - - UINT32 StartingCluster; - UINT32 CurrentPos; - UINT32 StraightReadAmount; - UINT32 CurrentCluster; - - UINT8 Attributes; - UINT32 FileSize; - -} PEI_FAT_FILE; - -// -// Cache Buffer -// -typedef struct { - - BOOLEAN Valid; - UINTN BlockDeviceNo; - UINT64 Lba; - UINT32 Lru; - UINT64 Buffer[PEI_FAT_MAX_BLOCK_SIZE / 8]; - UINTN Size; - -} PEI_FAT_CACHE_BUFFER; - -// -// Private Data. -// This structure abstracts the whole memory usage in FAT PEIM. -// The entry point routine will get a chunk of memory (by whatever -// means) whose size is sizeof(PEI_FAT_PRIVATE_DATA), which is clean -// in both 32 and 64 bit environment. The boundary of the memory chunk -// should be 64bit aligned. -// -#define PEI_FAT_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 'f', 'a', 't') - -typedef struct { - - UINTN Signature; - EFI_PEI_DEVICE_RECOVERY_MODULE_PPI DeviceRecoveryPpi; - EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; - EFI_PEI_NOTIFY_DESCRIPTOR NotifyDescriptor[2]; - - UINT8 UnicodeCaseMap[0x300]; - CHAR8 *EngUpperMap; - CHAR8 *EngLowerMap; - CHAR8 *EngInfoMap; - - UINT64 BlockData[PEI_FAT_MAX_BLOCK_SIZE / 8]; - UINTN BlockDeviceCount; - PEI_FAT_BLOCK_DEVICE BlockDevice[PEI_FAT_MAX_BLOCK_DEVICE]; - UINTN VolumeCount; - PEI_FAT_VOLUME Volume[PEI_FAT_MAX_VOLUME]; - PEI_FAT_FILE File; - PEI_FAT_CACHE_BUFFER CacheBuffer[PEI_FAT_CACHE_SIZE]; - -} PEI_FAT_PRIVATE_DATA; - -#define PEI_FAT_PRIVATE_DATA_FROM_THIS(a) \ - CR (a, PEI_FAT_PRIVATE_DATA, DeviceRecoveryPpi, PEI_FAT_PRIVATE_DATA_SIGNATURE) - -// -// Extract INT32 from char array -// -#define UNPACK_INT32(a) \ - (INT32) ((((UINT8 *) a)[0] << 0) | (((UINT8 *) a)[1] << 8) | (((UINT8 *) a)[2] << 16) | (((UINT8 *) a)[3] << 24)) - -// -// Extract UINT32 from char array -// -#define UNPACK_UINT32(a) \ - (UINT32) ((((UINT8 *) a)[0] << 0) | (((UINT8 *) a)[1] << 8) | (((UINT8 *) a)[2] << 16) | (((UINT8 *) a)[3] << 24)) - - -// -// API functions -// - -/** - Finds the recovery file on a FAT volume. - This function finds the the recovery file named FileName on a specified FAT volume and returns - its FileHandle pointer. - - @param PrivateData Global memory map for accessing global - variables. - @param VolumeIndex The index of the volume. - @param FileName The recovery file name to find. - @param Handle The output file handle. - - @retval EFI_DEVICE_ERROR Some error occured when operating the FAT - volume. - @retval EFI_NOT_FOUND The recovery file was not found. - @retval EFI_SUCCESS The recovery file was successfully found on the - FAT volume. - -**/ -EFI_STATUS -FindRecoveryFile ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN VolumeIndex, - IN CHAR16 *FileName, - OUT PEI_FILE_HANDLE *Handle - ); - - -/** - Returns the number of DXE capsules residing on the device. - This function, by whatever mechanism, searches for DXE capsules from the associated device and - returns the number and maximum size in bytes of the capsules discovered.Entry 1 is assumed to be - the highest load priority and entry N is assumed to be the lowest priority. - - @param PeiServices General-purpose services that are available to - every PEIM. - @param This Indicates the - EFI_PEI_DEVICE_RECOVERY_MODULE_PPI instance. - @param NumberRecoveryCapsules Pointer to a caller-allocated UINTN.On output, - *NumberRecoveryCapsules contains the number of - recovery capsule images available for retrieval - from this PEIM instance. - - @retval EFI_SUCCESS The function completed successfully. - -**/ -EFI_STATUS -EFIAPI -GetNumberRecoveryCapsules ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This, - OUT UINTN *NumberRecoveryCapsules - ); - - -/** - Returns the size and type of the requested recovery capsule. - This function returns the size and type of the capsule specified by CapsuleInstance. - - @param PeiServices General-purpose services that are available to - every PEIM. - @param This Indicates the - EFI_PEI_DEVICE_RECOVERY_MODULE_PPI instance. - @param CapsuleInstance Specifies for which capsule instance to - retrieve the information.T his parameter must - be between one and the value returned by - GetNumberRecoveryCapsules() in - NumberRecoveryCapsules. - @param Size A pointer to a caller-allocated UINTN in which - the size of the requested recovery module is - returned. - @param CapsuleType A pointer to a caller-allocated EFI_GUID in - which the type of the requested recovery - capsule is returned.T he semantic meaning of - the value returned is defined by the - implementation. - - @retval EFI_SUCCESS The capsule type and size were retrieved. - @retval EFI_INVALID_PARAMETER The input CapsuleInstance does not match any - discovered recovery capsule. - -**/ -EFI_STATUS -EFIAPI -GetRecoveryCapsuleInfo ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This, - IN UINTN CapsuleInstance, - OUT UINTN *Size, - OUT EFI_GUID *CapsuleType - ); - - -/** - Loads a DXE capsule from some media into memory. - - This function, by whatever mechanism, retrieves a DXE capsule from some device - and loads it into memory. Note that the published interface is device neutral. - - @param[in] PeiServices General-purpose services that are available - to every PEIM - @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI - instance. - @param[in] CapsuleInstance Specifies which capsule instance to retrieve. - @param[out] Buffer Specifies a caller-allocated buffer in which - the requested recovery capsule will be returned. - - @retval EFI_SUCCESS The capsule was loaded correctly. - @retval EFI_DEVICE_ERROR A device error occurred. - @retval EFI_NOT_FOUND A requested recovery DXE capsule cannot be found. - -**/ -EFI_STATUS -EFIAPI -LoadRecoveryCapsule ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This, - IN UINTN CapsuleInstance, - OUT VOID *Buffer - ); - - -/** - This version is different from the version in Unicode collation - protocol in that this version strips off trailing blanks. - Converts an 8.3 FAT file name using an OEM character set - to a Null-terminated Unicode string. - Here does not expand DBCS FAT chars. - - @param FatSize The size of the string Fat in bytes. - @param Fat A pointer to a Null-terminated string that contains - an 8.3 file name using an OEM character set. - @param Str A pointer to a Null-terminated Unicode string. The - string must be allocated in advance to hold FatSize - Unicode characters - -**/ -VOID -EngFatToStr ( - IN UINTN FatSize, - IN CHAR8 *Fat, - OUT CHAR16 *Str - ); - - -/** - Performs a case-insensitive comparison of two Null-terminated Unicode strings. - - @param PrivateData Global memory map for accessing global variables - @param Str1 First string to perform case insensitive comparison. - @param Str2 Second string to perform case insensitive comparison. - -**/ -BOOLEAN -EngStriColl ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN CHAR16 *Str1, - IN CHAR16 *Str2 - ); - - -/** - Reads a block of data from the block device by calling - underlying Block I/O service. - - @param PrivateData Global memory map for accessing global variables - @param BlockDeviceNo The index for the block device number. - @param Lba The logic block address to read data from. - @param BufferSize The size of data in byte to read. - @param Buffer The buffer of the - - @retval EFI_DEVICE_ERROR The specified block device number exceeds the maximum - device number. - @retval EFI_DEVICE_ERROR The maximum address has exceeded the maximum address - of the block device. - -**/ -EFI_STATUS -FatReadBlock ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN BlockDeviceNo, - IN EFI_PEI_LBA Lba, - IN UINTN BufferSize, - OUT VOID *Buffer - ); - - -/** - Check if there is a valid FAT in the corresponding Block device - of the volume and if yes, fill in the relevant fields for the - volume structure. Note there should be a valid Block device number - already set. - - @param PrivateData Global memory map for accessing global - variables. - @param Volume On input, the BlockDeviceNumber field of the - Volume should be a valid value. On successful - output, all fields except the VolumeNumber - field is initialized. - - @retval EFI_SUCCESS A FAT is found and the volume structure is - initialized. - @retval EFI_NOT_FOUND There is no FAT on the corresponding device. - @retval EFI_DEVICE_ERROR There is something error while accessing device. - -**/ -EFI_STATUS -FatGetBpbInfo ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN OUT PEI_FAT_VOLUME *Volume - ); - - -/** - Gets the next cluster in the cluster chain. - - @param PrivateData Global memory map for accessing global variables - @param Volume The volume - @param Cluster The cluster - @param NextCluster The cluster number of the next cluster - - @retval EFI_SUCCESS The address is got - @retval EFI_INVALID_PARAMETER ClusterNo exceeds the MaxCluster of the volume. - @retval EFI_DEVICE_ERROR Read disk error - -**/ -EFI_STATUS -FatGetNextCluster ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_VOLUME *Volume, - IN UINT32 Cluster, - OUT UINT32 *NextCluster - ); - - -/** - Disk reading. - - @param PrivateData the global memory map; - @param BlockDeviceNo the block device to read; - @param StartingAddress the starting address. - @param Size the amount of data to read. - @param Buffer the buffer holding the data - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_DEVICE_ERROR Something error. - -**/ -EFI_STATUS -FatReadDisk ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN BlockDeviceNo, - IN UINT64 StartingAddress, - IN UINTN Size, - OUT VOID *Buffer - ); - - -/** - Set a file's CurrentPos and CurrentCluster, then compute StraightReadAmount. - - @param PrivateData the global memory map - @param File the file - @param Pos the Position which is offset from the file's - CurrentPos - - @retval EFI_SUCCESS Success. - @retval EFI_INVALID_PARAMETER Pos is beyond file's size. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatSetFilePos ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_FILE *File, - IN UINT32 Pos - ); - - -/** - Reads file data. Updates the file's CurrentPos. - - @param PrivateData Global memory map for accessing global variables - @param File The file. - @param Size The amount of data to read. - @param Buffer The buffer storing the data. - - @retval EFI_SUCCESS The data is read. - @retval EFI_INVALID_PARAMETER File is invalid. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatReadFile ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_FILE *File, - IN UINTN Size, - OUT VOID *Buffer - ); - - -/** - This function reads the next item in the parent directory and - initializes the output parameter SubFile (CurrentPos is initialized to 0). - The function updates the CurrentPos of the parent dir to after the item read. - If no more items were found, the function returns EFI_NOT_FOUND. - - @param PrivateData Global memory map for accessing global variables - @param ParentDir The parent directory. - @param SubFile The File structure containing the sub file that - is caught. - - @retval EFI_SUCCESS The next sub file is obtained. - @retval EFI_INVALID_PARAMETER The ParentDir is not a directory. - @retval EFI_NOT_FOUND No more sub file exists. - @retval EFI_DEVICE_ERROR Something error while accessing media. - -**/ -EFI_STATUS -FatReadNextDirectoryEntry ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN PEI_FAT_FILE *ParentDir, - OUT PEI_FAT_FILE *SubFile - ); - - -/** - This function finds partitions (logical devices) in physical block devices. - - @param PrivateData Global memory map for accessing global variables. - -**/ -VOID -FatFindPartitions ( - IN PEI_FAT_PRIVATE_DATA *PrivateData - ); - -#endif // _FAT_PEIM_H_ diff --git a/FatPkg/FatPei/FatPei.inf b/FatPkg/FatPei/FatPei.inf deleted file mode 100644 index 273f72da2f..0000000000 --- a/FatPkg/FatPei/FatPei.inf +++ /dev/null @@ -1,79 +0,0 @@ -## @file -# Lite Fat driver only used in Pei Phase. -# -# Copyright (c) 2006 - 2016, Intel Corporation. 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 = FatPei - MODULE_UNI_FILE = FatPei.uni - FILE_GUID = 5B60CCFD-1011-4BCF-B7D1-BB99CA96A603 - MODULE_TYPE = PEIM - VERSION_STRING = 1.0 - - ENTRY_POINT = FatPeimEntry - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# - -[Sources] - Part.c - FatLiteApi.c - FatLiteLib.c - FatLiteAccess.c - FatLiteApi.h - FatLitePeim.h - FatLiteFmt.h - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - - -[LibraryClasses] - PcdLib - BaseMemoryLib - PeimEntryPoint - BaseLib - DebugLib - PeiServicesTablePointerLib - PeiServicesLib - - -[Guids] - gRecoveryOnFatUsbDiskGuid ## SOMETIMES_CONSUMES ## UNDEFINED - gRecoveryOnFatIdeDiskGuid ## SOMETIMES_CONSUMES ## UNDEFINED - gRecoveryOnFatFloppyDiskGuid ## SOMETIMES_CONSUMES ## UNDEFINED - - -[Ppis] - gEfiPeiVirtualBlockIoPpiGuid ## SOMETIMES_CONSUMES PPI_NOTIFY - gEfiPeiVirtualBlockIo2PpiGuid ## SOMETIMES_CONSUMES PPI_NOTIFY - gEfiPeiDeviceRecoveryModulePpiGuid ## SOMETIMES_PRODUCES - - -[FeaturePcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport ## CONSUMES - -[Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdRecoveryFileName ## CONSUMES - -[Depex] - gEfiPeiMemoryDiscoveredPpiGuid AND gEfiPeiBootInRecoveryModePpiGuid - -[UserExtensions.TianoCore."ExtraFiles"] - FatPeiExtra.uni diff --git a/FatPkg/FatPei/FatPei.uni b/FatPkg/FatPei/FatPei.uni deleted file mode 100644 index 2f3dcc70d8..0000000000 --- a/FatPkg/FatPei/FatPei.uni +++ /dev/null @@ -1,22 +0,0 @@ -// /** @file -// Lite Fat driver only used in Pei Phase. -// -// Lite Fat driver only used in Pei Phase. -// -// Copyright (c) 2006 - 2014, Intel Corporation. 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. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Lite Fat driver only used in Pei Phase." - -#string STR_MODULE_DESCRIPTION #language en-US "Lite Fat driver only used in Pei Phase." - diff --git a/FatPkg/FatPei/FatPeiExtra.uni b/FatPkg/FatPei/FatPeiExtra.uni deleted file mode 100644 index 83a02f6ed3..0000000000 --- a/FatPkg/FatPei/FatPeiExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// FatPei Localized Strings and Content -// -// Copyright (c) 2013, Intel Corporation. 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. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"FAT File System Lite PEI Module" - - diff --git a/FatPkg/FatPei/Part.c b/FatPkg/FatPei/Part.c deleted file mode 100644 index 1c1b2896bf..0000000000 --- a/FatPkg/FatPei/Part.c +++ /dev/null @@ -1,466 +0,0 @@ -/** @file - Routines supporting partition discovery and - logical device reading - -Copyright (c) 2006 - 2008, Intel Corporation. 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 "FatLitePeim.h" - -/** - This function finds Eltorito partitions. Main algorithm - is ported from DXE partition driver. - - @param PrivateData The global memory map - @param ParentBlockDevNo The parent block device - - @retval TRUE New partitions are detected and logical block devices - are added to block device array - @retval FALSE No New partitions are added; - -**/ -BOOLEAN -FatFindEltoritoPartitions ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN ParentBlockDevNo - ); - -/** - This function finds Mbr partitions. Main algorithm - is ported from DXE partition driver. - - @param PrivateData The global memory map - @param ParentBlockDevNo The parent block device - - @retval TRUE New partitions are detected and logical block devices - are added to block device array - @retval FALSE No New partitions are added; - -**/ -BOOLEAN -FatFindMbrPartitions ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN ParentBlockDevNo - ); - - -/** - This function finds partitions (logical devices) in physical block devices. - - @param PrivateData Global memory map for accessing global variables. - -**/ -VOID -FatFindPartitions ( - IN PEI_FAT_PRIVATE_DATA *PrivateData - ) -{ - BOOLEAN Found; - UINTN Index; - - do { - Found = FALSE; - - for (Index = 0; Index < PrivateData->BlockDeviceCount; Index++) { - if (!PrivateData->BlockDevice[Index].PartitionChecked) { - Found = FatFindMbrPartitions (PrivateData, Index); - if (!Found) { - Found = FatFindEltoritoPartitions (PrivateData, Index); - } - } - } - } while (Found && PrivateData->BlockDeviceCount <= PEI_FAT_MAX_BLOCK_DEVICE); -} - - -/** - This function finds Eltorito partitions. Main algorithm - is ported from DXE partition driver. - - @param PrivateData The global memory map - @param ParentBlockDevNo The parent block device - - @retval TRUE New partitions are detected and logical block devices - are added to block device array - @retval FALSE No New partitions are added; - -**/ -BOOLEAN -FatFindEltoritoPartitions ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN ParentBlockDevNo - ) -{ - EFI_STATUS Status; - BOOLEAN Found; - PEI_FAT_BLOCK_DEVICE *BlockDev; - PEI_FAT_BLOCK_DEVICE *ParentBlockDev; - UINT32 VolDescriptorLba; - UINT32 Lba; - CDROM_VOLUME_DESCRIPTOR *VolDescriptor; - ELTORITO_CATALOG *Catalog; - UINTN Check; - UINTN Index; - UINTN MaxIndex; - UINT16 *CheckBuffer; - UINT32 SubBlockSize; - UINT32 SectorCount; - UINT32 VolSpaceSize; - - if (ParentBlockDevNo > PEI_FAT_MAX_BLOCK_DEVICE - 1) { - return FALSE; - } - - Found = FALSE; - ParentBlockDev = &(PrivateData->BlockDevice[ParentBlockDevNo]); - VolSpaceSize = 0; - - // - // CD_ROM has the fixed block size as 2048 bytes - // - if (ParentBlockDev->BlockSize != 2048) { - return FALSE; - } - - VolDescriptor = (CDROM_VOLUME_DESCRIPTOR *) PrivateData->BlockData; - Catalog = (ELTORITO_CATALOG *) VolDescriptor; - - // - // the ISO-9660 volume descriptor starts at 32k on the media - // and CD_ROM has the fixed block size as 2048 bytes, so... - // - VolDescriptorLba = 15; - // - // ((16*2048) / Media->BlockSize) - 1; - // - // Loop: handle one volume descriptor per time - // - while (TRUE) { - - VolDescriptorLba += 1; - if (VolDescriptorLba > ParentBlockDev->LastBlock) { - // - // We are pointing past the end of the device so exit - // - break; - } - - Status = FatReadBlock ( - PrivateData, - ParentBlockDevNo, - VolDescriptorLba, - ParentBlockDev->BlockSize, - VolDescriptor - ); - if (EFI_ERROR (Status)) { - break; - } - // - // Check for valid volume descriptor signature - // - if (VolDescriptor->Unknown.Type == CDVOL_TYPE_END || - CompareMem (VolDescriptor->Unknown.Id, CDVOL_ID, sizeof (VolDescriptor->Unknown.Id)) != 0 - ) { - // - // end of Volume descriptor list - // - break; - } - // - // Read the Volume Space Size from Primary Volume Descriptor 81-88 byte - // - if (VolDescriptor->Unknown.Type == CDVOL_TYPE_CODED) { - VolSpaceSize = VolDescriptor->PrimaryVolume.VolSpaceSize[1]; - } - // - // Is it an El Torito volume descriptor? - // - if (CompareMem ( - VolDescriptor->BootRecordVolume.SystemId, - CDVOL_ELTORITO_ID, - sizeof (CDVOL_ELTORITO_ID) - 1 - ) != 0) { - continue; - } - // - // Read in the boot El Torito boot catalog - // - Lba = UNPACK_INT32 (VolDescriptor->BootRecordVolume.EltCatalog); - if (Lba > ParentBlockDev->LastBlock) { - continue; - } - - Status = FatReadBlock ( - PrivateData, - ParentBlockDevNo, - Lba, - ParentBlockDev->BlockSize, - Catalog - ); - if (EFI_ERROR (Status)) { - continue; - } - // - // We don't care too much about the Catalog header's contents, but we do want - // to make sure it looks like a Catalog header - // - if (Catalog->Catalog.Indicator != ELTORITO_ID_CATALOG || Catalog->Catalog.Id55AA != 0xAA55) { - continue; - } - - Check = 0; - CheckBuffer = (UINT16 *) Catalog; - for (Index = 0; Index < sizeof (ELTORITO_CATALOG) / sizeof (UINT16); Index += 1) { - Check += CheckBuffer[Index]; - } - - if ((Check & 0xFFFF) != 0) { - continue; - } - - MaxIndex = ParentBlockDev->BlockSize / sizeof (ELTORITO_CATALOG); - for (Index = 1; Index < MaxIndex; Index += 1) { - // - // Next entry - // - Catalog += 1; - - // - // Check this entry - // - if (Catalog->Boot.Indicator != ELTORITO_ID_SECTION_BOOTABLE || Catalog->Boot.Lba == 0) { - continue; - } - - SubBlockSize = 512; - SectorCount = Catalog->Boot.SectorCount; - - switch (Catalog->Boot.MediaType) { - - case ELTORITO_NO_EMULATION: - SubBlockSize = ParentBlockDev->BlockSize; - SectorCount = Catalog->Boot.SectorCount; - break; - - case ELTORITO_HARD_DISK: - break; - - case ELTORITO_12_DISKETTE: - SectorCount = 0x50 * 0x02 * 0x0F; - break; - - case ELTORITO_14_DISKETTE: - SectorCount = 0x50 * 0x02 * 0x12; - break; - - case ELTORITO_28_DISKETTE: - SectorCount = 0x50 * 0x02 * 0x24; - break; - - default: - SectorCount = 0; - SubBlockSize = ParentBlockDev->BlockSize; - break; - } - - if (SectorCount < 2) { - SectorCount = (VolSpaceSize > ParentBlockDev->LastBlock + 1) ? (UINT32) (ParentBlockDev->LastBlock - Catalog->Boot.Lba + 1) : (UINT32) (VolSpaceSize - Catalog->Boot.Lba); - } - // - // Register this partition - // - if (PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE) { - - Found = TRUE; - - BlockDev = &(PrivateData->BlockDevice[PrivateData->BlockDeviceCount]); - - BlockDev->BlockSize = SubBlockSize; - BlockDev->LastBlock = SectorCount - 1; - BlockDev->IoAlign = ParentBlockDev->IoAlign; - BlockDev->Logical = TRUE; - BlockDev->PartitionChecked = FALSE; - BlockDev->StartingPos = MultU64x32 (Catalog->Boot.Lba, ParentBlockDev->BlockSize); - BlockDev->ParentDevNo = ParentBlockDevNo; - - PrivateData->BlockDeviceCount++; - } - } - } - - ParentBlockDev->PartitionChecked = TRUE; - - return Found; - -} - - -/** - Test to see if the Mbr buffer is a valid MBR - - @param Mbr Parent Handle - @param LastLba Last Lba address on the device. - - @retval TRUE Mbr is a Valid MBR - @retval FALSE Mbr is not a Valid MBR - -**/ -BOOLEAN -PartitionValidMbr ( - IN MASTER_BOOT_RECORD *Mbr, - IN EFI_PEI_LBA LastLba - ) -{ - UINT32 StartingLBA; - UINT32 EndingLBA; - UINT32 NewEndingLBA; - INTN Index1; - INTN Index2; - BOOLEAN MbrValid; - - if (Mbr->Signature != MBR_SIGNATURE) { - return FALSE; - } - // - // The BPB also has this signature, so it can not be used alone. - // - MbrValid = FALSE; - for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) { - if (Mbr->Partition[Index1].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) == 0) { - continue; - } - - MbrValid = TRUE; - StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA); - EndingLBA = StartingLBA + UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) - 1; - if (EndingLBA > LastLba) { - // - // Compatability Errata: - // Some systems try to hide drive space with thier INT 13h driver - // This does not hide space from the OS driver. This means the MBR - // that gets created from DOS is smaller than the MBR created from - // a real OS (NT & Win98). This leads to BlockIo->LastBlock being - // wrong on some systems FDISKed by the OS. - // - // return FALSE Because no block devices on a system are implemented - // with INT 13h - // - return FALSE; - } - - for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) { - if (Mbr->Partition[Index2].OSIndicator == 0x00 || UNPACK_INT32 (Mbr->Partition[Index2].SizeInLBA) == 0) { - continue; - } - - NewEndingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) + UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) - 1; - if (NewEndingLBA >= StartingLBA && UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) <= EndingLBA) { - // - // This region overlaps with the Index1'th region - // - return FALSE; - } - } - } - // - // Non of the regions overlapped so MBR is O.K. - // - return MbrValid; -} - - -/** - This function finds Mbr partitions. Main algorithm - is ported from DXE partition driver. - - @param PrivateData The global memory map - @param ParentBlockDevNo The parent block device - - @retval TRUE New partitions are detected and logical block devices - are added to block device array - @retval FALSE No New partitions are added; - -**/ -BOOLEAN -FatFindMbrPartitions ( - IN PEI_FAT_PRIVATE_DATA *PrivateData, - IN UINTN ParentBlockDevNo - ) -{ - EFI_STATUS Status; - MASTER_BOOT_RECORD *Mbr; - UINTN Index; - BOOLEAN Found; - PEI_FAT_BLOCK_DEVICE *ParentBlockDev; - PEI_FAT_BLOCK_DEVICE *BlockDev; - - if (ParentBlockDevNo > PEI_FAT_MAX_BLOCK_DEVICE - 1) { - return FALSE; - } - - ParentBlockDev = &(PrivateData->BlockDevice[ParentBlockDevNo]); - - Found = FALSE; - Mbr = (MASTER_BOOT_RECORD *) PrivateData->BlockData; - - Status = FatReadBlock ( - PrivateData, - ParentBlockDevNo, - 0, - ParentBlockDev->BlockSize, - Mbr - ); - - if (EFI_ERROR (Status) || !PartitionValidMbr (Mbr, ParentBlockDev->LastBlock)) { - goto Done; - } - // - // We have a valid mbr - add each partition - // - for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) { - if (Mbr->Partition[Index].OSIndicator == 0x00 || UNPACK_INT32 (Mbr->Partition[Index].SizeInLBA) == 0) { - // - // Don't use null MBR entries - // - continue; - } - // - // Register this partition - // - if (PrivateData->BlockDeviceCount < PEI_FAT_MAX_BLOCK_DEVICE) { - - Found = TRUE; - - BlockDev = &(PrivateData->BlockDevice[PrivateData->BlockDeviceCount]); - - BlockDev->BlockSize = MBR_SIZE; - BlockDev->LastBlock = UNPACK_INT32 (Mbr->Partition[Index].SizeInLBA) - 1; - BlockDev->IoAlign = ParentBlockDev->IoAlign; - BlockDev->Logical = TRUE; - BlockDev->PartitionChecked = FALSE; - BlockDev->StartingPos = MultU64x32 ( - UNPACK_INT32 (Mbr->Partition[Index].StartingLBA), - ParentBlockDev->BlockSize - ); - BlockDev->ParentDevNo = ParentBlockDevNo; - - PrivateData->BlockDeviceCount++; - } - } - -Done: - - ParentBlockDev->PartitionChecked = TRUE; - return Found; -} diff --git a/FatPkg/FatPkg.dec b/FatPkg/FatPkg.dec deleted file mode 100644 index 8bdddb1865..0000000000 --- a/FatPkg/FatPkg.dec +++ /dev/null @@ -1,25 +0,0 @@ -## @file -# FAT Package -# -# FAT 32 Driver -# Copyright (c) 2007 - 2014, Intel Corporation. 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] - DEC_SPECIFICATION = 0x00010005 - PACKAGE_NAME = FatPkg - PACKAGE_UNI_FILE = FatPkg.uni - PACKAGE_GUID = 8EA68A2C-99CB-4332-85C6-DD5864EAA674 - PACKAGE_VERSION = 0.3 - -[UserExtensions.TianoCore."ExtraFiles"] - FatPkgExtra.uni diff --git a/FatPkg/FatPkg.dsc b/FatPkg/FatPkg.dsc deleted file mode 100644 index 841201c245..0000000000 --- a/FatPkg/FatPkg.dsc +++ /dev/null @@ -1,87 +0,0 @@ -## @file -# Build Binary Enhanced Fat Driver Modules. -# -# This Platform file is used to generate the Binary Fat Drivers -# for EDK II Prime release. -# Copyright (c) 2007 - 2016, Intel Corporation. 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] - PLATFORM_NAME = Fat - PLATFORM_GUID = 25b55dbc-9d0b-4a32-80da-46e1273d622c - PLATFORM_VERSION = 0.3 - DSC_SPECIFICATION = 0x00010005 - SUPPORTED_ARCHITECTURES = IA32|X64|IPF|EBC|ARM|AARCH64 - OUTPUT_DIRECTORY = Build/Fat - BUILD_TARGETS = DEBUG|RELEASE|NOOPT - SKUID_IDENTIFIER = DEFAULT - -[BuildOptions] - GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG - INTEL:RELEASE_*_*_CC_FLAGS = /D MDEPKG_NDEBUG - MSFT:RELEASE_*_*_CC_FLAGS = /D MDEPKG_NDEBUG - RVCT:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG - *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES - -[LibraryClasses] - # - # Entry Point Libraries - # - UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf - # - # Common Libraries - # - BaseLib|MdePkg/Library/BaseLib/BaseLib.inf - BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf - UefiLib|MdePkg/Library/UefiLib/UefiLib.inf - PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf - UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf - UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf - DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf - DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf - -[LibraryClasses.common.PEIM] - PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf - PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf - PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf - HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf - MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf - -[LibraryClasses.ARM, LibraryClasses.AARCH64] - NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf - NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf - -################################################################################################### -# -# Components Section - list of the modules and components that will be processed by compilation -# tools and the EDK II tools to generate PE32/PE32+/Coff image files. -# -# Note: The EDK II DSC file is not used to specify how compiled binary images get placed -# into firmware volume images. This section is just a list of modules to compile from -# source into UEFI-compliant binaries. -# It is the FDF file that contains information on combining binary files into firmware -# volume images, whose concept is beyond UEFI and is described in PI specification. -# Binary modules do not need to be listed in this section, as they should be -# specified in the FDF file. For example: Shell binary (Shell_Full.efi), FAT binary (Fat.efi), -# Logo (Logo.bmp), and etc. -# There may also be modules listed in this section that are not required in the FDF file, -# When a module listed here is excluded from FDF file, then UEFI-compliant binary will be -# generated for it, but the binary will not be put into any firmware volume. -# -################################################################################################### - -[Components] - FatPkg/FatPei/FatPei.inf - FatPkg/EnhancedFatDxe/Fat.inf diff --git a/FatPkg/FatPkg.uni b/FatPkg/FatPkg.uni deleted file mode 100644 index 262fe9a851..0000000000 --- a/FatPkg/FatPkg.uni +++ /dev/null @@ -1,26 +0,0 @@ -// /** @file -// Module implementations for FAT file system, FAT 32 UEFI Driver and FAT PEI Module -// -// FAT Package -// -// FAT 32 Driver -// -// Copyright (c) 2007 - 2014, Intel Corporation. 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. -// -// **/ - - -#string STR_PACKAGE_ABSTRACT #language en-US "Module implementations for FAT file system, FAT 32 UEFI Driver and FAT PEI Module" - -#string STR_PACKAGE_DESCRIPTION #language en-US "This Package contains module implementation about FAT file system, FAT 32 UEFI Driver and FAT PEI Module." - - - diff --git a/FatPkg/FatPkgExtra.uni b/FatPkg/FatPkgExtra.uni deleted file mode 100644 index 373ddb49a5..0000000000 --- a/FatPkg/FatPkgExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// Fat Package Localized Strings and Content. -// -// Copyright (c) 2013, Intel Corporation. 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. -// -// **/ - -#string STR_PROPERTIES_PACKAGE_NAME -#language en-US -"Fat package" - - diff --git a/FatPkg/License.txt b/FatPkg/License.txt deleted file mode 100644 index be68999be6..0000000000 --- a/FatPkg/License.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2012, Intel Corporation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -- cgit v1.2.3