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 <a...@kernel.org> Cc: Marvin Häuser <mhaeu...@posteo.de> Fixes: d9ceedca6c8f ("Ext4Pkg: Add Ext4Dxe driver.") Signed-off-by: Pedro Falcato <pedro.falc...@gmail.com> --- RFC-ish patch that implements one of the possibilities discussed in [1]. Please test and give feedback. Odd that this issue was never caught in any other platform. Do the RPi platforms have something funky going on? Features/Ext4Pkg/Ext4Dxe/Collation.c | 18 +++++++++- Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 51 +++++++++++++++------------- Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 11 ++++++ 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/Features/Ext4Pkg/Ext4Dxe/Collation.c b/Features/Ext4Pkg/Ext4Dxe/Collation.c index 91d172b1cb89..65c34c33ea93 100644 --- a/Features/Ext4Pkg/Ext4Dxe/Collation.c +++ b/Features/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 <Uefi.h> +#include <Library/DebugLib.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/MemoryAllocationLib.h> @@ -169,5 +170,20 @@ Ext4StrCmpInsensitive ( IN CHAR16 *Str2 ) { + ASSERT (gUnicodeCollationInterface != NULL); return gUnicodeCollationInterface->StriColl (gUnicodeCollationInterface, Str1, Str2); } + +/** + Check if unicode collation is initialized + + @retval TRUE if Ext4InitialiseUnicodeCollation() was already called successfully + @retval FALSE if Ext4InitialiseUnicodeCollation() was not yet called successfully +**/ +BOOLEAN +Ext4IsCollationInitialized ( + VOID + ) +{ + return gUnicodeCollationInterface != NULL; +} diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c index 2a4f5a7bd0ef..de0d633febfb 100644 --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c +++ b/Features/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,19 @@ 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. + if (!Ext4IsCollationInitialized ()) { + 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 +779,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 +792,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 ( diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h index 786e20f49fe1..93f6cf01fe06 100644 --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h @@ -947,6 +947,17 @@ Ext4InitialiseUnicodeCollation ( EFI_HANDLE DriverHandle ); +/** + Check if unicode collation is initialized + + @retval TRUE if Ext4InitialiseUnicodeCollation() was already called successfully + @retval FALSE if Ext4InitialiseUnicodeCollation() was not yet called successfully +**/ +BOOLEAN +Ext4IsCollationInitialized ( + VOID + ); + /** Does a case-insensitive string comparison. Refer to EFI_UNICODE_COLLATION_PROTOCOL's StriColl for more details. -- 2.39.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100331): https://edk2.groups.io/g/devel/message/100331 Mute This Topic: https://groups.io/mt/97037199/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-