The previous change in ShellLib: "commit
3d29f8c5e361525a0d2accfa7f5bb0a7210b8927
* ShellPkg/ShellLib: Constructor doesn't depend on ShellParameters"
resolved the issue when loading dynamic command driver from Shell
environment.
But when dynamic command driver is built into FV and started during
boot, the driver still fails to start because Shell protocol doesn't
exist at that time.
The patch changes ShellLib to:
1. Do not look for Shell and ShellParameters protocol when they are
non-NULL in ShellLibConstructorWorker();
The two protocols are assumed to be set by DynamicCommand.Handler.
When ShellInitialize() is called in DynamicCommand.Handler, this
change can prevent the two protocols to be changed to NULL by
the locating logic.
2. Do not reset the Shell and ShellParameters protocol to NULL in
ShellLibDestructor() when CloseProtocol() fails;
Dynamic command driver needs to set the PcdShellLibAutoInitialize
to FALSE in order to skip the constructor.
Current logic calls ShellLibDestructor() when the PCD is FALSE when
ShellInitialize() is called. The change prevent the two protocols
to be changed to NULL.
The two changes don't impact existing usage case so they are backward
compatible.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Jaben Carsey <jaben.carsey@intel.com>
---
ShellPkg/Library/UefiShellLib/UefiShellLib.c | 89 ++++++++++++++++------------
1 file changed, 52 insertions(+), 37 deletions(-)
diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
index 00f58ca0c1..7f6389f655 100644
--- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c
+++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
@@ -179,40 +179,45 @@ ShellLibConstructorWorker (
{
EFI_STATUS Status;
- //
- // UEFI 2.0 shell interfaces (used preferentially)
- //
- Status = gBS->OpenProtocol(
- ImageHandle,
- &gEfiShellProtocolGuid,
- (VOID **)&gEfiShellProtocol,
- ImageHandle,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR(Status)) {
+ if (gEfiShellProtocol == NULL) {
//
- // Search for the shell protocol
+ // UEFI 2.0 shell interfaces (used preferentially)
//
- Status = gBS->LocateProtocol(
+ Status = gBS->OpenProtocol (
+ ImageHandle,
&gEfiShellProtocolGuid,
+ (VOID **)&gEfiShellProtocol,
+ ImageHandle,
NULL,
- (VOID **)&gEfiShellProtocol
- );
- if (EFI_ERROR(Status)) {
- gEfiShellProtocol = NULL;
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ //
+ // Search for the shell protocol
+ //
+ Status = gBS->LocateProtocol (
+ &gEfiShellProtocolGuid,
+ NULL,
+ (VOID **)&gEfiShellProtocol
+ );
+ if (EFI_ERROR (Status)) {
+ gEfiShellProtocol = NULL;
+ }
}
}
- Status = gBS->OpenProtocol(
- ImageHandle,
- &gEfiShellParametersProtocolGuid,
- (VOID **)&gEfiShellParametersProtocol,
- ImageHandle,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR(Status)) {
- gEfiShellParametersProtocol = NULL;
+
+ if (gEfiShellParametersProtocol == NULL) {
+ Status = gBS->OpenProtocol (
+ ImageHandle,
+ &gEfiShellParametersProtocolGuid,
+ (VOID **)&gEfiShellParametersProtocol,
+ ImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ gEfiShellParametersProtocol = NULL;
+ }
}
if (gEfiShellProtocol == NULL) {
@@ -324,35 +329,45 @@ ShellLibDestructor (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
+ EFI_STATUS Status;
+
if (mEfiShellEnvironment2 != NULL) {
- gBS->CloseProtocol(mEfiShellEnvironment2Handle==NULL?ImageHandle:mEfiShellEnvironment2Handle,
+ Status = gBS->CloseProtocol(mEfiShellEnvironment2Handle==NULL?ImageHandle:mEfiShellEnvironment2Handle,
&gEfiShellEnvironment2Guid,
ImageHandle,
NULL);
- mEfiShellEnvironment2 = NULL;
+ if (!EFI_ERROR (Status)) {
+ mEfiShellEnvironment2 = NULL;
+ mEfiShellEnvironment2Handle = NULL;
+ }
}
if (mEfiShellInterface != NULL) {
- gBS->CloseProtocol(ImageHandle,
+ Status = gBS->CloseProtocol(ImageHandle,
&gEfiShellInterfaceGuid,
ImageHandle,
NULL);
- mEfiShellInterface = NULL;
+ if (!EFI_ERROR (Status)) {
+ mEfiShellInterface = NULL;
+ }
}
if (gEfiShellProtocol != NULL) {
- gBS->CloseProtocol(ImageHandle,
+ Status = gBS->CloseProtocol(ImageHandle,
&gEfiShellProtocolGuid,
ImageHandle,
NULL);
- gEfiShellProtocol = NULL;
+ if (!EFI_ERROR (Status)) {
+ gEfiShellProtocol = NULL;
+ }
}
if (gEfiShellParametersProtocol != NULL) {
- gBS->CloseProtocol(ImageHandle,
+ Status = gBS->CloseProtocol(ImageHandle,
&gEfiShellParametersProtocolGuid,
ImageHandle,
NULL);
- gEfiShellParametersProtocol = NULL;
+ if (!EFI_ERROR (Status)) {
+ gEfiShellParametersProtocol = NULL;
+ }
}
- mEfiShellEnvironment2Handle = NULL;
return (EFI_SUCCESS);
}
--
2.15.0.gvfs.1.preview.4
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2024 Red Hat, Inc.