From 10ad1cf2c69bbe7ad9a0eb85c9d29bab478a2655 Mon Sep 17 00:00:00 2001 From: Pedro Falcato Date: Fri, 17 Feb 2023 19:46:29 +0000 Subject: [PATCH] Ext4Pkg: Move unicode collation initialization to Start() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There have been reports[1] of failures to boot due to unicode collation protocols not being available at Ext4Dxe load time. Therefore, attempt to initialize unicode collation at Start() time, like done previously in FatPkg/EnhancedFatDxe. By doing so, we move collation initialization to BDS, where the module responsible for protocol installation should have already been loaded and ran. [1]: https://edk2.groups.io/g/devel/message/100312 Cc: Ard Biesheuvel Cc: Marvin Häuser Fixes: d9ceedca6c8f ("Ext4Pkg: Add Ext4Dxe driver.") Signed-off-by: Pedro Falcato Acked-by: Ard Biesheuvel Reviewed-by: Marvin Häuser --- Ext4Pkg/Ext4Dxe/Collation.c | 24 +++++++++++++++++- Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 49 ++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/Ext4Pkg/Ext4Dxe/Collation.c b/Ext4Pkg/Ext4Dxe/Collation.c index 91d172b1cb..82390ae8a9 100644 --- a/Ext4Pkg/Ext4Dxe/Collation.c +++ b/Ext4Pkg/Ext4Dxe/Collation.c @@ -1,7 +1,7 @@ /** @file Unicode collation routines - Copyright (c) 2021 Pedro Falcato All rights reserved. + Copyright (c) 2021 - 2023 Pedro Falcato All rights reserved. Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -9,6 +9,7 @@ #include +#include #include #include #include @@ -23,6 +24,21 @@ STATIC EFI_UNICODE_COLLATION_PROTOCOL *gUnicodeCollationInterface = NULL; * PS: Maybe all this code could be put in a library? It looks heavily shareable. **/ +/** + Check if unicode collation is initialized + + @retval TRUE if Ext4InitialiseUnicodeCollation() was already called successfully + @retval FALSE if Ext4InitialiseUnicodeCollation() was not yet called successfully +**/ +STATIC +BOOLEAN +Ext4IsCollationInitialized ( + VOID + ) +{ + return gUnicodeCollationInterface != NULL; +} + /** Worker function to initialize Unicode Collation support. @@ -127,6 +143,11 @@ Ext4InitialiseUnicodeCollation ( Status = EFI_UNSUPPORTED; + // If already done, just return success. + if (Ext4IsCollationInitialized ()) { + return EFI_SUCCESS; + } + // // First try to use RFC 4646 Unicode Collation 2 Protocol. // @@ -169,5 +190,6 @@ Ext4StrCmpInsensitive ( IN CHAR16 *Str2 ) { + ASSERT (gUnicodeCollationInterface != NULL); return gUnicodeCollationInterface->StriColl (gUnicodeCollationInterface, Str1, Str2); } diff --git a/Ext4Pkg/Ext4Dxe/Ext4Dxe.c b/Ext4Pkg/Ext4Dxe/Ext4Dxe.c index 2a4f5a7bd0..064286791d 100644 --- a/Ext4Pkg/Ext4Dxe/Ext4Dxe.c +++ b/Ext4Pkg/Ext4Dxe/Ext4Dxe.c @@ -1,7 +1,7 @@ /** @file Driver entry point - Copyright (c) 2021 Pedro Falcato All rights reserved. + Copyright (c) 2021 - 2023 Pedro Falcato All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -513,26 +513,18 @@ Ext4EntryPoint ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - - Status = EfiLibInstallAllDriverProtocols2 ( - ImageHandle, - SystemTable, - &gExt4BindingProtocol, - ImageHandle, - &gExt4ComponentName, - &gExt4ComponentName2, - NULL, - NULL, - NULL, - NULL - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - return Ext4InitialiseUnicodeCollation (ImageHandle); + return EfiLibInstallAllDriverProtocols2 ( + ImageHandle, + SystemTable, + &gExt4BindingProtocol, + ImageHandle, + &gExt4ComponentName, + &gExt4ComponentName2, + NULL, + NULL, + NULL, + NULL + ); } /** @@ -761,6 +753,17 @@ Ext4Bind ( BlockIo = NULL; DiskIo = NULL; + // Note: We initialize collation here since this is called in BDS, when we are likely + // to have the Unicode Collation protocols available. + Status = Ext4InitialiseUnicodeCollation (BindingProtocol->ImageHandle); + if (EFI_ERROR (Status)) { + // Lets throw a loud error into the log + // It is very unlikely something like this may fire out of the blue. Chances are either + // the platform configuration is wrong, or we are. + DEBUG ((DEBUG_ERROR, "[ext4] Error: Unicode Collation not available - failure to Start() - error %r\n", Status)); + goto Error; + } + Status = gBS->OpenProtocol ( ControllerHandle, &gEfiDiskIoProtocolGuid, @@ -774,7 +777,7 @@ Ext4Bind ( goto Error; } - DEBUG ((DEBUG_INFO, "[Ext4] Controller supports DISK_IO\n")); + DEBUG ((DEBUG_INFO, "[ext4] Controller supports DISK_IO\n")); Status = gBS->OpenProtocol ( ControllerHandle, @@ -787,7 +790,7 @@ Ext4Bind ( // It's okay to not support DISK_IO2 if (DiskIo2 != NULL) { - DEBUG ((DEBUG_INFO, "[Ext4] Controller supports DISK_IO2\n")); + DEBUG ((DEBUG_INFO, "[ext4] Controller supports DISK_IO2\n")); } Status = gBS->OpenProtocol (