summaryrefslogtreecommitdiffstats
path: root/ShellPkg
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2017-11-28 19:38:39 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2017-11-29 10:31:54 +0800
commit68b07ebae5d7c4124ff7b2a8d35e2f8b6cda18b8 (patch)
tree38b06fefffc3f8d73b540061fb9efe0ec70ffc1a /ShellPkg
parent0c83ac57f5c236a70766673ada65fff6b78596d6 (diff)
downloadedk2-68b07ebae5d7c4124ff7b2a8d35e2f8b6cda18b8.tar.gz
edk2-68b07ebae5d7c4124ff7b2a8d35e2f8b6cda18b8.tar.bz2
edk2-68b07ebae5d7c4124ff7b2a8d35e2f8b6cda18b8.zip
ShellPkg/ShellLib: Fix dynamic command fails to start during boot
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> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Diffstat (limited to 'ShellPkg')
-rw-r--r--ShellPkg/Library/UefiShellLib/UefiShellLib.c89
1 files 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);
}