From: "Pedro Falcato" <pedro.falcato@gmail.com>
To: devel@edk2.groups.io
Cc: "Pedro Falcato" <pedro.falcato@gmail.com>,
"Ard Biesheuvel" <ardb@kernel.org>,
"Marvin Häuser" <mhaeuser@posteo.de>
Subject: [PATCH 1/1] Ext4Pkg: Move unicode collation initialization to Start()
Date: Fri, 17 Feb 2023 20:14:27 +0000 [thread overview]
Message-ID: <20230217201427.139581-1-pedro.falcato@gmail.com> (raw)
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 <ardb@kernel.org>
Cc: Marvin Häuser <mhaeuser@posteo.de>
Fixes: d9ceedca6c8f ("Ext4Pkg: Add Ext4Dxe driver.")
Signed-off-by: Pedro Falcato <pedro.falcato@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
next reply other threads:[~2023-02-17 20:14 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-17 20:14 Pedro Falcato [this message]
2023-02-18 12:30 ` [PATCH 1/1] Ext4Pkg: Move unicode collation initialization to Start() Marvin Häuser
2023-02-18 15:14 ` Pedro Falcato
2023-02-18 17:04 ` Marvin Häuser
2023-02-20 7:52 ` Ard Biesheuvel
2023-02-20 8:00 ` Marvin Häuser
2023-02-21 19:25 ` Pedro Falcato
2023-02-21 19:37 ` Marvin Häuser
2023-02-24 0:34 ` Pedro Falcato
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230217201427.139581-1-pedro.falcato@gmail.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox